0

私はしばらくの間PHPをプログラミングしています。

開発環境として、PHP 5.4SQlite 3Apache2.4を搭載したWindowsXPSP3を使用しています。リモートホストサーバー(私のものではありません)は、PHP 5.3Apache 2.2IIS 7.0、およびSQLServer2008を搭載したWindowsServer2008です。

私のエディタはシンプルで素晴らしいEditPlusです。

Javascriptに関しては、Firefoxに加えて、完全なHTML + CSS+Javascriptデバッグを可能にする優れたアドオンFireBugがあるので便利です。

私の問題は、開発環境(個人のマシン)でのPHPエラー管理です。

PHPの構文エラーは通常、行番号などで問題なく表示されるため、簡単に修正できます。また、構文をチェックするためのオンラインツール(例:pilliap)やPHPスニペットの実行をテストするための他のオンラインツール(例:writecodeonline.com)もあります。

ただし、私の呪いは実行時エラーです(たとえば、初期化されていない変数$ _SESSION)。正しく表示される場合もありますが、エラーメッセージ(正しい行番号を含む!)がソースコード内の偽のHTMLタグ内に埋め込まれている場合もあります。簡単なテストでは問題はありません。しかし、私の実際のコードは一般的にそうです。

それは私が前進するのを妨げる状況ではありませんが、それは不快です。

私はこの奇妙な行動についてインターネット上でヒントを見つけられませんでした、そして誰かがそれについて手がかりを与えることができるかどうか私は非常に興味があります。

私の質問:PHPランタイムエラーがブラウザに表示されることがあり(開発環境で必要に応じて)、Javascript + HTMLソースコード内に偽のHTMLタグが一緒に表示されることがありますか?

PS:PHPログファイルやPHP.Iniファイルの表示エラー設定についての質問ではありません。

PS2:XDebugがインストールされているかどうかに関係なく、同じ状況が発生します。

4

5 に答える 5

2

phperror_log() 関数を使用して、エラーに関する情報を希望どおりに表示します。

それとは別に、php.ini構成ファイルを見てください。必要に応じてエラーの出力をセットアップするための多くの変数 ( html_errorserror_log、 ...) がありdisplay_errorserror_reportingHTML 出力が台無しにならないようにします。

于 2013-01-15T22:40:55.580 に答える
1

これが、log_errorsおよびエラー ログ ファイルの目的です。それらを読むだけで、すべてのエラーが適切にリストされます。


編集:ページ上のすべてのエラーをドラッグして、次のように表示することもできます。

まず、error_prepend_stringerror_append_stringを目立つものに設定します。たとえば、 と を使用でき<phperrormessage>ます</phperrormessage>。正当な出力に表示される可能性が低いものすべて。

次に、これをコードの先頭に配置します。

ob_start(function($c) {
    if( preg_match_all("(<phperrormessage>(.*?)</phperrormessage>)is",$c,$matches)) {
      $c = preg_replace("(<phperrormessage>(.*?)<phperrormessage>)is","",$c);
      $c = str_replace(
          "</body>",
          "<div id=\"phperrors\">".implode("<hr />",$matches[1])."</div></body>",
          $c);
    }
    return $c;
});
于 2013-01-15T22:40:09.147 に答える
0

私も同じ問題を抱えてる。

私はあなたのソリューションを試しましたが、成功は限られていました。私は実際、元のエラー ハンドラーが気に入っています。それは電子メールを送信します。PHP だけでページを作成していたときは、エラーがうまく表示されるので、メールを送信する必要がないことに気付きました。HTML の JavaScript レンダリングに移行したので、エラーが表示されないか、非表示になります。ログはナビゲートするのが少し面倒で、ページソースの方が優れていますが、私のメールは常に開いています. エラーメッセージを作成し、メッセージと同様に電子メールで送信しechoますが、私たちが知っているように、これはページソースにダンプされ、表示されないか、ビット単位で表示されることがあります.

