Учитывая что-то вроде
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%'
Я работаю внутри рамки мерзости (без модульных тестов, без документации, без ryhme или причины), так что возможно, что где-то кто-то явно отключил MySQL, подготовленные инструкции, заставляющие PDO использовать эмулированный режим … или это ожидаемое поведение?
PHP – это PHP Version 5.2.10-2ubuntu6
для MySQL, версия клиентской библиотеки 5.1.41
Обновление: PDO () создается со следующими атрибутами
PDO::ATTR_PERSISTENT => false PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION PDO::MYSQL_ATTR_USE_BUFFERED_QUERY => true
Я просмотрел документацию PDO, но, к сожалению, не упоминается флаг, подобный тому, который был написан в этом подобном вопросе
Некоторые драйверы PDO не поддерживают собственные подготовленные инструкции, поэтому PDO выполняет эмуляцию подготовки. Он также позволяет вам вручную включить эту эмуляцию.
Проверьте атрибут PDO::ATTR_EMULATE_PREPARES
. Он плохо документирован в текущем руководстве PDO. Плохо документированный, я имею в виду, что он появляется только в комментариях на сайте, а не в самом руководстве.
Как правило, вы хотите использовать собственные подготовленные заявления, когда это возможно. В случае с MySQL, если вы используете кеш запросов, вы действительно можете отключить собственные подготовленные заявления в PDO! В руководстве MySQL содержится больше информации , но в короткой версии версии до 5.1.17 не запускают подготовленные операторы через кэш запросов, а в последующих версиях используется кеш запросов в определенных конкретных (но общих) условиях.
(Некоторые люди рекомендуют полностью отключить кеш-запрос. Использование больших размеров кеша может фактически стать большим достижением производительности.)
По умолчанию PDO_MYSQL эмулирует подготовленные операторы. Чтобы использовать собственные подготовленные операторы на стороне сервера, необходимо явно установить
$PDO->setAttribute(PDO::ATTR_EMULATE_PREPARES,false);