2013-10-05 172 views
2

我有一个定义的自定义错误处理程序,它捕获所有异常并将它们保存到日志中。现在,如果我在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脚本没有运行,所以页面似乎停止了加载。

所以 - 现在有两个问题 - 我如何让PHP'捕捉'错误,以及如何让jquery继续运行它的脚本?

+0

如果一个失败的mysqli查询导致您的整个脚本停止,并且您的错误处理程序未完成,那么您的错误处理程序本身就会出错。 –

+0

它适用于所有其他出现的错误/异常 - 仅在查询本身出现错误时才适用 – Alan

+0

显示用于查询的代码 –

回答

4

这是正常的吗?

有,我应该检查,以解决这一问题,使任何的mysqli查询错误抛出异常PHP的设置?

是的。

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'); 

它无需水平滚动读它,它是安全的,简洁的,防错和支持占位符!

+0

有一个异常处理程序和一个错误处理程序。如果查询中有错误,现在也不会触发。错误报告设置为2048 - 严格。占位符是指你准备好的陈述吗?我将它们用于所有插入/更新,但很少用于选择查询,因为唯一的输入是我可以轻松清理的整数值。 – Alan

+1

这是严重的妄想之一。你的网站对注入攻击是开放的 –

+0

说到错误处理程序 - 你怎么没有从'free()'调用告诉你一些“需要mysqli语句对象,但布尔给定”的错误消息? –

0

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

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

这个工作正常,当查询语法正确。但是,如果查询失败,则没有结果可用。这就是错误,并导致页面出现,如果它没有加载。有一次,我感动了括号,如

中的“自由的结果”如果( - 查询 - ){ - 做something--无结果}

它工作得很好,并没有造成任何问题。它仍然没有引发异常,如果查询是错误的,但现在我固定,通过建立这样的查询后快速脚本:

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