尽管error_reporting(E_ALL)& error_log类型3的用法

时间:2014-04-25 12:55:17

标签: php error-handling error-logging error-log

我的PHP版本是5.5.7。

我设置error_reporting(E_ALL);

然后我故意写错我的数据库密码。

当我在使用die()之前使用error_log()时,我的屏幕会显示2条消息:警告和错误:

Warning: mysqli::mysqli(): (42000/1044): Access denied for user 'user'@'%' to database 'database' in /folder/folder/folder/www/folder/file.php on line 2

Connect Error (1044) Access denied for user 'user'@'%' to database 'database'

删除die()代码并应用下面的代码后,我预计自定义日志文件中的所有日志。然而;当日志文件包含我创建的消息时,我仍然在屏幕上显示敏感信息的警告。

$DBconn = new mysqli($DBhost, $DBuser, $DBpass, $DBname, $DBport);

if ($DBconn->connect_error) 
{           
    error_log("Connect Error! ".$DBconn->connect_errno.' '.$DBconn->connect_error."\n\r", 3, "/home/www/host/PHP_errors.log");
}

问题:

我做错了什么?如何将所有类型的错误打印到日志文件中?

2 个答案:

答案 0 :(得分:0)

屏幕上的错误显示由display_errors指令控制。设置另外两个是独立的。

答案 1 :(得分:0)

默认情况下,mysqli会针对错误抛出PHP警告。这并不理想,尤其是在您希望查看错误但又不希望屏幕上显示有关数据库的敏感信息的情况下。

我建议您更改mysqli的报告模式以改为抛出异常 - 这样您就可以捕获它们然后处理和记录。我的下面的例子展示了你如何做到这一点:

mysqli_report(MYSQLI_REPORT_STRICT);

try {

    $DBconn = new mysqli($DBhost, $DBuser, $DBpass, $DBname, $DBport);

} catch (Exception $e) {

    error_log(
        "Connect Error! ".$e->getMessage()."\n",
        3,
        "/home/www/host/PHP_errors.log"
    );

}

如果您不是异常的粉丝,那么您可以通过更改error_reporting声明来禁用PHP警告的报告,将其排除在外:

error_reporting(E_ALL ^ E_WARNING);

但这会禁用所有警告的报告 - 而不仅仅是来自mysqli的警告。