2010-09-20 16 views
24

Chcę użyć właściciela miejsca parametru - np. ? 1 - z% dzikich kart. to jest coś w stylu: "u.name LIKE%? 1%" (chociaż to powoduje błąd). Docs mają następujące dwa przykłady: 1.doctrine2 dql, użyj setParameter z% wildcard podczas porównywania

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

nie podoba mi się to, ponieważ nie ma ochrony przed wstrzyknięciem kodu.

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

nie podoba mi się to, bo trzeba szukać wewnątrz względem właściwości obiektu - to znaczy, muszę dzikie karty na obu stronach.

Odpowiedz

64

Po powiązaniu parametrów z zapytaniami, DQL działa właściwie tak samo jak PDO (co właśnie używa Doctrine2 pod maską).

Dlatego przy korzystaniu z instrukcji LIKE, PDO traktuje słowo kluczowe i% wieloznaczne jako pojedynczy token. Nie można dodawać symboli wieloznacznych obok symbolu zastępczego. Musisz je dołączyć do ciągu, gdy wiążisz parametry.

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

Zobacz ten comment w podręczniku PHP. Nadzieja, która pomaga.

+0

doskonała odpowiedź, właśnie tego, czego szukałem, dziękuję – waigani

+1

czy mógłbyś głosować w górę lub zaakceptować to jako odpowiedziano? –

+1

co się stanie, jeśli '$ value = '\\''? – seyed

2

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

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

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

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