加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 站长学院 > PHP教程 > 正文

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

发布时间:2020-12-13 16:23:08 所属栏目:PHP教程 来源:网络整理
导读:我使用的是 PHP 5.2.9和Apache 2.2.11以及mysql 5.1.32 为什么我无法禁用PDO :: ATTR_EMULATE_PREPARES? 以下是代码: ?phptry{ $conn = new PDO("mysql:host=$DB_SERVER;dbname=$DB_NAME",$DB_USER,$DB_PASS,array(PDO::ATTR_EMULATE_PREPARES = false));
我使用的是 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模拟准备.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读