2009-07-07 22 views
4

私は準備文を使ってDoctrine_RawSql問合せを取得しました。ただし、SQLクエリが生成されたときに無視されるようです。しかし、トークンの値を除外すると、マッチしていないバインド変数の数について例外が発生します(少なくともサブ変数を入れようとしています)。Doctrineのraw SQL文とprepared statements

これらの値をインラインに含めると、SQLインジェクションを防ぐためにDoctrineは何もしません。ここで

は私のコードです:

SELECT * 
    FROM photographers p 
    WHERE p.city_id = ? 
    ORDER BY 
    CASE WHEN p.lname < "?%" THEN 1 ELSE 0 END, p.lname 
    ASC 

EDIT:$locationのプロパティが正しく設定されている

public function sortedPhotogsByLocation($location) 
{ 
    $q = new Doctrine_RawSql(); 
    $result = $q->select('{p.*}') 
      ->from('photographers p') 
      ->addComponent('p', 'Photographer') 
      ->where('p.city_id = ?', $location->id) 
      ->orderBy('CASE WHEN p.lname < "?%" THEN 1 ELSE 0 END, p.lname ASC', $location->photographer_sort) 
      ->execute(); 
    return $result; 
} 

これは、次のSQL出力を提供します。

->where('p.city_id = ?', 5) 

トークンが置き換えられていない同じ問題が発生しました。

答えて

3

私はDoctrine_RawSqlに完全に精通していませんが、プレースホルダは "?%"ではなく、それ自体でなければなりません。渡す変数に%を追加します。 example #6を見てください。

+0

アドバイスをいただきありがとうございます。プレースホルダ文字列を修正しました。しかし、元の問題は依然として残っています。 –

+1

あなたは正しいと分かった。プレースホルダ文字列を修正することで問題は解決しました。私の元の質問は誤っていました。 DoctrineはSQLを正しく生成していました。しかし、PDOレベルでトークンの置換が行われていたため、Doctrineは最終的なSQL文字列を吐き出しませんでした。 –