2009-07-07 2 views
4

У меня есть запрос Doctrine_RawSql с использованием подготовленных операторов. Тем не менее, они, похоже, игнорируются при генерации SQL-запроса. Но если я оставлю значения маркера, я получаю исключение из числа связанных переменных, которые не совпадают (так что это, по крайней мере, попытка подчинить их).Doctrine raw 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 

EDIT: Свойства на $location Создаются правильно. Если я жестко задаю параметры:

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

У меня возникает та же проблема, что и токены, которые не заменяются.

ответ

3

Я не совсем знаком с Doctrine_RawSql, но заполнитель должен быть сам по себе, а не «?%», Просто? и добавьте% к переменной, которую вы передаете. Взгляните на example #6.

+0

Спасибо за совет. Я исправил строку-заполнитель. Однако первоначальная проблема все еще остается. –

+1

Оказывается, вы были верны. Фиксирование строки-заполнителя решило проблему. Мой первоначальный вопрос был ошибочным. Doctrine правильно генерировал SQL. Тем не менее, замена токена происходила на уровне PDO, поэтому Doctrine не собиралась выплевывать окончательную строку SQL. –

Смежные вопросы