0

こんばんは、
カスタムエラーを設定する方法、または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)ため、エラーが発生します。すべての
エラーdisplay_errors" , "0"が非表示になり、ページが破損
するため、その破損を防ぐ方法はありますか?: before var
のような単純な条件を追加することでそれを防ぐことができることはわかってい ますが、10000行を超える大きなコードがあり、どのコードがエラーを引き起こすか正確にわからない場合はどうでしょうか。 httaccessで防ぐことはできますか?エラーページへのリダイレクトが空であるかどうかページソースをチェックすることによって.. またはphp自体のいくつかの関数によってそれを防ぐことができますか? 何か案は ?
if( $image <1 ){ die('error msg'); }$img_src



4

2 に答える 2

2

set_error_handlerを使用できます。エラーのコールバックイオンケースを設定し、そこでスクリプトをそれ以上実行しないように終了できます。

更新
カスタムエラーハンドラがE_ERRORおよびその他のエラータイプでは機能しないことがわかりました。これはPHPドキュメントにあります

次のエラータイプは、ユーザー定義関数では処理できません:E_ERROR、E_PARSE、E_CORE_ERROR、E_CORE_WARNING、E_COMPILE_ERROR、E_COMPILE_WARNING、およびset_error_handler()が呼び出されたファイルで発生したほとんどのE_STRICT。

したがって、これはインターネットで見つけた回避策であり、スクリプトを使用してテストし、正常に機能しています。
スクリプトの先頭に次のコードを追加します。

// 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にリダイレクトします。

注:注意すべき点の1つは、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;
    /////////////////////////////////////////////
?>
于 2011-09-15T09:33:46.473 に答える
0

ユーザーからすべてのエラーを非表示にする場合は、error_reportingを有効にして(エラーが引き続きログに記録されるように)、display_errorsを無効にします。

すべてのエラーを致命的なものにしたい場合(つまり、ページ処理を停止したい場合)、すべてのエラーで終了するカスタムエラーハンドラーを設定できます。

于 2011-09-15T09:33:53.467 に答える