2012-12-03 56 views
0

我只是將網站轉換爲PDO,這是我第一次接觸到它,但我很難從PDO獲取任何有用的錯誤信息。我已經閱讀了許多關於這個主題的其他文章,但他們似乎沒有提供一個適合我的解決方案。如何檢索PDO錯誤信息?

下面是代碼:

try { 
    $dbh = new PDO("mysql:host=".CO_DB_HOST.";dbname=".CO_DB_NAME, CO_DB_UNAME, CO_DB_PWORD); 

    $dbh ->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); 
} 
catch(PDOException $e) { 
    echo $e->getMessage(); 
} 


function addRec($data) { 

    global $part_id, $dbh; 
    $part_id++; 

    try { 
     $sth=$dbh->prepare(" 
      INSERT INTO 
       non_existent_table 
       (
        name 
       ) VALUES (
        ? 
       ); 
     "); 

     for ($i = 0; $i < count($data); $i++) { 
      $sth->execute($data[$i]); 
     } 
    } 

    catch(PDOException $e) { 
     echo "Something went wrong. Please report this error."; 
     file_put_contents('/PDOErrors.txt', PDOStatement::errorInfo(), FILE_APPEND); 
    } 
} 

// Insert a database record 
$data = array(
     array(
      'joe blogs', /* name */ 
     ) 
); 
addRec($data); 

該表不存在,但我發現在PDOError.txt在我的httpd的錯誤日誌中沒有錯誤,沒有什麼。請問有人可以解釋我做錯了嗎?謝謝。

+0

檢查此http://php.net/manual/en/pdostatement.errorinfo.php – Namal

回答

2

errorInfo()不是一個靜態方法。此外,它返回一個數組,而不是一個字符串。

你應該沒問題,例外的信息。使用類似的東西

file_put_contents('/PDOErrors.txt', $e->getMessage(), FILE_APPEND); 

有關其他信息,您還可以附加stacktrace

編輯

你確定/PDOErrors.txt是錯誤日誌正確的文件路徑?這是在文件系統根目錄下,我懷疑是你想要甚至可能的。

+0

謝謝菲爾。我以前使用getMessage(),現在已經改回它,因爲它看起來是最好的選擇,但是,仍然沒有錯誤信息(除了回聲)。 關於文件路徑的好處,雖然我希望在我的Apache日誌中得到一個錯誤呢?如何在不使用服務器特定的文件路徑(爲便於攜帶)的情況下指定站點根目錄中的路徑? 另外,請你能詳細說明我如何追加你提到的'stacktrace'? –

+0

關於爲什麼downvote的任何想法?這是一個愚蠢的問題嗎? –

+0

我想出了路徑問題,並將該行更改爲: file_put_contents($ _ SERVER ['DOCUMENT_ROOT']。'/ PDOErrors.txt',$ e-> getMessage(),FILE_APPEND); 但不幸的是,該文件中仍然沒有錯誤消息,並且服務器日誌中沒有任何內容,例如「無法打開文件」。 –