PDO, Mysql и нативные заявления - PullRequest
8 голосов
/ 28 ноября 2011

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

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

Однако, по другому вопросу SO, который я помогал на Как заменить все вхождения char на элементы из массива? , кто-то сделал комментарий, что это не так, ичто на самом деле PDO эмулирует подготовленные операторы при обращении к базе данных MySQL.

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

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

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

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

1 Ответ

5 голосов
/ 28 ноября 2011

Разве PDO не использует подготовленные операторы с mysql?

Да, по умолчанию (по крайней мере, в версии, которую я тестировал), но основной режим можно включить вручную.

Если нет, то можно ли заставить это сделать

При использовании настройки PDO::ATTR_EMULATE_PREPARES название довольно очевидно.

$dbh->setAttribute( PDO::ATTR_EMULATE_PREPARES, false );

ты должен это сделать?

Это самый сложный вопрос для них всех.
Ну, я бы сказал - да, ты должен. Если вы выбираете PDO в качестве драйвера БД, его использование в режиме эмуляции не имеет смысла.

...