以下是我的代码摘录
$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***
我并不完全确定我是以正确的方式做到这一点.因为如果我这样做,那么Doctrine2中就会出现一个错误(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)
| 归档时间: |
|
| 查看次数: |
6086 次 |
| 最近记录: |