這裏是我的可能解決方案:在PHP腳本中,連接/發送查詢到數據庫時應該如何處理異常?
1)使用exit()
終止腳本。 (問題:影響整個頁面內容的加載而不僅僅是來自數據庫的數據)
2)在頁面中嵌入一個<div>
元素,專門用於顯示可能的異常。
什麼是標準方法?
這裏是我的可能解決方案:在PHP腳本中,連接/發送查詢到數據庫時應該如何處理異常?
1)使用exit()
終止腳本。 (問題:影響整個頁面內容的加載而不僅僅是來自數據庫的數據)
2)在頁面中嵌入一個<div>
元素,專門用於顯示可能的異常。
什麼是標準方法?
項1)是不整潔,因爲它提供了較差的用戶體驗
選項2)是優選的。
使用PDO下面的代碼將顯示異常並將其與時間戳一起存儲。
try {
$dbh = new PDO("mysql:host=$host;dbname=$database", $username, $password);
$dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$stmt = $dbh->prepare("INSERT INTO table (column) values (value)");
$stmt->execute();
}
catch(PDOException $e) {
echo "I'm sorry I'm afraid you can't do that.". $e->getMessage() ;// Remove or modify after testing
file_put_contents('PDOErrors.txt',date('[Y-m-d H:i:s]'). $e->getMessage()."\r\n", FILE_APPEND);
}
在測試echo語句後生產現場應ammended到
echo "I'm sorry I'm afraid you can't do that.";
非常感謝。 – MTVS
對於如何處理數據庫中的異常,並沒有真正的「標準」方法。它完全取決於具體的用例。例如,如果在第一種情況下無法建立數據庫連接,則可能需要重定向到錯誤頁面並立即向網站管理員發送電子郵件通知。另一方面,如果您無法執行一次插入(無論出於何種原因),則或可能更適合通知用戶他們所嘗試的內容無法完成,並要求他們再次嘗試。
例外本質上是一種讓你,而不是你正在使用的編程語言或庫,決定如何處理出現問題時該怎麼做的方法。幾乎總是要記錄錯誤,然後由您決定最合適的響應。
所有這一切就是說,處理異常的適當方式是在您的應用程序中最有意義的方式。
嘗試 - 美中不足的是我處理在PHP異常的標準方式......這裏看到:PHP EXCEPTIONS
try{
some code here
}catch(Exception $e){
failed response here
}
編輯闡述:這僅僅是一個捕捉異常的方法。當被抓到的時候做什麼是對開發者留下的價值判斷。如果這就是問題所在,我的道歉。
你應該在一個日誌文件中記錄你的異常,並用它來分析出了什麼問題。但從用戶的角度來看,你應該向他們展示友好的聲明,如「抱歉,你的請求無法處理」。
你必須找到你自己的方式來捕捉錯誤。 我使用的
try { QUERY } catch(Exception $e) { Log and display error }
我面對我的項目中同樣的問題。首先,我想到了一個類似於david strachan的解決方案,但最終我意識到這個解決方案並不完整。我仍然需要調試信息,但這些信息不應該顯示給用戶。
我想出了一個解決方案,向用戶顯示一條消息,指出「系統錯誤,請重試,如果錯誤仍然存在,請聯繫支持人員」。同時,錯誤信息也會記錄到錯誤日誌文件中。
下面是詳細信息:
function logException ($exception) {
// Construct the error message to add to the log file
$logDate = date("l, F j, Y H:i:s");
$logMessage = "Date: " . $logDate . "\n";
$logMessage = $logMessage . "Error Message: ". $exception->getMessage() . "\n";
$logMessage = $logMessage . "Error Code: ". $exception->getCode() . "\n";
$logMessage = $logMessage . "Error File: ". $exception->getFile() . "\n";
$logMessage = $logMessage . "Error Line: ". $exception->getLine() . "\n";
$logMessage = $logMessage . "Error Trace:\n". $exception->getTraceAsString() . "\n";
$logMessage = $logMessage . "\n\n**************************************" . "\n\n\n";
// Construct a log file name similar to the name of the script file that cause the error
$info = pathinfo($exception->getFile());
$extension = "." . $info["extension"];
$logFile = "../logs/" . basename($exception->getFile(), $extension) . ".log";
// Add the error message to the log file
error_log($logMessage, 3, $logFile);
// Message to return to the user
$errorMessage = "System error, please try again, if the error persists, then please contact support.";
return $errorMessage;
}
try {
$dbh = new PDO("mysql:host=$host;dbname=$database", $username, $password);
$dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$stmt = $dbh->prepare("INSERT INTO table (column) values (value)");
$stmt->execute();
}
// Catching all sorts of errors, including PDO errors
catch (Exception $e) {
$message = logException ($e);
$data['message'] = $message;
$data['isSuccessful'] = false;
}
請注意以下事項:
現在,你有一個問題,如果你想拋出一個想讓用戶看到的異常(例如,你想拋出一個異常,如「這是錯誤的,請嘗試安捷倫」 )?那麼,我確實想出了一個擴展到這個的解決方案,但它已經超出了你的要求。但如果你仍然想知道,那麼請讓我知道。
乾杯。
你的問題不是100%清楚..但如果我理解你正確,我可以建議你使用> try {} catch(){} – Svetoslav