2012-10-03 21 views
27

Mam ten kod dla zapytania:Doctrine 2 Query z 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(); 

Problem polega na tym: nawet jeśli istnieją mecze, nie znaleźć tego zapytania. Użyłem tego kodu, aby zobaczyć pełną sql:

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

I co mam:

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

(ostatnia część zapytania) Powiedz mi proszę, co zmienić?

Odpowiedz

68

zapomniałeś % oznaki całym słowem:

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

Dziękuję. Tak więc błąd stu. – AlOpal19

+0

dlaczego doktryna robi to automatycznie, gdy przekazuję parametr do podobnej funkcji? –

+0

To bezpieczne, zrób to? Dodając bezpośrednio ciąg znaków? – baquiax

1

Wybrana odpowiedź brzmi źle. Działa, ale nie jest to bezpieczne.

Należy uciec termin że włożeniu pomiędzy znakami wygranych:

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

Procent znak „%” oraz symbol podkreślenia „_” są interpretowane jako symboli wieloznacznych przez LIKE. Jeśli nie zostaną poprawnie usunięte, atakujący może skonstruować skomplikowane zapytania, które mogą spowodować atak typu "odmowa usługi". Możliwe, że osoba atakująca może uzyskać wyniki wyszukiwania, których nie powinien uzyskać. Bardziej szczegółowy opis scenariuszy ataków można znaleźć tutaj: https://stackoverflow.com/a/7893670/623685