目前,我最好的處理MySQL的錯誤方式是每一個MySQL的語句之後補充一點:有沒有辦法將事件處理函數附加到mysql錯誤?
if($mysqli->error)
errorhandlingfunction();
有沒有辦法每一個有錯誤的時間創建一個類型處理器爲MySQL錯誤並分配一個function而不是每次都要手動檢查?
目前,我最好的處理MySQL的錯誤方式是每一個MySQL的語句之後補充一點:有沒有辦法將事件處理函數附加到mysql錯誤?
if($mysqli->error)
errorhandlingfunction();
有沒有辦法每一個有錯誤的時間創建一個類型處理器爲MySQL錯誤並分配一個function而不是每次都要手動檢查?
創建擴展mysqli
並在發生錯誤時拋出異常的新類:
/* Create custom exception classes */
class ConnectException extends Exception {}
class QueryException extends Exception {}
class Mysqlie extends mysqli
{
function __construct()
{
parent::init();
if (!parent::options(MYSQLI_INIT_COMMAND, 'set session sql_mode="strict_all_tables";')) {
throw new ConnectException("Cannot set MySQL options");
}
$args = func_get_args();
$result = call_user_func_array("parent::real_connect", $args);
/* Pass all arguments passed to the constructor on to the parent's constructor */
if (!$result) {
throw new ConnectException('Connect Error (' . mysqli_connect_errno() . ') '. mysqli_connect_error());
}
}
function query($query)
{
$result = parent::query($query);
if(mysqli_error($this)){
throw new QueryException(mysqli_error($this), mysqli_errno($this));
}
return $result;
}
}
那麼你的代碼變成:
try {
$conn = new mysqlie(...connection parameters...);
$result = $conn->query("MyQuery");
// do lots more stuff here
// including more queries
$result = $conn->query("MyNextQuery");
// finally close...
$conn->close();
} catch (ConnectException $e)) {
die("Can't connect to database".$e->getMessage());
} catch (QueryException $e) {
die("Query error:".$e->getMessage());
}
您try
塊的內容可明顯大得多幷包含多個查詢。
我該如何添加一個函數來捕獲參數化語句? – user1755043
進一步擴展該類以包含覆蓋父方法的'prepare','bind'和'execute'方法。添加與我在這裏添加的類似的新異常(可能是ExecuteException)。捕獲類中的任何錯誤,並拋出一個新的異常。您可以根據需要添加儘可能多的catch塊,每個塊捕獲不同的異常。 – 2013-07-03 00:41:44
可能重複的[MySQLi錯誤處理](http://stackoverflow.com/questions/2932113/mysqli-error-handling) – peterm