Doctrine2查询构建器不引用该字符串

Vla*_*ban 8 php doctrine-orm

以下是我的代码摘录

$column_name = "ipAddress";
$qb = EntityManagerContainer::get()->createQueryBuilder();
$qb->select('u')
    ->from(BlacklistedIps::class, 'u');

if($search_term)
{   
    $clause = $qb->expr()->like("u.".$column_name, "'%$search_term%'");
    $qb->where($clause);
}

$query = $qb->getQuery();

$result = $query->getResult();
Run Code Online (Sandbox Code Playgroud)

它工作得非常好(尽管它对SQL注入是开放的,但这是另一个故事).

我的问题是需要"'%$search_term%'".如果没有这组额外的单引号,查询将失败

未捕获的异常'Doctrine\ORM\Query\QueryException',带有消息'SELECT u FROM Orm\Entity\BlacklistedIps u WHERE u.ipAddress LIKE%123%ORDER BY u.reason desc'in***

我并不完全确定我是以正确的方式做到这一点.因为如果我这样做,那么Doc​​trine2中就会出现一个错误(mssing功能?).当我做

$qb->expr()->like("u.".$column_name, "%$search_term%");
Run Code Online (Sandbox Code Playgroud)

然后我绝对肯定我正在处理一个字符串.当整数或布尔值或浮点数等相互比较时,使用不同的运算符,但绝对不喜欢.LIKE仅在处理字符串时使用,因此在DQL中引用字符串正是唯一可能的 - > like方法用例.

请告诉我,我做错了什么.我一直只使用Doctrine2几天,并对它感到着迷.但是不喜欢字符串没有自动引用给我.

scr*_*ppy 11

它看起来像你如何使用querybuilder的问题.你应该这样做:

$qb ->where($qb->expr()->orX($qb->expr()->like('u.'.$column_name, $qb->expr()->literal("%$searchTerm%"))))  
Run Code Online (Sandbox Code Playgroud)

要么

$qb->where($qb->expr()->like("u.".$column_name, array("%$searchTerm%")));  
Run Code Online (Sandbox Code Playgroud)

另外要避免sql注入,一个好的做法是不在任何querybuilder方法中传递用户输入,使用setParameter?或者:相反.

$qb->where('u.'.$column_name.' LIKE :searchTerm')
$qb->setParameter('searchTerm', '%'.$searchTerm.'%')  
Run Code Online (Sandbox Code Playgroud)

或类似的东西:

$qb->expr()->like('u.'.$column_name, '?1')
$qb->getQuery()->setParameter(1, '%' . $searchTerm . '%');
Run Code Online (Sandbox Code Playgroud)