我定义了一个自定义错误处理程序,它捕获所有异常并将它们保存到日志中。现在,如果我在 mysqli 查询中出现语法错误(例如拼写错误),页面将在此时完全停止加载。不会引发异常,因此不会触发错误处理程序并且不会记录任何内容。
这是正常的吗?我应该检查 PHP 设置来修复此问题,以便任何 mysqli 查询错误都会引发异常吗?
(我不希望在查询返回 0 个结果时抛出异常 - 仅当由于查询结构中的拼写错误或其他错误而出错时)
查询示例:
if($result=$db->query('SELECT bad_field_reference FROM table')){while($r=$result->fetch_assoc()){$data[]=$r;}}$result->free();
如果我尝试在 PHPMyAdmin 中执行此查询,它会告诉我列 bad_field_reference 不存在。如果我尝试将其作为 PHP 脚本的一部分执行,整个页面将在此时停止加载。
澄清我只是通过查看页面源代码进行一些测试。显然,页面的其余部分确实会加载 - 但是,当启用 java 时,某些项目会被隐藏,然后我使用 jquery 以动画方式重新显示某些内容。这些 jquery 脚本没有运行,因此页面似乎已停止加载。
那么 - 现在有 2 个问题 - 如何让 PHP '捕获' 错误,以及如何让 jquery 仍然运行它的脚本?
这是正常的吗?
No.
我应该检查 PHP 设置来修复此问题,以便任何 mysqli 查询错误都会引发异常吗?
Yes.
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
然而,并非所有 mysqli_* 函数都会引发数据库错误,其中一些函数会引发常规 PHP 错误,例如free()
确实如此,这部分让我更加想知道:我也非常好奇,为什么只处理异常而不处理 PHP 错误。别告诉我你have error_reporting(0);
- 你?如果是这样的话——我无话可说。
最后,我怀疑您的原始 mysqli->query() 分散在代码中。意思是
- 您没有使用占位符来构建查询 - 这使得 SQL 注入不可避免。
- 你的代码臃肿且不可读
你必须使用一个抽象库来放置所有重复的代码进入类方法。查看您的查询运行情况安全Mysql:
$data = $db->getAll('SELECT bad_field_reference FROM table');
它不需要水平滚动阅读它,安全、简洁、防错、支持占位符!
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)