2013-05-08 119 views
2

我該如何處理獲取PDO語句以生成安全錯誤消息?我不希望用戶看到錯誤消息。我希望他們被引導到一個頁面,上面寫着一個乾淨的消息,「哎呦發生了意想不到的事情!」。我還想將這些錯誤記錄在數據庫中,以檢查並捕獲其他人正在生成的錯誤。PDO錯誤處理和在數據庫中存儲錯誤

我正在使用PHP和MySQL。

我發現當你建立連接時,你可以設置你的錯誤處理。

$dbh = new PDO($dsn, $user, $password); 
$dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); 

以前有人做過這樣的事嗎?

+0

你的問題到底是什麼?您是否要求我們提供完整的解決方案? – Blazemonger 2013-05-08 18:00:41

+0

只是一些常規的方向,比如使用它來捕獲錯誤,然後將它們寫出到日誌文件中,並重定向用戶。我想我不知道捕捉錯誤的最佳方法。我不想重寫所有的命令。 – 2013-05-08 18:05:01

+0

你有沒有把這個重做? http://php.net/manual/en/pdo.error-handling.php PHP手冊,查看catch和PDOException部分 – 2013-05-08 18:07:49

回答

1

我認爲最好將日誌寫入文件而不是數據庫。特別是因爲你想記錄PDO錯誤,這表明你的數據庫連接有問題。

您可以通過捕捉錯誤來向用戶顯示一個不錯的錯誤頁面。您可以將用戶重定向到錯誤頁面,以防出現問題。

+0

我該如何捕捉錯誤?我是否需要在try-catch語句中重寫所有的命令,或者可以在數據庫上運行pdo命令時創建某種函數? – 2013-05-08 18:03:13

+0

是的,您必須將所有函數包含在try-catch語句中,或者至少包含可能導致錯誤的代碼。除非要擴展PDO並覆蓋所有PDO功能,否則無法創建捕獲所有PDO錯誤的函數。 – 2013-05-08 18:08:36

2

所以這只是一個建議,因爲我從來沒有嘗試過這個,但考慮一下後,我認爲這將是一個有趣的選項來探索。由於我對PHP & PDO相當陌生,我相信還有其他更好的方法。

也許你可以嘗試使用PHP的try函數,然後代替echo'ing(如果失敗)PDOException,你可以運行另一個函數將它打印到文本文件。就像是。

<?php 
try { 
    $dbh = new PDO('mysql:host=localhost;dbname=test', $user, $pass); 
    foreach($dbh->query('SELECT * from FOO') as $row) { 
     print_r($row); 
    } 
    $dbh = null; 
} catch (PDOException $e) { 
    $strFileName = 'whatever.txt'; 

    if(!is_writable($strFileName)) 
     die('Change permisions to ' . $strFileName); 

    $handle = fopen($strFileName, 'a+'); 

    fwrite($handle, "\r" . $e->getMessage() . "\r"); 
    fclose($handle); 
} 
?> 

這樣你就可以避免一個數據庫連接(這是我想這個問題),但仍保存錯誤。 您可能想要在if語句中省略echo'd文本。

+0

感謝您的諮詢! – 2013-05-08 18:32:01

+1

你知道,PHP可以做到這一切。 PHP可以打開一個文件。 PHP可以寫一個日誌。 PHP可以捕獲錯誤消息。 **所有沒有讓你寫一行代碼** – 2013-05-08 20:35:07

+0

@YourCommonSense否我沒有,就像我在我的帖子中說的仍在學習:)謝謝你讓我知道我會讀到它 – 2013-05-09 06:54:08

1

您必須明白,PDO不會生成「安全」或「不安全」的錯誤消息。它確實會生成一條錯誤消息。就這樣。其餘的是全站PHP設置的責任。

PDO不是唯一的錯誤來源。爲什麼只關心PDO錯誤?爲什麼不以同樣的方式處理所有錯誤?

想要記錄錯誤?這是一個PHP ini設置的問題。 想要顯示錯誤?這是一個PHP ini設置的問題。 想要顯示通用錯誤頁面?這是一個功能簡單的問題,可以一次處理所有錯誤。

一切都可以做到正確和直接的方式,沒有將每個語句都包含在try catch中。無需手動寫入日誌。甚至沒有一個額外的代碼行。

您需要設置PHP錯誤處理,而不是PDO。

當然,在嘗試將數據庫錯誤存儲在同一個數據庫中使得您現在失敗時絕對沒有意義。在現場服務器和屏幕上的錯誤日誌中必須出現錯誤 - 在本地開發PC上。

任何人都可以做這樣的事情嗎?

當然。世界上每100萬個地點的每一個。上述方式。

+0

你能提供一些代碼示例或顯示如何記錄所有php錯誤的代碼示例的鏈接? – zeckdude 2013-08-04 11:09:41

+0

在php.ini中只是'log_errors = on'就是你需要的所有代碼示例 – 2013-08-04 11:52:11