У меня есть запрос 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)
У меня возникает та же проблема, что и токены, которые не заменяются.
Спасибо за совет. Я исправил строку-заполнитель. Однако первоначальная проблема все еще остается. –
Оказывается, вы были верны. Фиксирование строки-заполнителя решило проблему. Мой первоначальный вопрос был ошибочным. Doctrine правильно генерировал SQL. Тем не менее, замена токена происходила на уровне PDO, поэтому Doctrine не собиралась выплевывать окончательную строку SQL. –