Почему PDO не позволяет использовать несколько заполнителей с одинаковыми именами?

Я использую PHP и MySQL с PDO. Иногда мне нужно подготовить оператор с одной переменной (заполнителем), использованной более одного раза в этом запросе.

Пример:

SELECT * FROM messages WHERE from_id = :user OR to_id = :user

Однако, если я попытаюсь подготовить это утверждение, у меня будет ошибка, поэтому мне нужно сделать это следующим образом:

SELECT * FROM messages WHERE from_id = :user1 OR to_id = :user2

Чтобы вызвать это утверждение, мне нужно иметь такой массив:

array('user1'=>$user_id, 'user2'=>$user_id);

Это выглядит так глупо для меня! Почему MySQL (PDO?) Не позволяет мне использовать один заполнитель более одного раза и заставляет меня использовать дополнительные переменные, которые требуют большего контроля ?!

Это может быть легко обработано, если запрос относительно прост (как я писал выше), но теперь я построил запрос с 5 (!!!) использованием одной переменной. Каждый раз, когда я добавляю заполнитель, мне нужно проверять код во многих местах, чтобы все было в порядке.

Есть ли какие-либо настройки или настройки, чтобы обойти это?

4

Решение

Есть ли какие-либо настройки или настройки, чтобы обойти это?

Да, есть. Вы можете включить режим эмуляции и иметь возможность использовать один и тот же заполнитель несколько раз.

Таким образом, описанное поведение наблюдается только тогда, когда эмуляция выключена. Я не очень понимаю, почему это так, но вот объяснение от Вез Фарлонг (автор PDO):

Изменение было сделано по двум причинам; Прежде всего, если вы повторно используете одну и ту же переменную в привязке, возможно использование сбоя при использовании некоторых драйверов. Невозможно гарантировать, что вы поступите правильно, и наличие способа вызвать сбой иногда может использоваться в качестве вектора атаки для эксплойта безопасности.

Вторая причина — это портативность. Некоторые драйверы внутренне выполняют эту проверку и выдают ошибку. Если вы кодируете против драйверов, которые не применяют это, то ваш код не будет работать с теми, которые этого не делают.

http://paul-m-jones.com/archives/243#comment-740

9

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]