Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/231.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php PDO错误处理查询_Php_Pdo_Mysqli - Fatal编程技术网

Php PDO错误处理查询

Php PDO错误处理查询,php,pdo,mysqli,Php,Pdo,Mysqli,我最近从使用MySQLI切换到使用PDO,当您运行一个查询时,PDO似乎并不总是让您知道何时有错误 使用MYSQLI,您可以: if($dbh->query("SELECT ...") === false) { echo "Error"; } 如果存在SQL语法错误或名称不正确的列或诸如此类的情况,则总是会发生这种情况(这是期望的结果) 使用PDO,当您执行以下操作时: if($dbh->query("SELECT ...") === false) { echo "Erro

我最近从使用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可以抛出异常。按照中所述的方式连接,您将始终会遇到异常,如果未捕获该异常,它也将被转换为PHP错误,并且可以与其他PHP错误完全相同的方式进行处理

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

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

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

如何获得相同的预期效果?我希望能够在查询出现问题的任何时候都能发生上述代码段中的情况。换句话说,除非我得到某种类型的结果集(不管是没有记录还是有多少记录),否则我希望$dbh->query(…)返回false。你没有领会我的意思。回声就是一个例子。我想知道我的查询或语句何时无法运行!不,我不是。你们应该阅读整个答案,而不仅仅是其中的代码片段。