为什么不能禁用PDO:: attr_emulate_preparates ?



我使用PHP 5.2.9和Apache 2.2.11和mysql 5.1.32

为什么我不能禁用PDO:: attr_emulate_preparates ?

代码如下:

<?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);
?>

输出为"emulation: 1"。我还尝试了以下代码:

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

,但输出仍然是相同的值"1"。如果值为false,输出应该是0,对吗?但是为什么输出是1呢?如何禁用attr_emulate_preparates ?

你的代码在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使用prepare。如果它被'5'取代,那么PDO模拟准备。

最新更新