gpt4 book ai didi

php - 捕捉 Mysqli 错误

转载 作者:行者123 更新时间:2023-12-03 07:40:27 26 4
gpt4 key购买 nike

我定义了一个自定义错误处理程序,它捕获所有异常并将它们保存到日志中。现在,如果我在 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 仍然运行它的脚本?

最佳答案

Is this normal?



不。

Is there a PHP setting that I should check to fix this so that any mysqli query errors throw exceptions?



是的。
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);

然而,并非所有 mysqli_* 函数都会引发 DB 错误,其中一些会引发常规 PHP 错误,例如 free()确实如此,而这部分让我更加好奇:我也非常好奇,为什么你只处理异常却不处理 PHP 错误。不要告诉我你 have error_reporting(0); - 你?如果是这样 - 我无话可说。

最后,我怀疑您的代码中散布着原始的 mysqli->query()。意思是
  • 您没有使用占位符来构建查询 - 使得 SQL 注入(inject)不可避免。
  • 您的代码臃肿且不可读

  • 您必须使用一个抽象库来放置 所有重复代码进入类方法。查看您的查询运行 safeMysql :
    $data = $db->getAll('SELECT bad_field_reference FROM table');

    无需水平滚动即可阅读,安全、简洁、防错和 支持占位符!

    关于php - 捕捉 Mysqli 错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19193911/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com