我有这个查询代码:
$repository = $em->getRepository('AcmeCrawlerBundle:Trainings');
$query = $repository->createQueryBuilder('p')
->where('p.title LIKE :word')
->orWhere('p.discription LIKE :word')
->setParameter('word', $word)
->getQuery();
$trainings = $query->getResult();
问题是:即使存在匹配项,此查询也找不到它们。我使用此代码来查看完整的sql:
print_r(array(
'sql' => $query->getSQL(),
'parameters' => $query->getParameters(),
));
我得到了什么:
FROM Trainings t0_ WHERE t0_.title LIKE ? OR t0_.discription LIKE ? [parameters] => Array ( [word] => Spoken )
(查询的最后一部分) 请告诉我要改变什么?
答案 0 :(得分:83)
你忘了这个词周围的%
标志:
->setParameter('word', '%'.$word.'%')
答案 1 :(得分:9)
所选答案错误。它有效,但它不是安全。
您应该逃避在百分号之间插入的术语:
->setParameter('word', '%'.addcslashes($word, '%_').'%')
百分号'%'和符号下划线'_'被LIKE
解释为通配符。如果它们没有正确转义,攻击者可能会构建可能导致拒绝服务攻击的异常复杂的查询。此外,攻击者可能会获得他不应该获得的搜索结果。有关攻击情形的更详细说明,请访问:https://stackoverflow.com/a/7893670/623685