57

私はクエリ用にこのコードを持っています:

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

(クエリの最後の部分)何を変更するか教えてください。

4

2 に答える 2

115

%あなたは単語の周りの標識を忘れました:

->setParameter('word', '%'.$word.'%')
于 2012-10-03T10:15:18.930 に答える
29

以下は、入力データをさらにサニタイズするために実行できるいくつかの追加手順です。

パーセンテージ記号の間に挿入する用語はエスケープする必要があります。

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

パーセント記号'%'および記号アンダースコア'_'は、によってワイルドカードとして解釈されLIKEます。それらが適切にエスケープされていない場合、攻撃者はサービス拒否攻撃を引き起こす可能性のある任意の複雑なクエリを作成する可能性があります。また、攻撃者が取得するはずのない検索結果を取得する可能性もあります。攻撃シナリオの詳細については、https ://stackoverflow.com/a/7893670/623685をご覧ください。

于 2017-12-31T10:49:52.710 に答える