【发布时间】:2012-11-04 21:49:57
【问题描述】:
只是一个关于 PDO 的 ATTR_EMULATE_PREPARES 属性的快速问题 - 简单地说,当保持默认 (true) 时,一切正常且花花公子。但是禁用它,好吧,我什至没有收到 PHP 错误消息,只是一个浏览器警告告诉我“连接已重置”。
这里是我使用的代码示例供参考
<?php
include_once("config.php");
try {
$dbh = new PDO
(
"mysql:host=". DB_SERVER .";dbname=" . DB_NAME,
DB_USER,
DB_PASS,
array
(
PDO::ATTR_PERSISTENT => true,
PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC,
PDO::ATTR_EMULATE_PREPARES => true
)
);
} catch(PDOException $e) {
echo "<pre>";
print_r("Error: " . $e);
echo "</pre>";
die();
}
$idNum = "1";
$sth = $dbh->prepare("SELECT * FROM `table` WHERE `id` = ?;");
$sth->bindParam(1,$idNum);
$sth->execute();
$res = $sth->fetch();
?>
<pre>
<?=print_r($res); ?>
</pre>
这很好地从我可爱的测试表中返回查询...
Array
(
[id] => 1
[field1] => q12w3e4r5t6y7u8i9
[field2] => kijhgbfvcdoikujyh
)
但是,如果我冒昧地将 PDO::ATTR_EMULATE_PREPARES 的值设置为 false,它只会失败,然后再次失败,直到我将其恢复为原始值。 我能做些什么来找出造成这种情况的原因还是我错过了一些非常简单的事情?
我的 PHP 版本目前是 5.4.3,MySQL 是 5.5.24
【问题讨论】:
-
应该没什么区别,但是您是否尝试过在查询中使用命名参数而不是问号语法?
-
要尝试的另一件事 - 您是否尝试过使用 bindValue() 而不是 bindParam()?对于这样的查询,bindValue() 会更合适。
-
恐怕完全没有区别,使用“命名”或“问题标记”参数,仍然会产生相同的不可用网页。只需查询“Select * FROM table”就会导致这种情况。也就是说,我找到了一个 solution 让它工作,但是该解决方案是根本不进行任何查询,然后脚本的其余部分运行良好!呸呸呸
-
不管你在做什么,开发php代码的第一步总是“打开/打开错误报告”。总是。
-
感谢您发布此信息,因为我在两个不同的服务(一个由大学和我自己的 iMac 运行)上得到或多或少相同的东西。完全相同的 PDO_Mysql 驱动程序版本,几乎相同的 PHP 和 MySQL 版本,它们与您的几乎相同。模拟 ==> 一切正常;仿真关闭(本机)==> 未生成网页,Chrome 浏览器出错,查看源代码显示部分发出的网页。似乎死在 PDO::prepare() 内,没有例外(例外),没有错误消息。 (使用命名参数;传入的值作为数组执行。)