我正在尝试为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()');
,但我认为没有任何区别。我怎么解决?
答案 0 :(得分:-1)
正如您所看到的,MySQLi使用Exception(也许PHP中的大多数新功能都停止使用过时的错误API并转移到Exception API)。对于异常和错误之间的差异,您可以找到它here
你的示例代码抛出一个BadMethodCallException,它没有被set_error_handler捕获并冒泡成为致命错误(注意set_error_handler无法捕获致命错误)
所以解决方案是使用Exception及其补充:try ... catch block或set_exception_handler。
此致