4

準備済みステートメントを使用した 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)

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

4

1 に答える 1

3

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

于 2009-07-07T17:11:00.237 に答える