1

通常在开发周期中,当一个人在编写 PHP 和测试时,每次运行只会看到一个错误。

您可以使用 php.exe 或使用在线工具pilliappphpcodechecker查看语法错误。但是,您无法检测到运行时错误,例如未定义的变量。

您可以使用XDebug进行跟踪,但这很无聊。

如何在浏览器中显示所有 PHP 运行时错误?

因此,用户可以同时以不显眼的方式处理所有愚蠢的问题。(不是逻辑错误)。

4

1 回答 1

2

论坛和问答网站确实是一个很好的学习资源!

昨天我在stackoverflow .com 上提出了一个问题,讨论启发了我创建一种新方法来使用PHPJavascript来驯服 PHP 中的绝大多数运行时错误。

假设我有一个包含许多潜在运行时错误的 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('PHPError').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 运行时错误消息

8: Undefined variable: a (26)
8: Undefined variable: d (27)
8: Undefined variable: c (28)
8: Undefined index: glove (29)

或令人愉快的

Well done! PHP without errors.

显然,不需要任何按钮,并且可以将此代码包含在 javascript onload 函数中。

于 2013-01-16T12:29:00.313 回答