2013-07-18 73 views
6

我使用doctrine2與Symfony2中,我試圖執行一個簡單的選擇查詢:Doctrine2 [語法錯誤]錯誤:預期文字,得到了「 - 」

我想運行:

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

這PHP代碼:

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

給出了以下異常:

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

這是實體內的屬性定義:

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

如果我使用in參數中唯一的正數,它會工作。例外僅在負數時發生。

是什麼導致此異常?

+0

破折號是不允許,因爲他們可能是一個SQL注入攻擊的一部分。要麼擺脫破折號,要麼將負數分解爲參數。 –

回答

12

應該做的伎倆:

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

我想知道爲什麼你必須設置一個參數,並在文檔中發現它是爲了防止SQL注入。你可以在這裏找到doc(http://symfony.com/doc/current/book/doctrine.html#querying-for-objects-with-dql) – NewRehtse

相關問題