我定义了一个自定义错误处理程序,它捕获所有异常并将它们保存到日志中。现在,如果我在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仍然运行它的脚本?
答案 0 :(得分:4)
这是正常的吗?
没有
是否有PHP设置我应该检查以解决此问题,以便任何mysqli查询错误抛出异常?
是
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
然而,并非所有mysqli_ *函数都会引发数据库错误,其中一些会引发常规的PHP错误,如free()
那样,这部分让我更加疑惑:我也非常好奇,为什么呢?您只处理异常,但未处理PHP错误。不要告诉我你have error_reporting(0);
- 你呢?如果是这样 - 我没有言语。
最后,我怀疑你在整个代码中散布了原始的mysqli-> query()。这意味着
您必须使用一个抽象库,将所有重复的代码放入类方法中。通过safeMysql查看您的查询:
$data = $db->getAll('SELECT bad_field_reference FROM table');
它不需要水平滚动来阅读它,它是安全,简洁,防错的,支持占位符!
答案 1 :(得分:0)
我找到了“锁定”部分的解决方案。在我的代码示例中,我有以下格式:
if( - query - ){ - 做某事 - }免费结果。
当查询在语法上正确时,这可以正常工作。但是,如果查询失败,则无法释放结果。这就是错误并导致页面显示为没有加载。一旦我将“免费结果”移动到括号内,例如
if( - query - ){ - 做某事 - 免费结果}
它工作正常,没有引起任何问题。如果查询错误,它仍然不会触发异常,但是现在我通过在查询之后创建一个快速脚本来修复它:
if($db->error){handle error}