处理PDO的错误:: ATTR_EMULATE_PREPARES =>假

时间:2012-01-04 02:12:53

标签: pdo

我的代码:

$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()在非对象上”?

1 个答案:

答案 0 :(得分:1)

在行中:

$conn->prepare('abc');

SQL“abc”中存在(非常糟糕的)语法错误。通过仿真,在prepare上没有错误检查,并且执行失败。没有模拟,你准备失败,$ st是null或false或者其他什么。