捕获 Mysqli 错误


Catching Mysqli Errors

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

这正常吗?

不。

是否有我应该检查的 PHP 设置来解决此问题,以便任何 mysqli 查询错误都会引发异常?

是的。

mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);

但是,并非所有的 mysqli_* 函数都会引发数据库错误,其中一些会引发常规的 PHP 错误,就像free()一样,这部分让我更加想知道:我也非常好奇,为什么你只处理异常而让 PHP 错误不处理。不要告诉我你have error_reporting(0); - 是吗?如果是这样 - 我无言以对。

最后,我怀疑你有原始的mysqli->query((分散在代码中。这意味着

  • 您不使用占位符来构建查询 - 这使得 SQL 注入不可避免。
  • 您的代码臃肿且不可读

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

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

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

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

if(--query--({--do something--}free result.

当查询语法正确时,这工作正常。但是,如果查询失败,则没有要释放的结果。这就是错误并导致页面看起来好像没有加载的原因。 一旦我将"免费结果"移到括号内,例如

if(--query--

({--do something-- free result}

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

if($db->error){handle error}