我有一个关于在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
和语法错误)