PDO错误处理查询


PDO Error Handling Query

我最近从使用MySQLI切换到使用PDO,当您运行错误的查询时,PDO似乎并不总是让您知道何时出现错误。

使用MYSQLI,您可以执行以下操作:

if($dbh->query("SELECT ...") === false) {
  echo "Error";
}

如果出现SQL语法错误或列名称不正确等等,这种情况总是会发生(这是所需的结果)。

使用PDO,当您这样做时:

if($dbh->query("SELECT ...") === false) {
  echo "Error";
}

当你有同样类型的上述错误时,这种情况并不总是发生!

那么,我如何使用PDO获得相同的预期效果呢?我希望在查询出现问题的任何时候都能发生上述代码中的情况。换句话说,除非我得到某种结果集(无论是没有记录还是有一定数量的记录),否则我希望$dbh->query(…)返回false。

尝试启用异常:

$dbh->setAttribute('PDO::ATTR_ERRMODE, 'PDO::ERRMODE_EXCEPTION);

然后抓住他们:

try{
  $dbh->query("SELECT ...");
}catch('Exception $e){
  printf('Error: %s', $e->getMessage());  
}

首先,您使用mysqli报告错误的想法是错误的。回声错误是一种非常糟糕的做法。相反,您不得不将mysqli错误转换为PHP错误。

所以你必须处理PDO
幸运的是,PDO可以抛出异常。按照PDO标记wiki中解释的方式连接,您总是会有一个异常,如果没有被捕获,它也会被转换为PHP错误,并且可以以与其他PHP错误完全相同的方式处理。

副作用是,您根本不必检查查询结果,用所有的查询创建长而多风的结构,它的执行和错误检查都填充在一行中。因此,您可以编写整洁可读的代码:

$sql = "SELECT ...";
$dbh->query($sql);

请注意,如果使用query()而不是prepare(),那么使用PDO根本没有意义。