PHP 5.05 無法使用 mysqli_sql_exception 類別
我使用以下程式碼來捕捉錯誤
<?php
$query = "SELECT XXname FROM customer_table ";
$res = $mysqli->query($query);
if (!$res) {
printf("Errormessage: %s\n", $mysqli->error);
}
?>
這個方法的問題在於 $res 的有效值為:mysqli_result 物件、true 或 false
這並不能告訴我們 SQL 語法發生錯誤。
如果您傳遞更新語句,如果更新失敗,false 是一個有效結果。
因此,更好的方法是
<?php
$query = "SELECT XXname FROM customer_table ";
$res = $mysqli->query($query);
if (!empty($mysqli->error)) {
printf("錯誤訊息:%s\n", $mysqli->error);
}
?>
這會輸出類似以下的訊息
未預期的 PHP 錯誤 [mysqli::query() [<a href='function.query'>function.query</a>]: (42S22/1054): 'field list' 中的欄位 'XXname' 不明] 嚴重性 [E_WARNING] 位於 [G:\database.php] 的 [249] 行
非常令人沮喪,因為我還想捕捉 SQL 錯誤並印出堆疊追蹤。
更好的方法是
<?php
mysqli_report(MYSQLI_REPORT_OFF); $mysqli = new mysqli("localhost", "my_user", "my_password", "world");
$query = "SELECT XXname FROM customer_table ";
$res = $mysqli->query($query);
if ($mysqli->error) {
try {
throw new Exception("MySQL 錯誤 $mysqli->error <br> 查詢:<br> $query", $msqli->errno);
} catch(Exception $e ) {
echo "錯誤代碼: ".$e->getCode(). " - ".$e->getMessage() . "<br >";
echo nl2br($e->getTraceAsString());
}
}
?>
會印出類似以下的內容
錯誤代碼: 1054
欄位清單中找不到 'XXname' 欄位
查詢
SELECT XXname FROM customer_table
#0 G:\\database.php(251): database->dbError('欄位清單中找不到 ...', 1054, 'getQuery()', 'SELECT XXname F...')
#1 G:\data\WorkSites\1framework5\tests\dbtest.php(29): database->getString('SELECT XXname F...')
#2 c:\PHP\includes\simpletest\runner.php(58): testOfDB->testGetVal()
#3 c:\PHP\includes\simpletest\runner.php(96): SimpleInvoker->invoke('testGetVal')
#4 c:\PHP\includes\simpletest\runner.php(125): SimpleInvokerDecorator->invoke('testGetVal')
#5 c:\PHP\includes\simpletest\runner.php(183): SimpleErrorTrappingInvoker->invoke('testGetVal')
#6 c:\PHP\includes\simpletest\simple_test.php(90): SimpleRunner->run()
#7 c:\PHP\includes\simpletest\simple_test.php(498): SimpleTestCase->run(Object(HtmlReporter))
#8 c:\PHP\includes\simpletest\simple_test.php(500): GroupTest->run(Object(HtmlReporter))
#9 G:\all_tests.php(16): GroupTest->run(Object(HtmlReporter))
這實際上會印出錯誤、堆疊追蹤和有問題的 SQL 陳述式。當 SQL 陳述式是在程式碼的其他地方產生時,這會更有幫助。