web-dev-qa-db-fra.com

Doctrine 2 Requête avec LIKE

J'ai ce code pour la requête:

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

Le problème est: même s'il existe des correspondances, elles ne sont pas trouvées par cette requête. J'ai utilisé ce code pour voir sql complet:

print_r(array(
        'sql'        => $query->getSQL(),
        'parameters' => $query->getParameters(),
        ));

Et ce que j'ai:

FROM Trainings t0_ WHERE t0_.title LIKE ? OR t0_.discription LIKE ? [parameters] => Array ( [Word] => Spoken ) 

(dernière partie de la requête) Dites-moi s'il vous plaît quoi changer?

37
AlOpal19

Vous avez oublié le % signes autour de la Parole:

->setParameter('Word', '%'.$Word.'%')
85

La réponse sélectionnée est fausse . Cela fonctionne, mais ce n'est pas sécurisé .

Vous devez échapper au terme que vous insérez entre les signes de pourcentage:

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

Le signe de pourcentage '%' et le symbole soulignement '_' sont interprétés comme des caractères génériques par LIKE. S'ils ne sont pas correctement échappés, un attaquant peut construire des requêtes complexes arbitrairement qui peuvent provoquer une attaque par déni de service. De plus, il pourrait être possible pour l'attaquant d'obtenir des résultats de recherche qu'il n'est pas censé obtenir. Une description plus détaillée des scénarios d'attaque peut être trouvée ici: https://stackoverflow.com/a/7893670/623685

13
robert