我最近从使用MySQLI切换到使用PDO,看起来PDO并不总是让您知道在运行错误的查询时出现错误。
使用MYSQLI,您可以:
if($dbh->query("SELECT ...") === false) {
echo "Error";
}
如果存在SQL语法错误或名称不正确的列或诸如此类的东西,则总会发生这种情况(这是所需的结果)。
使用PDO时:
if($dbh->query("SELECT ...") === false) {
echo "Error";
}
当你遇到同样的错误时,并不总是会发生这种情况!
那么如何使用PDO获得相同的预期效果?我希望能够在上面的代码中发生这种情况,因为查询存在问题。换句话说,除非我得到某种结果集(无论是没有记录还是一些记录),我希望$ dbh-> query(...)返回false。
答案 0 :(得分:1)
尝试启用例外:
$dbh->setAttribute(\PDO::ATTR_ERRMODE, \PDO::ERRMODE_EXCEPTION);
然后抓住他们:
try{
$dbh->query("SELECT ...");
}catch(\Exception $e){
printf('Error: %s', $e->getMessage());
}
答案 1 :(得分:-2)
首先,您对使用mysqli进行错误报告的想法是错误的。回应错误是一种非常糟糕的做法。相反,您必须将mysqli错误转换为PHP错误。
所以你必须使用PDO 幸运的是,PDO可以抛出异常。连接PDO tag wiki中解释的方式,你将始终有一个异常,当它没有被捕获时,也会被转换为PHP错误,并且可以像处理其他PHP错误一样处理。
作为副作用,您根本不需要检查查询结果,使用所有查询创建长而多风的结构,将执行和错误检查填入一行。所以,你可以写出整洁可读的代码:
$sql = "SELECT ...";
$dbh->query($sql);
请注意,如果您使用的是query()
而不是prepare()
,则根本不需要使用PDO。