PDO, Mysql и собственные подготовленные операторы

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

На самом деле страница руководства PHP для драйвера MySQL PDO говорит об этом. http://php.net/manual/en/ref.pdo-mysql.php

Однако, в другом вопросе SO, в котором я помогал How to replace all occurencies of char with elements from array?, кто-то сделал замечание, что это не так, и что на самом деле PDO эмулирует подготовленные операторы при работе с базой данных MySQL.

Мне не очень повезло найти доказательства, подтверждающие эти утверждения, но я обнаружил, что существует атрибут PDO::ATTR_EMULATE_PREPARES, который может быть настроен для переключения эмуляции подготовленных операторов.

Так в чем же истина? Действительно ли PDO не использует подготовленные операторы в mysql? Если нет, то можно ли заставить его это делать, и если да, то стоит ли это делать? Я всегда полагал, что поскольку в mysql есть настоящие подготовленные операторы, PDO будет их использовать, как утверждается в руководстве. Является ли руководство неточным?

РЕДАКТИРОВАТЬ ДОБАВИТЬ: Недавно я прочитал несколько статей, в которых, по крайней мере, дается достойное обоснование того, почему реальные подготовленные запросы отключены по умолчанию. PHP-скрипты, как правило, недолговечны и выполняются только для того, чтобы сгенерировать ответ на запрос, после чего все их ресурсы деаллоцируются. Для любого запроса, который выполняется только один раз за запрос, вам придется выполнить 2 команды SQL (команда prepare и команда execute), поэтому для любого подготовленного оператора, который выполняется только один раз, вы, вероятно, получите немного худшую производительность, чем при использовании эмулированного подготовленного оператора. Для запросов, которые должны выполняться в цикле, реальные подготовленные операторы, вероятно, будут работать лучше, но такие случаи относительно редки в модели запрос/ответ, для которой обычно используется PHP.

Я по-прежнему считаю, что настоящие подготовленные операторы предпочтительнее, но по крайней мере у меня есть разумное объяснение, почему PDO использует эмулированные запросы по умолчанию.

8
задан Community 23 May 2017 в 12:01
поделиться