2012-10-03 149 views
27

我有这样的代码查询:学说2查询与LIKE

$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) 

(查询的最后一部分) 请告诉我什么改变?

回答

68

你忘了词周围的%迹象:

->setParameter('word', '%'.$word.'%') 
+0

谢谢。所以stu错误。 – AlOpal19

+0

为什么当我将参数传递给类似函数时,自动执行此操作? –

+0

这是安全的吗?通过直接附加字符串? – baquiax

1

选择的答案是错的。它的工作原理,但它不是安全

你应该逃避,你的百分比符号之间插入术语:

->setParameter('word', '%'.addcslashes($word, '%_').'%') 

百分号“%”和符号下划线“_”被LIKE解释为通配符。如果他们没有正确逃脱,攻击者可能会构造复杂的查询,从而导致拒绝服务攻击。另外,攻击者可能会得到他不应该得到的搜索结果。攻击场景的更详细的描述可以在这里找到:https://stackoverflow.com/a/7893670/623685