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] in [G:\database.php] line [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' 在 'field list' 中
查询
SELECT XXname FROM customer_table
#0 G:\\database.php(251): database->dbError('Unknown column ...', 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语句在代码的其他地方生成时,这更有帮助。