使用PHP和mysqli,是否可以在所有PHP脚本中的一个位置捕获所有mysqli错误?

时间:2012-03-10 02:01:50

标签: php error-handling mysqli

是否可以使用一个语句在一个地方捕获mysqli调用的所有错误,或者我是否必须单独检查每个mysqli调用以查找错误?

我想按照以下方式做点什么:

if(mysqli_error_occurs_anywhere_in_web_app) {
    die('<html><head></head><body>database error</body></html>');
}

基本上如果在我想输出html数据库错误文档的任何地方发生mysqli错误。这有可能吗?

3 个答案:

答案 0 :(得分:2)

您可以将所有查询包装在您自己的查询函数上,而不是直接在任何地方调用mysqli_query。例如,在您自己的DB对象中。这样,如果您需要切换数据库实现,您只需切换到一个新的数据库对象,其查询函数的实现略有不同,而不是直接搜索/替换对mysqli_query的调用。它还具有使错误处理变得非常容易和集中的好处。

答案 1 :(得分:1)

您需要首先询问的是,您是否希望以相同的方式处理所有数据库错误。如果您无法连接到您的数据库,这是一个严重的错误,可能表明您的数据库服务器已关闭。在这种情况下,您可能需要向您发送某种紧急警报(如果您还没有以另一种方式监控您的数据库)。如果查询由于SQL语法错误而失败,则可能表示您没有转义输入数据,或者您的代码中存在错误。在这种情况下,您可能希望尽可能多地记录信息,以便稍后调试/排序问题。

所以,除此之外,你可能需要的第一件事是包装你的mysqli函数,以便你可以捕获各种错误并按需要处理它们(通过编写自己的数据库类或使用自己的函数) - PHP文档提供了有关如何开始执行此操作的示例(mysqli docs)。或者您可以查看PDO,其中AFAIAA具有更多有用的错误处理(异常和返回值的混合)。

然后,您需要在代码中使用一个单点来处理此问题。如果你有某种前置控制器,你可以把它放在那里。或者您也可以编写自己的自定义异常处理程序来实现所需(set_exception_handler)。

最快最脏的解决方案是编写自己的自定义错误处理程序来捕获并解析所有错误并采取相应措施(可能重定向到已正确记录任何信息的db错误页面)。但我确实说这是最脏的解决方案吗?

答案 2 :(得分:0)

您可以尝试设置global exception handler并检查捕获的异常是否属于proper class