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

时间:2012-07-17 14:52:13

标签: php pdo fetch

fetch()的错误处理文档似乎不清楚,经过大量搜索后我没有找到答案。如文档中所示,fetch的常用用法模型是:

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

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

  

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

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

我应该拨打$ stmt-> errorCode()并查看它是否为'00000'?

2 个答案:

答案 0 :(得分:4)

要处理查询错误(获取时不会发生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()),则会抛出一个execption。

当结果到达结果集的末尾时,Fetch将始终返回false。

答案 1 :(得分:2)

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

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

如果你对编写错误处理真的很偏执,那么一定要在while循环之后进行一次sql错误代码检查,以便在事情确实爆炸时抓住案例。