2010-09-20 13 views
24

Quiero utilizar el marcador de posición del parámetro, p. Ej. ? 1 - con el% de comodines. es decir, algo así como: "u.name LIKE%? 1%" (aunque esto arroja un error). Los documentos tienen los siguientes dos ejemplos: 1.doctrine2 dql, use setParameter con% comodín al hacer una comparación similar

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

no me gusta esto como no hay protección contra la inyección de código.

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')); 

no me gusta esto porque tengo que buscar términos dentro de las propiedades del objeto - es decir, que necesito los comodines de cualquier lado.

Respuesta

64

Cuando se vinculan los parámetros a las consultas, DQL prácticamente funciona exactamente como PDO (que es lo que Doctrine2 usa debajo del capó).

Por lo tanto, cuando se usa la instrucción LIKE, PDO trata tanto la palabra clave como el% de comodines como un solo token. No puede agregar los comodines al lado del marcador de posición. Debes agregarlos a la cadena cuando unes los params.

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

Consulte este comment en el manual de PHP. Espero que ayude.

+0

respuesta perfecta, justo lo que estaba buscando, gracias – waigani

+1

¿te importaría votar o aceptarlo como respondido? –

+1

¿Qué pasa si '$ value = '\\''? – seyed

2

La respuesta seleccionada es mal. Funciona, pero no es secure.

Debe escapar el término que se inserta entre los signos porcentuales:

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

El signo de porcentaje '%' y el símbolo de subrayado '_' se interpretan como comodines por LIKE. Si no se han escapado correctamente, un atacante puede generar consultas complejas que pueden causar un ataque de denegación de servicio. Además, es posible que el atacante obtenga los resultados de búsqueda que se supone que no debe obtener. Una descripción más detallada de los escenarios de ataque se puede encontrar aquí: https://stackoverflow.com/a/7893670/623685

Cuestiones relacionadas