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

时间:2011-06-23 17:28:49

标签: php exception pdo

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

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

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

N.B。 PDO连接本身($ dbh)已经有异常处理。

2 个答案:

答案 0 :(得分:2)

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

在这种情况下,可能抛出异常的语句是:

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

$sth->execute();

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

请参阅Ralph Shindler's article以深入了解该主题。

答案 1 :(得分:1)

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

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

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