2

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

4

2 回答 2

4

这是正常的吗?

不。

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

是的。

mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);

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

最后,我怀疑您的代码中散布着原始的 mysqli->query()。意思是

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

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

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

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

于 2013-10-05T09:15:58.817 回答
0

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

if(--query--){--do something--}免费结果。

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

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

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

if($db->error){handle error}
于 2013-10-05T07:15:46.507 回答