gpt4 book ai didi

pdo - 为什么不能禁用 PDO::ATTR_EMULATE_PREPARES?

转载 作者:行者123 更新时间:2023-12-01 02:40:21 35 4
gpt4 key购买 nike

我使用的是 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?

最佳答案

您的代码适用于 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 模拟准备。

关于pdo - 为什么不能禁用 PDO::ATTR_EMULATE_PREPARES?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8636449/

35 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com