Почему бы мне не отключить PDO:: MYSQL ATTR DIRECT QUERY?
Я наткнулся на (имхо довольно плохо документированный) факт, что по умолчанию PHP PDO имеет флаг MYSQL_ATTR_DIRECT_QUERY, включенный для его драйвера MySQL.
Это означает, что вместо того, чтобы фактически использовать подготовленные утверждения, он эмулирует поведение подготовленных утверждений. Это означает, что он заменяет заполнители на стороне клиента экранированными значениями и просто отправляет полный запрос в базу данных как есть.
Раньше для этого была веская причина, так как в более старых версиях MySQL подготовленные операторы были бы обход кэша запросов. Но это уже давно не так. Есть еще небольшое преимущество в производительности, так как это уменьшает количество переходов от вашего приложения к базе данных, но я не уверен, что это стоит того?
Очевидным недостатком использования этого метода является то, что мы все еще полагаемся на клиентский побег, что обычно является плохой идеей. Я сталкивался со странными проблемами с
mysqli_real_escape_string в прошлом, когда недопустимые символы были разрешены в запрос из-за некоторого набора символов неправильная настройка. Я бы предпочел, чтобы подобное не повторилось.Я нахожу только полуправду и поверхностные комментарии по этому вопросу (например, "да, вы можете включить это"или" это вызовет "проблемы""). Ищешь настоящую причину, почему я не выключу это? Использует фактические подготовленные операторы в MySQL/PDO в любом случае несовместимо с эмулировать подготовленные операторы?
Частично причина, по которой я спрашиваю, заключается в том, что мы используем PHPActiverecord, который полагается на PDO. Он не грузится с тестами, и я не хочу, чтобы это внезапно сломалось в производстве, потому что отключение эмулированных подготовленных утверждений тонко меняет поведение в некоторых крайних случаях или что-то еще.
(в качестве примечания, прежде чем кто-либо поднимет этот вопрос: проверка PDO::ATTR_EMULATE_PREPARES не будет работать, поскольку она фактически (полностью) не реализована для драйвера MySQL, вы должны проверить PDO::MYSQL_ATTR_DIRECT_QUERY вместо этого. Да, это заняло у меня много времени.)
Чтобы пояснить: мне интересно, есть ли веская причинане отключать это поведение. А не причины, по которым мне вообще не должно быть до этого дела.
1 ответ:
Вопрос основан на неверном предположении: что эмулируемые заготовки не полностью поддерживаются. (Они полностью поддерживаются).
На самом деле, MYSQL_ATTR_DIRECT_QUERY-это не более чем псевдоним для ATTR_EMULATE_PREPRES.
Доказательство в исходном коде: обработка соединений икод Геттера атрибутов иКод сеттера атрибутов .Код сеттера является наиболее красноречивым. А именно:
390 case PDO_MYSQL_ATTR_DIRECT_QUERY: 391 case PDO_ATTR_EMULATE_PREPARES: 392 ((pdo_mysql_db_handle *)dbh->driver_data)->emulate_prepare = Z_BVAL_P(val); 393 PDO_DBG_RETURN(1);Подробнее о том, почему Вы должны полностью отключить эмулируемый готовит , см. этот ответ.
Comments