【发布时间】:2015-12-09 15:46:16
【问题描述】:
我们一直在检查我们的一些旧代码,我们发现了一些看起来像这样的代码:
try
{
$stmt = $db->prepare($query);
$stmt->bindvalue(1, $id, PDO:ARAM_INT);
$stmt->execute();
$row = $stmt->fetchColumn();
}
catch(PDOException $e)
{
echo "There was an issue with query: ";
print_r($db->errorInfo());
}
乍一看我们认为看起来不错(甚至 Stack Exchange 上的许多答案都将其作为示例代码)。然后我们查看了 errorInfo 函数的 PHP 文档,它指出:
PDO::errorInfo() 仅检索直接在 数据库句柄。如果您通过创建 PDOStatement 对象 PDO:repare() 或 PDO::query() 并在语句上调用错误 句柄,PDO::errorInfo() 不会反映语句中的错误 处理
如果我们理解正确,这意味着如果我们执行的任何语句操作出现任何问题,我们实际上不会在“查询出现问题:”之后打印出我们期望的错误代码。这是正确的吗?
鉴于此,我们开始寻找正确的方法来执行此操作,我们首先查看 PDOException 类文档,该文档表明我们可能会执行以下操作:
try
{
$stmt = $db->prepare($query);
$stmt->bindvalue(1, $id, PDO:ARAM_INT);
$stmt->execute();
$row = $stmt->fetchColumn();
}
catch(PDOException $e)
{
echo "There was an issue with query: ";
print_r($e->errorInfo());
}
我的问题是:
- 上述方法是否正确?如果不是,那么正确的做法是什么?
- 除了您可以从 PDOException 中看到的信息之外,是否还有其他有用的信息可以通过使用 $db->errorInfo() 和 $db->errorCode(或 $stmt->errorInfo 和 $stmt->errorCode)获得?
- 如果从这些详细的调用中有更详细的可用和有用的信息,那么有没有办法通过检查 PDOException 来区分它是由 PDO 引发还是由 PDOStatement 引发的?
【问题讨论】: