【问题标题】:With PHP and mysqli, is it possible to catch all mysqli errors in one place across all PHP scripts?使用 PHP 和 mysqli,是否可以在所有 PHP 脚本中在一个地方捕获所有 mysqli 错误?
【发布时间】:2012-03-10 02:01:49
【问题描述】:

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

我想做一些类似的事情:

如果(mysqli_error_occurs_anywhere_in_web_app){
    die('数据库错误');
}

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

【问题讨论】:

    标签: php error-handling mysqli


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

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

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

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

      最快和最肮脏的解决方案是编写您自己的自定义错误处理程序来捕获和解析所有错误并采取相应措施(可能重定向到已适当记录任何信息的数据库错误页面)。但我确实说过这是最肮脏的解决方案,对吧?

      【讨论】:

        【解决方案3】:

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

        【讨论】:

          猜你喜欢
          • 2014-01-22
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2012-07-08
          • 1970-01-01
          • 2011-11-15
          • 2017-05-10
          相关资源
          最近更新 更多