如何正确处理PDO fetch()中的错误


How to properly handle errors from PDO fetch()?

fetch()的错误处理文档似乎不清楚,经过大量搜索,我在任何地方都没有找到答案。如文档所示,一个常见的提取使用模型是:

while ( $row = $stmt->fetch() ) {
    // do something with $row
}

PHP文档http://www.php.net/manual/en/pdostatement.fetch.php说:

在所有情况下,失败时返回FALSE。

"失败"是什么意思?一个错误?无法获取更多行?我的问题是:当fetch()返回FALSE时,检测错误的最佳实践是什么?在循环之后,我似乎需要区分错误情况和"不再有行"情况。

我应该调用$stmt->errorCode()并查看它是否为"00000"吗?

要处理查询错误(获取时不会发生sql错误)和更常见的PDO错误,您应该尝试使用PDO::ERRMODE_EXCEPTION。此外,query()返回的PdoStatement实现了Traversable,因此您可以跳过使用fetch()进行简单查询:

try {
    $db = new PDO('sqlite:mydb.db');
    $db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); // Set Errorhandling to Exception
    foreach($db->query("SELECT...") as $row)
    {
      //Do domething
    }
    $db = null; // "Disconnect"
}
catch (PDOException $err) {
   //Handling query/error
}

如果查询遇到错误(不是fetch()),将抛出一个exeception。

当Fetch到达结果集的末尾时,它总是返回false。

当没有更多数据要提取时,

fetch()将返回false。也可能存在其他确实存在故障的情况,例如mysql在执行fetch循环时死亡或连接丢失。但总的来说,这种"真正的"失败是相当罕见的,而且你经常会得到"错误的,因为没有更多的数据可用"。

如果你真的对编写错误处理非常偏执,那么无论如何,在while循环之后进行sql错误代码检查,以捕捉真正发生错误的情况。