0

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

使用 MYSQLI,您可以:

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

如果存在 SQL 语法错误或列名不正确等,总会发生这种情况(这是期望的结果)。

使用 PDO,当您执行以下操作时:

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

当您遇到上述相同类型的错误时,这并不总是发生!

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

4

2 回答 2

1

尝试启用例外:

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

然后抓住他们:

try{
  $dbh->query("SELECT ...");

}catch(\Exception $e){
  printf('Error: %s', $e->getMessage());  
}
于 2013-08-31T20:41:12.320 回答
-2

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

所以你必须与PDO有关。
幸运的是,PDO 可以抛出异常。连接PDO 标签 wiki中解释的方式,您将始终有一个异常,当没有被捕获时,它也会被转换为 PHP 错误,并且可以与其他 PHP 错误完全相同的方式进行处理。

作为副作用,您根本不必检查查询结果,创建包含所有查询的冗长而复杂的结构,它的执行和错误检查塞在一行中。因此,您可以编写简洁易读的代码:

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

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

于 2013-09-01T05:45:23.633 回答