【问题标题】:PHP Warning is still on screen despite error_reporting(E_ALL) & usage of error_log type 3尽管 error_reporting(E_ALL) 和使用 error_log 类型 3,PHP 警告仍在屏幕上
【发布时间】:2014-04-25 12:55:16
【问题描述】:

我的 PHP 版本是 5.5.7。

我设置error_reporting(E_ALL);

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

当我在使用 error_log() 之前使用 die() 时,我的屏幕显示 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");
}

问题:

我做错了什么?如何实现将各种错误打印到日志文件中?

【问题讨论】:

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


    【解决方案1】:

    默认情况下,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 的警告。

    【讨论】:

    • 我使用了第一个提案(有例外)。有效。现在,屏幕上不存在敏感数据。 (屏幕上的警告已经消失)错误记录到我的日志文件中。谢谢。问候。
    【解决方案2】:

    屏幕上的错误显示由display_errors 指令控制。设置其他两个与此无关。

    【讨论】:

      猜你喜欢
      • 2010-12-13
      • 2012-03-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-05-25
      • 2020-02-15
      • 1970-01-01
      • 2014-08-23
      相关资源
      最近更新 更多