2010-04-05 55 views
1

簡單的問題我想,我想用PHP寫一個更新到我的數據庫中的現有行,如果沒有發生我想記錄失敗,但繼續執行代碼。儘管有失敗的記錄來追蹤問題會很好,但更新失敗對我的用戶並不重要,也不會影響任何其他代碼的運行;該查詢僅僅是爲了「美觀」而非完全不必要的信息。如何編寫我的代碼以嘗試數據庫操作,但在失敗時繼續執行代碼?

我的數據庫類的查詢功能被設置爲在失敗時死亡,我可以修改它還是有另一種方式做到這一點,而不會改變我的標準查詢代碼?

回答

2

這是例外擅長的。

微小例如使用的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 
} 
+0

那麼,與$ db-> query('select * from table')有什麼區別?如果我們想要沉默失敗,沒有嘗試抓住? ;) – 2010-04-05 16:58:57

+0

關鍵是不要讓Db :: query * always *默默地失敗 - 就在你想要的時候。此外,還有更多的靈活性 - 調用腳本可以記錄錯誤或採取其他操作。 – 2010-04-05 17:02:11

0

那麼,我只是拿出die()。僅此而已,它將阻止它停止所有的CGI執行。如果您不知何故想記錄故障,爲什麼不添加寫入日誌文件的函數,或者可能會向您發送一封包含故障的電子郵件(如果您不是在談論高故障率,而只是想調試) 。

1
if(mysql_query($sql)){ 
    // Database command succeeds 
} 
else{ 
    // Database command fails 
} 
1

除掉模具的()呢?

我建議使用trigger_error()代替死亡。通過標準錯誤輸出您會收到錯誤通知。

0

我會實現一個記錄/郵寄錯誤的方法。您的最終用戶根本不會注意到任何事情。

$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()); 
} 
+0

考慮使用trigger_error()而不是log_error,因爲它更加靈活,並且在開發階段有很大的優勢 – 2010-04-05 16:57:25