Я использую 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 (!!!) использованием одной переменной. Каждый раз, когда я добавляю заполнитель, мне нужно проверять код во многих местах, чтобы все было в порядке.
Есть ли какие-либо настройки или настройки, чтобы обойти это?
Есть ли какие-либо настройки или настройки, чтобы обойти это?
Да, есть. Вы можете включить режим эмуляции и иметь возможность использовать один и тот же заполнитель несколько раз.
Таким образом, описанное поведение наблюдается только тогда, когда эмуляция выключена. Я не очень понимаю, почему это так, но вот объяснение от Вез Фарлонг (автор PDO):
Изменение было сделано по двум причинам; Прежде всего, если вы повторно используете одну и ту же переменную в привязке, возможно использование сбоя при использовании некоторых драйверов. Невозможно гарантировать, что вы поступите правильно, и наличие способа вызвать сбой иногда может использоваться в качестве вектора атаки для эксплойта безопасности.
Вторая причина — это портативность. Некоторые драйверы внутренне выполняют эту проверку и выдают ошибку. Если вы кодируете против драйверов, которые не применяют это, то ваш код не будет работать с теми, которые этого не делают.
Других решений пока нет …