传统上,PHP对代码中的错误实践和失败是宽容的,
这使得调试非常困难。
在这个特定的情况下,问题是mysqli和PDO
默认情况下,查询失败时不告诉你,只返回FALSE。
(我不会谈论被废弃的mysql扩展。
对预处理语句的支持是切换到PDO或mysqli的充分理由。)
但是您可以更改PHP的默认行为,在查询失败时总是抛出异常。
对于PDO:使用$ PDO ->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
error_reporting(E_ALL);
$pdo = new PDO("mysql:host=localhost;dbname=test", "test","");
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$result = $pdo->query('select emal from users');
$data = $result->fetchAll();
这将显示以下内容:
致命错误:未捕获的异常'PDOException'与消息'SQLSTATE[42S22]:列未找到:1054未知列'emal'在'字段列表"在E:\htdocs\test\mysql_errors\pdo.php第8行
PDOException: SQLSTATE[42S22]:列未找到:1054在E:\htdocs\test\mysql_errors\pdo.php第8行“字段列表”中未知列“emal
如您所见,它准确地告诉您查询有什么问题,以及在代码中的哪里修复它。
没有$pdo->setAttribute(pdo::ATTR_ERRMODE, pdo::ERRMODE_EXCEPTION);
你会得到
致命错误:在E:\htdocs\test\mysql_errors\pdo.php第9行调用成员函数fetchAll(
mysqli:使用mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
error_reporting(E_ALL);
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
$mysqli = new mysqli('localhost', 'test', '', 'test');
$result = $mysqli->query('select emal from users');
$data = $result->fetch_all();
你会得到
致命错误:未捕获的异常'mysqli_sql_exception'与消息'未知列'emal'在'字段列表"在E:\htdocs\test\mysql_errors\mysqli.php第8行
mysqli_sql_exception:在E:\htdocs\test\mysql_errors\mysqli.php第8行“字段列表”中的未知列“emal
没有MYSQLI_REPORT_ERROR (MYSQLI_REPORT_STRICT);你只能得到
致命错误:在E:\htdocs\test\mysql_errors\mysqli.php的第10行调用成员函数fetch_all(
当然,您可以手动检查MySQL错误。
但如果每次我打错字都要这么做,我会疯掉的
或者更糟——每次我想查询数据库的时候。