5

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 により、 for simple queryquery()の使用をスキップできます。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() ではなく)、実行がスローされます。

結果セットの最後に到達すると、Fetch は常に false を返します。

于 2012-07-17T15:00:32.053 に答える
2

fetch() は、フェッチするデータがなくなると false を返します。mysql が停止したり、フェッチ ループの実行中に接続が失われたりするなど、実際に障害が発生している場合もあります。しかし、一般的に言えば、そのような「実際の」失敗はかなりまれであり、ほとんどの場合、「利用可能なデータがないため false」になります。

エラー処理の作成に本当に神経質になっている場合は、while ループの後に SQL エラー コード チェックを配置して、何かが実際に失敗した場合をキャッチしてください。

于 2012-07-17T14:55:42.403 に答える