準備済みステートメントを使用した Doctrine_RawSql クエリがあります。ただし、SQL クエリが生成されると無視されるようです。しかし、トークン値を省略すると、バインドされた変数の数が一致しないという例外が発生します (したがって、少なくともそれらをサブしようとしています)。
これらの値をインラインで含めた場合、Doctrine は SQL インジェクションを防ぐために舞台裏で何かをしていますか?
これが私のコードです:
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 出力が提供されます。
SELECT *
FROM photographers p
WHERE p.city_id = ?
ORDER BY
CASE WHEN p.lname < "?%" THEN 1 ELSE 0 END, p.lname
ASC
編集: のプロパティ$location
が適切に設定されています。パラメータをハードコーディングした場合:
->where('p.city_id = ?', 5)
トークンが置き換えられないという同じ問題が発生します。