私はクエリのためにこのコードを持っています:
$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 )
(クエリの最後の部分)変更点を教えてください。
Wordの周りの%
サインを忘れました:
->setParameter('Word', '%'.$Word.'%')
選択された答えはwrongです。動作しますが、secureではありません。
パーセント記号の間に挿入する用語をエスケープする必要があります。
->setParameter('Word', '%'.addcslashes($Word, '%_').'%')
パーセント記号「%」と下線記号「_」は、LIKE
によってワイルドカードとして解釈されます。それらが適切にエスケープされない場合、攻撃者はサービス拒否攻撃を引き起こす可能性のある複雑なクエリを作成する可能性があります。また、攻撃者が取得するはずのない検索結果を取得することも可能です。攻撃シナリオの詳細な説明は、ここにあります: https://stackoverflow.com/a/7893670/623685