2015-10-14 818 views
0

我要趕mysqli_stmt錯誤,如下面的僞代碼:如何捕獲PHP mysqli_stmt錯誤?

<?php 
include 'db.php'; 

try{ 
    $stmt=$db->prepare('INSERT INTO test(test_1, test_2) VALUES (?, ?)'); 
    $stmt->bind_param("is", $example_variable1, $example_variable2); 
    $stmt->execute(); 
    $stmt->close(); 
    echo 'data inserted successful, everything ok!'; 
}catch(mysqliError $e){ 
    echo 'please retry later!'; 
} 

我怎麼能這樣做?

+0

您可能需要檢查每種方法的返回值以捕獲錯誤。或者使用一個定製的類來包裝'mysqli_stmt'並拋出你自己的異常。 – Passerby

回答

1

首先,你應該never catch mysqli errors only to show such a message,因爲它是非常低效的(在包裝的try-catch每個查詢!)和有害的(因爲錯誤都將被記錄,而不是默默解僱)。

取而代之,您可以定義custom error handler並讓它記錄錯誤消息,然後顯示「請稍後重試」文本。當然,你希望它顯示任何查詢失敗時,不只是一個。

你得到了這個後,只要設置異常模式的mysqli,

mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT); 

這一行必須添加的mysqli連接之前。

而且您可以使用此示例代碼來處理您網站上的錯誤。請注意,在開發過程中,只需評論第一行。

set_error_handler("myErrorHandler"); 
function myErrorHandler($errno, $errstr, $errfile, $errline) 
{ 
    error_log("$errstr in $errfile:$errline"); 
    header('HTTP/1.1 500 Internal Server Error', TRUE, 500); 
    echo 'please retry later!'; 
    exit; 
} 
+1

是的,'MYSQLI_REPORT_STRICT'表示*拋出mysqli_sql_exception錯誤而不是警告*。 PHP總是那麼直觀...... –

+0

謝謝你的回覆,請問你能告訴我一個代碼示例嗎? – Mark