mysqli_sql_exception 类在 PHP 5.05 中不可用
我使用此代码来捕获错误
<?php
$query = "SELECT XXname FROM customer_table ";
$res = $mysqli->query($query);
if (!$res) {
printf("错误消息:%s\n", $mysqli->error);
}
?>
此代码的问题是 $res 的有效值为:mysqli_result 对象、true 或 false
这并不能告诉我们使用的 sql 是否发生了错误。
如果您传递更新语句,如果更新失败,false 是一个有效的结果。
因此,更好的方法是
<?php
$query = "SELECT XXname FROM customer_table ";
$res = $mysqli->query($query);
if (!$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
表 'field list' 中不存在列 'XXname'
查询
SELECT XXname FROM customer_table
#0 G:\\database.php(251): database->dbError('表 'field list' 中不存在列 ...', 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 语句在代码中的其他位置生成时,这更有帮助。