2013-07-18 30 views
6

私はSymfony2のでdoctrine2使用していると私は、単純な選択クエリを実行しようとしています: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

ダッシュは許可されていません。ダッシュを取り除くか、負の数をパラメータに分解します。 –

答えて

12

は、トリックを行う必要があります:彼らはSQLインジェクション攻撃の一部とすることができるよう

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

なぜ私はあなたがパラメータを設定しなければならないのだろうと私はそれがSQLインジェクションを防止することが判明したドキュメントで疑問に思っていた。 doc [here](http://symfony.com/doc/current/book/doctrine.html#querying-for-objects-with-dql)を参照してください。 – NewRehtse