当前位置: 首页 > 知识库问答 >
问题:

捕捉MySQL错误

郦兴德
2023-03-14

我定义了一个自定义错误处理程序,它捕获所有异常并将其保存到日志中。现在,如果我在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\u field\u引用不存在。如果我尝试将其作为PHP脚本的一部分执行,则整个页面将停止加载。

为了澄清这一点,我只是通过查看页面源代码进行了一些测试。显然页面的其余部分是加载的——但是,当启用java时,某些项目是隐藏的,然后我使用jquery以动画方式重新显示一些内容。这些jquery脚本没有运行,因此页面似乎已停止加载。

那么,现在有两个问题--如何让PHP捕获错误,以及如何让jQuery仍然运行它的脚本?

共有2个答案

狄德泽
2023-03-14

我想出了“锁定”部分的解决方案。在我的代码示例中,我有以下格式:

如果(--query--){--do something--}释放结果。

当查询在语法上是正确的时,这可以正常工作。但是,如果查询失败,则无法释放结果。这是什么是游移,并导致页面似乎没有加载。一旦我在括号内移动了“免费结果”,比如

如果(--query--){--do something--free result}

它工作正常,没有引起任何问题。如果查询错误,它仍然不会触发异常,但目前我正在通过在查询之后创建一个快速脚本来修复此问题,例如:

if($db->error){handle error}
伏德义
2023-03-14

这正常吗?

是否有一个PHP设置,我应该检查来修复这个问题,以便任何mysqli查询错误抛出异常?

mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);

然而,并非所有mysqli_*函数都会引发DB错误,其中一些函数会引发常规的PHP错误,比如free()会,这一部分让我更加好奇:我也非常好奇,为什么只处理异常而不处理PHP错误。不要告诉我你有错误报告(0) -你知道吗?如果是的话,我什么也说不出来。

最后,我怀疑你有原始的MySQL

  • 您没有使用占位符来构建查询,这使得SQL注入不可避免

您必须使用一个抽象库,将所有重复的代码放入类方法中。看到你的查询运行安全MySQL:

$data = $db->getAll('SELECT bad_field_reference FROM table');

它不需要水平滚动来阅读它,它是安全的,简洁的,防错误的,并支持占位符!

 类似资料:
  • 问题内容: 我听说捕捞被认为是不好的作法。我当前正在加载一个不能保证在PATH上的.dll,并希望在不存在的情况下切换到用户配置的位置。 有更好的方法吗?还是在这里接受是可以接受的? 问题答案: 除了提供有关如何从技术上解决问题的建议以外,我想花点时间解释一下为什么它首先被认为是“不好的做法”。 让我们从澄清什么是类开始。 在Java中,将引发错误和异常(它们是主要类型)。通过使用关键字可以完成上

  • 我正在开发一个django应用程序,它可以与几个Amazon Web服务进行通信。 到目前为止,我在处理和捕获boto3客户端抛出的异常方面遇到了困难。我正在做的事情似乎不必要地单调乏味: 例子: 如果令牌坏了,这可能会抛出一个。 可能会抛出一个。 首先,我在代码中的任何地方都找不到这些错误,所以它们可能是在某个地方生成的。一句话:我不能像往常一样导入和捕获它。 其次,我发现了一种方法来捕获错误这

  • 我有以下代码: null 我做错了什么?当MySQL抛出有关查询的错误时,我如何捕获?

  • 在节点中。在js服务器上,捕获SIGTERM和捕获SIGINT有什么区别吗? 我认为进程不应该能够防止SIGINT关闭? 我是否能够捕获两个信号并阻止退出?我的实验表明答案是肯定的,但从我所读到的内容来看,SIGINT总是假设关闭一个进程。 或者我把SIGINT和SIGKILL混淆了?也许SIGKILL是我无法恢复的信号? 捕捉这些信号当然可以让我优雅地关机: 我想我把SIGINT和SIGKILL

  • 我的数据服务如下所示: 如果我得到一个HTTP错误(即404),我会从core得到一条令人讨厌的控制台消息:error error:Uncaught(promise):[object]。es5。在我的情况下,我该如何处理?

  • 问题内容: 在Java中是否有捕捉到内存不足错误()的问题? 问题答案: 是的 。以下是一些可能有意义的示例: 如果您想通过 优雅地关闭 程序来处理它 如果要向用户显示问题或 记录错误 根据您的设计,您甚至可以清理内存并 恢复工作状态 但是 ,请注意,通常情况下(除非您处在一次要分配大量内存的位置),对于这些情况,您可能不会专门捕获OutOfMemoryError,而是始终在顶部进行操作主要入口点