0

エラーを処理するために、次のスニペットを書きました。

(Page.php は : array( falseNamePage=> page.php, ....ect) を介してインデックス ページに含まれます)

それがどのように反応するかを確認するためにいくつかのテストを実行して、public_html から page.php を削除します。

結果 :

-エラーログOK

・アラートメール送信OK

-DBへの記録: エラー:

注意: 未定義の変数: $database in /home/.../public_html/index.php 行 40

警告: mysql_query() は、パラメーター 2 がリソースであると想定しています。null は /home/.../public_html/index.php の 40 行目に「DB2 に接続できません」で指定されています

この場合、DB への接続に失敗し、エラーを返す理由がわかりません。

DB 接続は、他のすべてのケース (削除、選択、更新、挿入 ...) で正常に動作します。

function errorHandler($errno, $errstr, $errfile, $errline)
    {
    require_once('connection.php');
    $now = time();
    $date = date("Y-m-d H:i:s",$now);    
    switch ($errno) {
        case E_NOTICE:
        case E_USER_NOTICE:
        case E_DEPRECATED:
        case E_USER_DEPRECATED:
        case E_STRICT:

            ............ 5 first cases code...............

        case E_WARNING:
        case E_USER_WARNING:            

            $message_warning = "Warning : ".$errno." : ".$errstr." : ".$errfile." : ".$errline;
            error_log ( $message_warning ,0);
            $mail = 'my_mail@yahoo.com';  $sujet = $message_warning;  $body_warning = $date." : ".$message_warning;                             
            mail($mail,'=?UTF-8?B?'.base64_encode($sujet).'?=',stripslashes($body_warning));
            $query_warning  =" INSERT INTO errorlog (severity,errno,errstr,errfile,errline,time) 
            VALUES ('WARNING','".$errno."','".$errstr."','".$errfile."','".$errline."','".$date."')";           
            $result_warning = mysql_query($query_warning,$database) or die("impossible to connect with DB2");
                break;

        case E_ERROR:
        case E_USER_ERROR:

       ............... 2 last cases code ..........
    }       
}    
set_error_handler("errorHandler");  

最後の質問は次のとおりです。

INCLUDE エラーが 4 回エコーされるのはなぜですか?

システムは「ストリームを開く」ことを 4 回試行しますか?

やった :

function errorHandler($errno, $errstr, $errfile, $errline)
           {
        if     ($errno == E_NOTICE )
        { echo "<br/>".$errno."== E_NOTICE<br/>";}
        if     ($errno == E_USER_NOTICE)
        { echo "<br/>".$errno."== E_USER_NOTICE<br/>";}
        if     ($errno == E_DEPRECATED)
        { echo "<br/>".$errno."== E_DEPRECATED<br/>";}
        if     ($errno == E_USER_DEPRECATED)
        { echo "<br/>".$errno."== E_USER_DEPRECATED<br/>";}
        if     ($errno == E_STRICT)
        { echo "<br/>".$errno."== E_STRICT<br/>";}
        if     ($errno == E_WARNING)
        { echo "<br/>".$errno."== E_WARNING<br/>";}
        if     ($errno == E_USER_WARNING)
        { echo "<br/>".$errno."== E_USER_WARNING<br/>";}
        if     ($errno == E_ERROR)
        { echo "<br/>".$errno."== E_ERROR<br/>";}
        if     ($errno == E_USER_ERROR)
        { echo "<br/>".$errno."== E_USER_ERROR<br/>";}
           }             
           set_error_handler("errorHandler");   

結果 :

2== E_WARNING

2== E_WARNING

2== E_WARNING

2== E_WARNING

4

3 に答える 3

1

おそらくconnection.php以前に既にインクルードされているためrequire_once、コードで使用する場合、再度インクルードすることはありませんconnection.php。その後、$database変数は定義されず、そのエラーメッセージが表示されます。

于 2012-07-03T11:09:09.853 に答える
0

の代わりに関数定義と定数定義がconnection.php使用されていない場合。requirerequire_once

変数$databaseは、require_ onceのため、関数が2回呼び出されたときに使用できません。ここで設計されているのは少し悪いです。

解決策は、$ databaseを定数として持つことです。したがって、connection.phpが最初に含まれたか、2回目に含まれたかに関係なく、グローバル変数のように機能します。

于 2012-07-03T11:04:45.110 に答える
0

あなたの問題は単純です、そして私の意見では、それは YAPHPB です:require_once関数の本体を形成するために、ファイルが一度だけ含まれることを期待して、関数定義内で使用しています。

しかし、そのようには機能しません: このコードは毎回解析されます(少し単純化されていますが、理由は同じです) 関数が呼び出されます。であるためrequire_once、ファイルは実際に一度だけ含まれます-関数が初めて呼び出されたときのみ。次の呼び出しはすべてファイルのインクルードをスキップするため、$database は定義されません。

それを修正する最も簡単な方法は、に置き換えることrequire_onceですrequire。しかし、問題はカバーされるだけだと思いますが、解決されません。$database実際の解決策は、実際にレジストリのレコードになるようにコードを再構築し、必要に応じてそのレジストリから遅延抽出することです。

このような動作を実装するには多くの方法があります。そのためにZend_Registryコンポーネントをよく使用します。このトピックでは、このコンポーネントを効果的に使用する方法の例をいくつか示します。

于 2012-07-03T11:11:01.300 に答える