0

我正在编写 PHP 一段时间。

我使用带有PHP 5.4SQlite 3Apache 2.4的Windows XP SP3作为开发环境。远程主机服务器(不是我的)是带有PHP 5.3Apache 2.2IIS 7.0SQL Server 2008的Windows Server 2008 。

我的编辑器是简单而美妙的EditPlus

关于Javascript,这很好,因为Firefox加上了不起的插件FireBug,它允许完整的 HTML + CSS + Javascript 调试。

我的问题是我的开发环境(我的个人机器)中的 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_errors, error_log, display_errors, error_reporting...) 可以根据需要设置错误的输出,这样它们就不会弄乱 html 输出。

于 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

论坛和问答网站确实是一个很好的学习资源!感谢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 回答
0

最后,我发现了 PHP 会发生什么。

默认的 PHP 错误处理会在正文部分生成错误。使用XDebug消息更详细,但同样的情况也会发生。

因此,当我将 PHP 代码放在 JS 函数中时,在 BODY 部分之前,此行为不起作用,因为 BODY 部分之前的 HTML 标记会产生垃圾。

语法错误是不同的,因为它是 PHP 解释器的前一个阶段,是在运行 PHP + HTML 代码之前发生的。

因此,为了能够检查错误,在这种情况下,您需要查看源代码。会有带有错误消息的虚假标签。

因此,我在StackOverflow中发布的其他问答中的代码处理了这种情况。

于 2013-01-17T02:29:59.343 回答
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 回答