我的代码:
$st = $conn->prepare('abc');
echo "emulate is : " . $st->getAttribute(PDO::ATTR_EMULATE_PREPARES) . "<br />";
$sql = "SELECT count(*) FROM traceuser WHERE username=? ORDER BY gg DESC";
$q = $conn->prepare($sql);
$result = $q->execute(array("zac1987"));
$number_of_rows = $q->fetchColumn();
if($result){
echo "sql query successful";
}else{
echo "sql query fail. ";
print_r ($q->errorInfo()) ;
}
输出 PDO::ATTR_EMULATE_PREPARES => true
:
模拟是:1
SQL查询失败。数组([0] =&gt; 00000 [1] =&gt; 1054 [2] =&gt;'order子句'中的未知列'gg')
输出 PDO::ATTR_EMULATE_PREPARES => false
:
致命错误:在第33行的/home/aekcom/public_html/test-countResult-fakePS.php中的非对象上调用成员函数getAttribute()
致命错误:在第41行的/home/aekcom/public_html/test-countResult-fakePS.php中的非对象上调用成员函数execute()
问题:
为什么getAttribute()在PDO::ATTR_EMULATE_PREPARES => false
时无效?如何检查模拟的值?或者如何让它显示“模拟是:0”?
如何使PDO::ATTR_EMULATE_PREPARES => false
显示错误消息的更多详细信息,例如“未知列'gg'”而不是“函数execute()在非对象上”?
答案 0 :(得分:1)
在行中:
$conn->prepare('abc');
SQL“abc”中存在(非常糟糕的)语法错误。通过仿真,在prepare上没有错误检查,并且执行失败。没有模拟,你准备失败,$ st是null或false或者其他什么。