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)
トークンが置き換えられていない同じ問題が発生しました。
アドバイスをいただきありがとうございます。プレースホルダ文字列を修正しました。しかし、元の問題は依然として残っています。 –
あなたは正しいと分かった。プレースホルダ文字列を修正することで問題は解決しました。私の元の質問は誤っていました。 DoctrineはSQLを正しく生成していました。しかし、PDOレベルでトークンの置換が行われていたため、Doctrineは最終的なSQL文字列を吐き出しませんでした。 –