我有一个关于在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)已经有异常处理。
答案 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
和语法错误。)