捕捉Mysqli错误

时间:2013-10-05 04:20:37

标签: php exception error-handling mysqli

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

2 个答案:

答案 0 :(得分:4)

  

这是正常的吗?

没有

  

是否有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');

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

答案 1 :(得分:0)

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

if( - query - ){ - 做某事 - }免费结果。

当查询在语法上正确时,这可以正常工作。但是,如果查询失败,则无法释放结果。这就是错误并导致页面显示为没有加载。一旦我将“免费结果”移动到括号内,例如

if( - query - ){ - 做某事 - 免费结果}

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

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