【问题标题】:PHP - set_error_handler doesn't catch mysqli errorsPHP - set_error_handler 不捕获 mysqli 错误
【发布时间】:2015-10-15 08:36:40
【问题描述】:

我正在尝试为 mysqli 错误定义一个自定义错误处理程序。关注我的数据库单例:

<?php

class Database extends mysqli
{
    private static $instance;
    public function __construct($host, $user, $password, $database)
    {
        set_error_handler('self::error', MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
        mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
        parent::__construct($host, $user, $password, $database);
    }

    public static function instance()
    {
        if (self::$instance === null) {
            self::$instance = new self('example', 'example', 'example', 'example');
        }

        return self::$instance;
    }

    public static function error()
    {
        echo 'database error';
        error_log('...');
        exit();
    }
}

尝试以下代码我在屏幕上没有看到“数据库错误”,并且错误日志文件中没有三个点:

<?php
include 'database.singleton.php';
$query = Database::instance()->prepare('wrong query');
$query->bind_param('si', $test, $test);
$query->execute();
$query->close();

相反,错误日志文件中有消息Fatal error: Uncaught exception 'BadMethodCallException' with message 'Call to a member function bind_param() on a non-object (boolean)。错误是真的,因为查询是故意错的,所以$query是假的,但是我想用Database::error()处理所有mysqli错误。我尝试将set_error_handler('self::error', MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT); 替换为set_error_handler('self::error');set_error_handler('self::error()');,但我看不出有任何区别。我该如何解决?

【问题讨论】:

    标签: php mysqli


    【解决方案1】:

    如您所见,MySQLi 使用异常(也许 PHP 中的大多数新功能都停止使用过时的错误 API 并转向异常 API)。 Exception 和 Error 的区别可以参考here

    您的示例代码抛出了一个 BadMethodCallException,它没有被 set_error_handler 捕获并冒泡成为一个致命错误(注意 set_error_handler 无法捕获致命错误)

    所以解决方案是使用 Exception 及其补充:try ... catch 块,或 set_exception_handler。

    问候,

    【讨论】:

    • 感谢您的回复,我怎样才能使用 set_exception_handler 来处理仅 mysqli 异常?所以我现有的处理mysqli错误的代码完全没用?
    • 异常API是一个以异常为根的类的层次结构。您可以检查传递给处理函数的对象的实例。只有 mysqli 异常检查 instanceof mysqli_sql_exception 类。您还可以使用错误处理程序,只需捕获异常并抛出错误,然后通过错误处理程序捕获它。问候
    猜你喜欢
    • 1970-01-01
    • 2018-08-13
    • 1970-01-01
    • 2013-10-12
    • 1970-01-01
    • 2012-01-21
    • 2018-03-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多