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

发布时间:2022-04-30 发布网站:脚本宝典
脚本宝典收集整理的这篇文章主要介绍了为什么无法禁用PDO :: ATTR_EMULATE_PREPARES?脚本宝典觉得挺不错的,现在分享给大家,也给大家做个参考。
我使用的是 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?

解决方法

您的代码适用于PHP 5.3.6和MysqLd 5.1.58(它返回false并且真的使用prepare),尝试将PHP升级到> = 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使用prepares.如果它被’5’取代,则PDO模拟准备.

脚本宝典总结

以上是脚本宝典为你收集整理的为什么无法禁用PDO :: ATTR_EMULATE_PREPARES?全部内容,希望文章能够帮你解决为什么无法禁用PDO :: ATTR_EMULATE_PREPARES?所遇到的问题。

如果觉得脚本宝典网站内容还不错,欢迎将脚本宝典推荐好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。