5

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' 吗?

4

2 回答 2

4

要处理查询错误(获取时不会发生 sql 错误)和更一般的 PDO 错误,您应该尝试使用PDO::ERRMODE_EXCEPTION. 此外,实现 Traversable 返回的 PdoStatement query(),因此您可以跳过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。

于 2012-07-17T15:00:32.053 回答
2

当没有更多数据要获取时,fetch() 将返回 false。也可能存在真正失败的其他情况,例如 mysql 死机或在执行 fetch 循环时连接丢失。但一般来说,那种“真正的”失败是相当罕见的,而且你经常会得到“错误的,因为没有更多的数据可用”。

如果你真的对编写错误处理感到偏执,那么一定要在 while 循环之后放置一个 sql 错误代码检查,以捕捉真正发生故障的情况。

于 2012-07-17T14:55:42.403 回答