处理PDO查询异常的最佳方式


Best way to handle PDO query exceptions

我有一个关于在php中使用try/catch块和PDO查询的最佳实践方法的基本问题。假设我有一个问题:

$sql = "SELECT id FROM table WHERE name = ?";
$sth = $dbh->prepare($sql);
$sth->bindValue(1, $param);
$sth->execute();
$result = $sub_sth->fetchColumn();

将其封装在try块中并在sql语法或执行中捕获异常的最佳实践方法是什么?

注意:PDO连接本身($dbh)已经有异常处理。

使错误处理尽可能原子化通常很有帮助。将可能引发异常的每个语句封装在单独的try/catch块中。

在这种情况下,可能引发异常的语句有:

$sth = $dbh->prepare($sql);

$sth->execute();

这种粒度允许您精确地解决问题,而不是大型try/catch块,后者只允许您查找导致问题的代码的部分

请参阅Ralph Shindler的文章,了解对该主题的深入处理。

根据配置,PDO使用模拟的准备语句。因此,->prepare调用本身不会触发异常。这就是为什么应该将prepare->execute封装在同一个try{}块中。

根据我对真正准备好的查询的经验,只在->execute调用上看到异常的情况并不常见。最典型的错误是SQL查询。然而,这是一个开发问题,而不是运行时问题,因此为prepare捕获异常似乎不太合乎逻辑。

无论如何,我的建议是将两者都打包,除非你真的能想出一种方法以两种不同的方式从问题中恢复(IMHO不太可能用于SQL ->prepare和语法错误)