2012-10-03 181 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