Поддержка на стороне сервера подготовленные заявления с PDO? - PullRequest
6 голосов
/ 21 апреля 2011

Учитывая что-то вроде

DB()->prepare("SELECT * FROM mysql.general_log WHERE user_host LIKE ?");

$statement->execute( array('%console%') );

foreach($statement as $record){
    var_dump($record);
}

Содержимое general_log:

*************************** 1. row ***************************
event_time: 2011-04-20 14:27:59
user_host: REDACTED[REDACTED] @ REDACTED [192.168.56.101]
thread_id: 30
server_id: 0
command_type: Connect
argument: REDACTED@REDACTED on REDACTED
*************************** 2. row ***************************
event_time: 2011-04-20 14:27:59
user_host: REDACTED[REDACTED] @ REDACTED [192.168.56.101]
thread_id: 30
server_id: 0
command_type: Query
argument: SELECT * FROM mysql.general_log WHERE user_host LIKE '%console%'

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

PHP - это PHP Version 5.2.10-2ubuntu6 Драйвер PDO для MySQL, версия клиентской библиотеки 5.1.41

Обновление: PDO () создается со следующими атрибутами

PDO::ATTR_PERSISTENT => false
PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION
PDO::MYSQL_ATTR_USE_BUFFERED_QUERY => true

Я просмотрел документацию по PDO, но, к сожалению, нет упоминания о флаге, подобном приведенному.написано о этом аналогичном вопросе

Ответы [ 2 ]

11 голосов
/ 22 апреля 2011

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

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

Обычно вы хотите использовать нативно подготовленные операторы, когда это возможно. В случае MySQL, если вы используете преимущества кэша запросов, вы можете отключить собственные подготовленные операторы в PDO! В руководстве по MySQL содержится больше информации , но короткая версия заключается в том, что версии до 5.1.17 не запускают подготовленные операторы через кеш запросов, а последующие версии используют кеш запросов только под определенным (но общим ) условия.

(Некоторые люди рекомендуют полностью отключить кеш запросов. Использование больших размеров кеша действительно может сильно повлиять на производительность.)

5 голосов
/ 30 мая 2011

По умолчанию PDO_MYSQL эмулирует подготовленные операторы. Чтобы использовать встроенные операторы, подготовленные на стороне сервера, нужно явно установить

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