2012-10-03 25 views
27

tengo este código de consulta:Doctrina 2 de consultas con LIKE

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

El problema es: incluso si existen coincidencias, no hallando por esta consulta. He utilizado este código para ver completo sql:

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

Y lo que tengo:

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

(última parte de la consulta) Dime por favor, qué hay que cambiar?

Respuesta

68

se le olvidó la % señales alrededor de la palabra:

->setParameter('word', '%'.$word.'%') 
+0

Gracias. Entonces stu error. – AlOpal19

+0

¿Por qué la doctrina hace esto automáticamente cuando paso un parámetro a la función similar? –

+0

Es seguro ¿verdad? Al agregar directamente la cadena? – baquiax

1

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

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

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

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. Puede encontrar una descripción más detallada de los escenarios de ataque aquí: https://stackoverflow.com/a/7893670/623685

Cuestiones relacionadas