为什么无法禁用PDO :: ATTR_EMULATE_PREPARES?

时间:2011-12-26 14:05:09

标签: pdo

我使用的是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”。如果值为false,则输出应该为0?但为什么输出为1?如何禁用ATTR_EMULATE_PREPARES?

1 个答案:

答案 0 :(得分:3)

你的代码适用于PHP 5.3.6和mysqld 5.1.58(它返回false并且真的使用prepare),尝试将PHP升级到&gt; = 5.3以查看它是否是版本问题(如果是,那么更新是可能是你唯一的解决方案。)

尽管如此,即使你设法设置这个标志,它并不意味着PDO将使用预准备语句,如果你想检查PDO是否真的使用prepare(并且你可以使用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使用prepare。如果它被'5'取代,则PDO模拟准备。