2012-07-17 54 views
4

fetch()的錯誤處理文檔似乎不清楚,並且我在大量搜索後的任何地方都找不到答案。爲取指在doc如圖常見的使用模式是:如何正確處理來自PDO fetch()的錯誤?

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

PHP的文檔在http://www.php.net/manual/en/pdostatement.fetch.php說:

在所有情況下,假的則失敗返回。

什麼是 「失敗」 是什麼意思?一個錯誤?未能獲取更多行?我的問題是:當fetch()返回FALSE時,檢測錯誤的最佳做法是什麼?似乎循環後我需要區分錯誤情況和「不再行」的情況。

要我打電話stmt- $>的errorCode(),看看它是否是 '00000'?

回答

3

當沒有更多的數據被提取時,fetch()將返回false。也可能存在其他真正失敗的情況,例如, mysql在執行提取循環時死亡或連接丟失。但總的來說,這種「真正」的失敗相當罕見,而且由於沒有更多的數據可用,你通常會「錯誤」。

如果你是真正的偏執狂關於編寫錯誤處理,然後通過各種手段,把一個SQL錯誤代碼檢查後while循環趕情況下,當事情真的炸燬。

+0

+1您應該關注的唯一錯誤是您在運行查詢時。即你的語法是不正確的,名稱是錯誤拼寫錯誤的查詢等。 – Waygood 2012-07-17 14:57:50

+0

@waygood:這將是'查詢()'調用失敗,而不是在獲取。 – 2012-07-17 14:58:19

+0

是的,這是正確的。這就是爲什麼我同意你的回答 – Waygood 2012-07-17 14:59:04

4

爲了處理查詢錯誤(SQL錯誤不是發生在提取),更generaly 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 
} 

的execption將被拋出(未取())。

當到達結果集的末尾時,提取將始終返回false。