Почему нельзя отключить PDO :: ATTR_EMULATE_PREPARES? - PullRequest
4 голосов
/ 26 декабря 2011

Я использую PHP 5.2.9 и Apache 2.2.11 и mysql 5.1.32

Почему я не могу отключить PDO :: ATTR_EMULATE_PREPARES?

Ниже представлен код:

<?php
try{
    $conn = new PDO("mysql:host=$DB_SERVER;dbname=$DB_NAME",$DB_USER,$DB_PASS, array(PDO::ATTR_EMULATE_PREPARES => false)); 
}

catch(PDOException $pe){
    die('Connection error : ' .$pe->getMessage());
}

$st = $conn->prepare('abc');
echo "emulate : " . $st->getAttribute(PDO::ATTR_EMULATE_PREPARES);
?>

вывод "эмулировать: 1".Я также попробовал код:

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

, но на выходе все равно то же значение "1".Выход должен быть 0, если значение ложно, верно?Но почему вывод 1?Как отключить ATTR_EMULATE_PREPARES?

1 Ответ

3 голосов
/ 03 января 2012

ваш код работает для меня на PHP 5.3.6 и mysqld 5.1.58 (он возвращает false и действительно использует готовит), попробуйте обновить PHP до> = 5.3, чтобы увидеть, если это проблема с версией (если это так, вероятно, возможно обновление) ваше единственное решение).

Несмотря на то, что даже если вам удастся установить этот флаг, это на самом деле не означает, что PDO будет использовать подготовленный оператор, если вы хотите проверить, действительно ли PDO использует готовит (и вы можете использовать wireshark ), вы мог бы написать простой скрипт, который делает подготовленный запрос:

<?php
    $pdo = new PDO(..., array(ATTR::PDO_EMULATE_PREPARES => false));
    $stmt = $pdo->prepare('SELECT :param');
    $stmt->bindValue(':param', 5);
    $stmt->execute();

прослушивать передачу, пока не обнаружите запрос "SELECT: param" - если: param был заменен знаком вопроса, то PDO использует готовит. Если он был заменен на «5», то PDO эмулирует подготовку.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...