Предупреждение PHP все еще отображается на экране, несмотря на error_reporting(E_ALL) и использование error_log типа 3

Моя версия 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");
}

вопрос:

Что я делаю не так? как я могу добиться того, чтобы все виды ошибок печатались в файл журнала?


person Andre Chenier    schedule 25.04.2014    source источник


Ответы (2)


По умолчанию 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"
    );

}

Если вы не поклонник исключений, вы можете отключить сообщения о предупреждениях PHP, изменив объявление error_reporting, чтобы исключить их следующим образом:

error_reporting(E_ALL ^ E_WARNING);

Но это отключит сообщения о всех предупреждениях, а не только о предупреждениях от mysqli.

person madebydavid    schedule 25.04.2014
comment
Я использовал 1-е предложение (за исключением). Это сработало. Теперь на экране нет конфиденциальных данных. (Предупреждение на экране исчезло) В моем файле журнала зарегистрирована ошибка. Спасибо. С уважением. - person Andre Chenier; 25.04.2014

Отображением ошибок на экране управляет display_errors. директива. Установка двух других не зависит от этого.

person deceze♦    schedule 25.04.2014