2013-07-18 17 views
6

Używam doctrine2 z Symfony2 i próbuję wykonać prostą kwerendę wybierającą:Doctrine2 [Syntax Error] Błąd: Oczekiwany dosłowne, dostał '-'

chcę uruchomić:

SELECT * FROM table WHERE status in (1, -1) 

Kod PHP

$queryBuilder = $this->_em->createQueryBuilder(); 
     $queryBuilder 
     ->select('n') 
     ->from('MyBundle:Table', 'n') 
     ->where('n.status IN (1, -1)'); 
return $queryBuilder->getQuery()->getResult(); 

daje następujące wyjątki:

[Syntax Error] line 0, col 96: Error: Expected Literal, got '-' 

Jest to definicja atrybutu w jednostce:

/** 
* @var integer 
* 
* @ORM\Column(name="status", type="integer", nullable=true) 
*/ 
private $status; 

Jeśli używam tylko pozytywne numery wewnątrz in argumentu, to będzie działać. Wyjątek występuje tylko w przypadku liczb ujemnych.

Co powoduje ten wyjątek?

+0

Kreski są niedozwolone, gdyż mogą one być częścią ataku SQL injection. Pozbądź się kreski lub podziel liczbę ujemną na parametr. –

Odpowiedz

12

powinno załatwić sprawę:

$queryBuilder = $this->_em->createQueryBuilder(); 
     $queryBuilder 
     ->select('n') 
     ->from('MyBundle:Table', 'n') 
     ->where('n.status IN (:status)') 
     ->setParameter('status', array(1, -1)); 
+3

Zastanawiam się, dlaczego musisz ustawić parametr iw dokumentacji stwierdziłem, że ma to zapobiec iniekcji SQL. Możesz znaleźć dokument [tutaj] (http://symfony.com/doc/current/book/doctrine.html#querying-for-objects-with-dql) – NewRehtse

Powiązane problemy