簡單的問題我想,我想用PHP寫一個更新到我的數據庫中的現有行,如果沒有發生我想記錄失敗,但繼續執行代碼。儘管有失敗的記錄來追蹤問題會很好,但更新失敗對我的用戶並不重要,也不會影響任何其他代碼的運行;該查詢僅僅是爲了「美觀」而非完全不必要的信息。如何編寫我的代碼以嘗試數據庫操作,但在失敗時繼續執行代碼?
我的數據庫類的查詢功能被設置爲在失敗時死亡,我可以修改它還是有另一種方式做到這一點,而不會改變我的標準查詢代碼?
簡單的問題我想,我想用PHP寫一個更新到我的數據庫中的現有行,如果沒有發生我想記錄失敗,但繼續執行代碼。儘管有失敗的記錄來追蹤問題會很好,但更新失敗對我的用戶並不重要,也不會影響任何其他代碼的運行;該查詢僅僅是爲了「美觀」而非完全不必要的信息。如何編寫我的代碼以嘗試數據庫操作,但在失敗時繼續執行代碼?
我的數據庫類的查詢功能被設置爲在失敗時死亡,我可以修改它還是有另一種方式做到這一點,而不會改變我的標準查詢代碼?
這是例外擅長的。
微小例如使用的MySQL
class Db
{
function query($sql)
{
$result = @mysql_query($sql);
$error = mysql_error();
if (!empty($error))
{
throw new DbException($error);
}
return $result;
}
}
類DbException延伸異常{}
然後
try {
$db = new Db;
$db->query('select * from table');
}
catch (DbException $e)
{
// do nothing - we want silent failure
}
那麼,我只是拿出die()
。僅此而已,它將阻止它停止所有的CGI執行。如果您不知何故想記錄故障,爲什麼不添加寫入日誌文件的函數,或者可能會向您發送一封包含故障的電子郵件(如果您不是在談論高故障率,而只是想調試) 。
if(mysql_query($sql)){
// Database command succeeds
}
else{
// Database command fails
}
除掉模具的()呢?
我建議使用trigger_error()
代替死亡。通過標準錯誤輸出您會收到錯誤通知。
我會實現一個記錄/郵寄錯誤的方法。您的最終用戶根本不會注意到任何事情。
$query = mysql_query($sql) or log_error($sql);
// continue executing code
function log_error($sql) {
// Code that writes to a log file
// Notify tech support
mail("[email protected]", "Error while updating DB", $sql . " at time: " . time());
}
考慮使用trigger_error()而不是log_error,因爲它更加靈活,並且在開發階段有很大的優勢 – 2010-04-05 16:57:25
那麼,與$ db-> query('select * from table')有什麼區別?如果我們想要沉默失敗,沒有嘗試抓住? ;) – 2010-04-05 16:58:57
關鍵是不要讓Db :: query * always *默默地失敗 - 就在你想要的時候。此外,還有更多的靈活性 - 調用腳本可以記錄錯誤或採取其他操作。 – 2010-04-05 17:02:11