function pos_error_handler ($e_number, $e_message, $e_file, $e_line, $e_vars) 
{


$includes = get_included_files();
//var_dump( $includes);
//echo 'WTF';
// Build the error message.
$message = "<p>Nice Job moron: A pos error occurred in script '$e_file' on line $e_line: $e_message\n<br />";
// Add the date and time:
$message .= "Date/Time: " . date('n-j-Y H:i:s') . "\n<br />";
// Append $e_vars to the $message:
$message .= "<pre>Error Variables:<br />" . print_r ($e_vars, 1) . "</pre>\n</p>";
// what is the url?
$message .= "<p><pre>URL: " .getPageURL()   . "</pre>\n</p>";
$message .= '<pre>Session variables:<br />' . print_r($_SESSION,1). "</pre>\n</p>";
$message .= '<pre>Bactrace:<br />' . print_r(debug_backtrace(),1). "</pre>\n</p>";
if (!LIVE) 
{ 
// Send an email to the admin:
    mail(SUPPORT_EMAIL, 'TEST Site Error!', $message, 'From: ' . SUPPORT_EMAIL);
    // Development (print the error).

    echo '<div class="error">' . $message . '</div><br />';


}
else 
{ 

    // Send an email to the admin:
    mail(SUPPORT_EMAIL, 'Site Error!', $message, 'From: ' . SUPPORT_EMAIL);
    // Only print an error message if the error isn't a notice:
    include(HEADER_FILE);
    if ($e_number != E_NOTICE) 
    {
        echo '<div class="error">A system error occurred. We apologize for the inconvenience.</div><br />';
    }
    echo '<div class="error">An Error has occurred and has been emailed to the administrator. Please note the conditions that caused this error and send a note to the administrator</div><br />';
}
//include(FOOTER_FILE);
exit();
}
于 2015-09-06T15:55:06.063 に答える
0

最後に、PHP で何が起こるかを発見しました。

デフォルトの PHP エラー処理では、body セクションでエラーが生成されます。XDebugを使用すると、メッセージはより詳細になりますが、同じ状況が発生します。

そのため、JS 関数内の BODY セクションの前に PHP コードを配置すると、BODY セクションの前の HTML タグがガベージを生成するため、この動作は機能しません。

構文エラーは、PHP + HTML コードを実行する前に行われる PHP インタープリターの前段階であるため、異なります。

したがって、エラーを調べることができるようにするには、その場合、ソース コードを調べる必要があります。エラー メッセージを含む偽のタグが表示されます。

そのため、 StackOverflowに投稿した他のQ&Aの私のコードは、その状況に対処しています。

于 2013-01-17T02:29:59.343 に答える
0

フォーラムや Q&A Web サイトは、学習のための優れたリソースです。KolinkStackOverflow.comに感謝します。

Kolinkのヒントから少し調べて、PHP の実行時エラーの大部分を抑える新しい方法を作成しました。

何が起こっているのか正確にはわかりませんが、デフォルトの PHP エラー処理を使用せず、代わりにすべての実行時エラー メッセージを同じ場所に集める強力な方法を発見しました。

PHP コンパイル エラーは、PHP.exe を含むすべての構文チェッカーで解決されるため、私にとっては問題ではないことに注意してください。

多くの潜在的なランタイム エラーを含む PHP ソース コードがあるとします。したがって、HTML タグ内の次の行にコードを配置します。たとえば、PHP コードを使用する必要がある最初の位置にコードを配置します。

 <script type="text/javascript">
 var nerrors = 0;               // PHP Errors count in Javascript

 function PHPErrors() {         // Javascript  Function that wraps the PHP Code
  <?php
               // MyErrorHandler is my function that my custom error handler
               // uses with error parameters in that given order.

     function myErrorHandler($errno, $errstr, $errfile, $errline) {
     echo "document.getElementById('PHPErro').innerHTML += " . 
      "\"$errno: $errstr ($errline)<br>\";\r\n";        
     echo "nerrors = nerrors + 1;\r\n";
     return true;
 }
      // That's the line the set my custom new error-handling
      // disabling the default error handling
 $old_error_handler = set_error_handler("myErrorHandler");

      // Below random PHP code full of errors 
 $b = $a;                 // PHP Error 1
 $c = $a +1;              // PHP Error 2
 $d = $a + 1;             // PHP Error 3  
 $e = $_SESSION['glove'];  // PHP Error 4
?>
      // No PHP runtime error deserves a nice messagen
if (nerrors===0) {
   document.getElementById('PHPError').innerHTML =
                    "Well done! PHP without errors."; } 
}                        // End Javascript Function

このコードの後に​​、Javascript と PHP を自由に追加できます。

最後に、この 2 行を HTML 本文部分のどこかに挿入します。

    <p id="PHPError"> </p>
    <button onclick="PHPErrors()">Show me all PHP runtime errors</button> 

この PHP ページを参照すると、このボタンが表示されます。だから私はそれを押すと、すべてのPHPランタイムエラーメッセージまたは楽しい「よくやった...」メッセージを見ることができます.

于 2013-01-16T04:39:12.630 に答える