dql doctrine2, utilisez setParameter avec % wildcard lors d'une comparaison similaire

je veux utiliser le paramètre place holder-e.g. ?1-avec le % wild cards. c'est-à-dire quelque chose comme: "U. nom comme %?1%" (bien que cela entraîne une erreur). Les documents ont les deux exemples suivants:: 1.

// Example - $qb->expr()->like('u.firstname', $qb->expr()->literal('Gui%'))
public function like($x, $y); // Returns ExprComparison instance

je n'aime pas ce qu'il n'y a pas de protection contre l'injection de code.

2.

// $qb instanceof QueryBuilder

// example8: QueryBuilder port of: "SELECT u FROM User u WHERE u.id = ?1 OR u.nickname LIKE ?2 ORDER BY u.surname DESC" using QueryBuilder helper methods
$qb->select(array('u')) // string 'u' is converted to array internally
   ->from('User', 'u')
   ->where($qb->expr()->orx(
       $qb->expr()->eq('u.id', '?1'),
       $qb->expr()->like('u.nickname', '?2')
   ))
   ->orderBy('u.surname', 'ASC'));

je n'aime pas cela parce que j'ai besoin de rechercher des termes dans les propriétés de l'objet, j'ai besoin de la nature des cartes de chaque côté.

25
demandé sur MPelletier 2010-09-21 01:38:00

2 réponses

quand on lie les paramètres aux requêtes, DQL fonctionne à peu près exactement comme PDO (ce qui est ce que Doctrine2 utilise sous le capot).

ainsi, lors de l'utilisation de la déclaration LIKE, PDO traite à la fois le mot-clé et le % wildcards comme un seul token. Vous ne pouvez pas ajouter les caractères génériques à côté du paramètre. Vous devez les ajouter à la chaîne lorsque vous liez la params.

$qb->expr()->like('u.nickname', '?2')
$qb->getQuery()->setParameter(2, '%' . $value . '%');

Voir le commentaire dans le manuel PHP. Espérons que cela aide.

66
répondu Bryan M. 2010-09-21 15:42:59

la réponse choisie est mauvais. Cela fonctionne, mais il n'est pas sécurisé.

vous devriez éviter le terme que vous insérez entre les signes de pourcentage:

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

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

2
répondu robert 2017-12-31 10:54:39