php - как предотвратить повреждение страницы, когда display_errors = 0 и на странице есть ошибки? - PullRequest
0 голосов
/ 15 сентября 2011

добрый вечер,
как установить пользовательскую ошибку ИЛИ предотвратить повреждение страницы, когда display_errors = 0 И на странице есть ошибки И я не знаю, что «условие, код и т. д.» вызовет эти ошибки?
например, в этом коде:

<?php
    /////////////////////////////////////////////
        ini_set("display_errors" , "0");
    /////////////////////////////////////////////
        $html  = '
            <table>
                <tr>
                    <td><img src="img0.gif" /></td>
                    <td><img src="img1.gif" /></td>
                    <td><img src="img2.gif" /></td>
                </tr>
            </table>
        ';
    /////////////////////////////////////////////
        $dom   = new domDocument();
        $dom  -> loadHTML($html);
        $xpath = new domXPath($dom);
    /////////////////////////////////////////////
        $query   = $xpath->query('.//table/tr/td');
        $image   = $query->item(1000000000); // <<---- item number 
        $img_src = $image->getElementsByTagName('img')->item(0)->getAttribute('src'); 
        echo $img_src;
    /////////////////////////////////////////////
?>

в этом коде, потому что нет item(1000000000), поэтому это приведет к ошибке ..
и bacause display_errors" , "0" все ошибки будут скрыты, а страница будет повреждена
Итак, как предотвратить этот ущерб?
я знаю, что могу предотвратить это, добавив простое условие, например:
if( $image <1 ){ die('error msg'); } до $img_src вар
но что делать, если у меня большой код больше 10000 строк, и я не знаю точно, какой код вызовет ошибку !!
мы можем предотвратить это с помощью httaccess? путем проверки источника страницы, если он пустой перенаправить на страницу ошибки ..
или мы можем предотвратить это некоторыми функциями в самом php?
есть идеи ?

Ответы [ 2 ]

2 голосов
/ 15 сентября 2011

Вы можете использовать set_error_handler .Чтобы установить обратный вызов в случае ошибки и вы можете прекратить выполнение сценария в дальнейшем.

Обновление
Только что обнаруженный пользовательский обработчик ошибок не работает с E_ERROR и другими типами ошибок.Это в документации PHP

Следующие типы ошибок не могут быть обработаны с помощью определяемой пользователем функции: E_ERROR, E_PARSE, E_CORE_ERROR, E_CORE_WARNING, E_COMPILE_ERROR, E_COMPILE_WARNING, а также большинство файлов E_STR, где было установлено большинство файлов E_STR) называется.

Так что это обходной путь, который я нашел в Интернете, и я проверил его с вашим сценарием, и он работает нормально.
Добавьте следующий код в начало вашего сценария:

// execute on shutdown
function shutdown_handle(){
    // get last error details if any
    $lerror = error_get_last();

    // if there is a Fatal (E_ERROR Type) las error then redirect to error page
    if($lerror && $lerror['type'] == E_ERROR)
        header('Location:error_page.php');
}
// register our shutdown handler
register_shutdown_function('shutdown_handle');

Здесь регистрируется функция отключения, которая выполняется при завершении скрипта из-за фатальной ошибки, независимо от того, включено или выключено display_errors.

И там мы проверяем, была ли последняя ошибка фатальнойодин, если так, мы перенаправляем на error_page.php.

Примечание. Следует обратить внимание на то, что перенаправление все еще работает, если display_errors включен.Я проверил это, и он работает нормально.Это может быть из-за того, что output_buffering включен на моем сервере.

Обновление 2:
Это полный файл PHP с вашим кодом с добавленным обработчиком завершения работы.Это работает очень хорошо и перенаправляет на error_page.php.Измените это на страницу, на которую вы хотите перенаправить .:

<?php
    ////////////////////////////////////////////////
    // Shutdown handler to catch E_ERROR on shutdown 
    // even with display_errors OFF

    // function which will execute on shutdown
    function shutdown_handle(){
        // get last error details if any
        $lerror = error_get_last();

        // if there is a Fatal (E_ERROR Type) last error
        // then redirect to error page
        if($lerror && $lerror['type'] == E_ERROR)
            header('Location:error_page.php');
    }
    // register our shutdown handler
    register_shutdown_function('shutdown_handle');
    //////////////////////////////////////////////////

    /////////////////////////////////////////////
        ini_set("display_errors" , "1");
    /////////////////////////////////////////////
        $html  = '
            <table>
                <tr>
                    <td><img src="img0.gif" /></td>
                    <td><img src="img1.gif" /></td>
                    <td><img src="img2.gif" /></td>
                </tr>
            </table>
        ';
    /////////////////////////////////////////////
        $dom   = new domDocument();
        $dom  -> loadHTML($html);
        $xpath = new domXPath($dom);
    /////////////////////////////////////////////
        $query   = $xpath->query('.//table/tr/td');
        $image   = $query->item(1000000000); // <<---- item number 
        $img_src = $image->getElementsByTagName('img')->item(0)->getAttribute('src'); 
        echo $img_src;
    /////////////////////////////////////////////
?>
0 голосов
/ 15 сентября 2011

Если вы хотите скрыть все ошибки от своих пользователей, включите error_reporting (чтобы ошибка все еще регистрировалась) и отключите display_errors.

Если вы хотите, чтобы все ошибки были фатальными (то есть остановите обработку страницы), вы можете установить собственный обработчик ошибок, который умирает при каждой ошибке.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...