Pregunta

Quiero usar el lugar contenedor de parámetros - por ejemplo, ? 1 - con las tarjetas salvajes%. es decir, algo así como: "? u.name LIKE% 1%" (aunque esto genera un error). Los documentos tienen los siguientes dos ejemplos: 1.

// 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

¿Fue útil?

Solución

Cuando los parámetros a consultas vinculantes, DQL más o menos funciona exactamente como DOP (que es lo que utiliza Doctrine2 bajo el capó).

Así que cuando se utiliza la instrucción LIKE, golosinas PDO la palabra clave y los comodines% como un único token. No se puede agregar los comodines al lado del marcador de posición. Debe agregar a la cadena cuando se enlaza los parametros.

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

comentario en el manual de PHP. Espero que ayude.

Otros consejos

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

Se 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 les escaparon correctamente, un atacante podría construir consultas complejas arbirtarily que pueden causar un ataque de denegación de servicio. También, podría ser posible que el atacante obtener resultados de búsqueda que no se supone que debe llegar. Una descripción más detallada de los escenarios de ataque se puede encontrar aquí: https://stackoverflow.com/a/7893670/623685

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top