Отключение PDO:: ATTR EMULATE подготавливает "неизвестную" проблему

просто быстрый вопрос относительно атрибута ATTR_EMULATE_PREPARES PDO-проще говоря, в то время как слева по умолчанию (true) все работает нормально и денди. Отключите его, однако, и, ну, я даже не получаю сообщение об ошибке PHP, просто предупреждение браузера, сообщающее мне, что "соединение было сброшено".

для справки вот пример кода, который я использовал

<?php
include_once("config.php");

try {
  $dbh = new PDO
  (
    "mysql:host=". DB_SERVER .";dbname=" . DB_NAME,
    DB_USER,
    DB_PASS,
    array
    (
      PDO::ATTR_PERSISTENT => true,
      PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC,
      PDO::ATTR_EMULATE_PREPARES => true
    )
  );
} catch(PDOException $e) {
  echo "<pre>";
  print_r("Error: " . $e);
  echo "</pre>";
  die();
}

$idNum = "1";

$sth = $dbh->prepare("SELECT * FROM `table` WHERE `id` = ?;");
$sth->bindParam(1,$idNum);
$sth->execute();
$res = $sth->fetch();
?>

<pre>
<?=print_r($res); ?>
</pre>

который красиво возвращает запрос из моей прекрасной тестовой таблицы...

Array
(
    [id] => 1
    [field1] => q12w3e4r5t6y7u8i9
    [field2] => kijhgbfvcdoikujyh
)
Я имейте безрассудство установить значение PDO:: ATTR_EMULATE_PREPARES в false, он просто потерпит неудачу и снова потерпит неудачу, пока я не верну его исходное значение. Есть ли что-нибудь, что я могу сделать, чтобы узнать, что вызывает это, или я пропустил что-то очень простое?

моя версия PHP в настоящее время 5.4.3, а MySQL-5.5.24

3 ответов


это похоже на ошибку в некоторых версиях PHP:

https://bugs.php.net/bug.php?id=61411

Кажется, есть проблема с запуском обоих

PDO::ATTR_PERSISTENT => true

и

PDO::ATTR_EMULATE_PREPARES => true

который у вас есть в вашем массиве атрибутов/опций PDO.


Привет я придумал, как решить вашу (и мою) проблему.

испытал ту же проблему, просто сбой соединения, никаких ошибок. По какой-то причине это не работает, потому что вы добавили параметр ATTR_EMULATE_PREPARES в массив PDO-конфигурации при вызове конструктора обработчика базы данных PDO, каким-то образом это делает сбой PDO.

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

// Configure PDO to really prepare statements and to not emulate them
$dbh->setAttribute(PDO::ATTR_EMULATE_PREPARES, false);

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


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

Я только что ударился головой по этому вопросу пару дней назад.

есть это:

публика на grik dot net 07-Mar-2012 04: 23

с PDO_MYSQL вам нужно помнить о опции PDO::ATTR_EMULATE_PREPARES.

значение по умолчанию-TRUE, как $dbh не->метод setAttribute(ПДО::ATTR_EMULATE_PREPARES,истина);

Это означает, что подготовленная инструкция не создается с помощью $dbh - >prepare() вызов. С помощью exec() вызов PDO заменяет заполнители значениями сам и отправляет MySQL общую строку запроса.

первым следствием является то, что вызов $dbh - >prepare ('garbage'); не сообщает об ошибке. Вы получите ошибку SQL во время $dbh - >exec() вызов. Второй-риск инъекции SQL в особых случаях, таких как использование заполнителя для имени таблицы.

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

источник: пользователь внес Примечание.