PHP - set_error_handler没有捕获mysqli错误

时间:2015-10-15 08:36:41

标签: php mysqli

我正在尝试为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为false,但我想用Database::error()处理所有mysqli错误。我尝试将set_error_handler('self::error', MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);替换为set_error_handler('self::error');以及set_error_handler('self::error()');,但我认为没有任何区别。我怎么解决?

1 个答案:

答案 0 :(得分:-1)

正如您所看到的,MySQLi使用Exception(也许PHP中的大多数新功能都停止使用过时的错误API并转移到Exception API)。对于异常和错误之间的差异,您可以找到它here

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

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

此致