你如何格式化PHP错误信息?它们不遵循CSS。

3
每当PHP输出错误消息时,它会忽略CSS并在页面顶部输出消息,删除任何阻挡其路的内容。例如:
some code} else {
echo "error, please do something!";

我该如何让它(或者委婉地请求它)输出已经存在于我的CSS中的div内的文本,以便它遵守该div所带来的格式和对齐规则。


1
为了进行格式化,它必须在您的格式化内部。如果没有更详细的代码示例,很难确定您应该将此错误移动到哪里。请提供带有HTML的代码片段。 - criticus
你能提供更多关于正在发生的事情的信息吗?例如,您上面的代码示例在什么上下文中运行?我认为您的echo是问题所在(有关该理论的更多详细信息,请参见我的答案),但如果没有更多信息,很难确定。 - Jared Farrish
很抱歉造成困惑,我在运行一个嵌套的if语句来验证一个表单,如果无效则通过echo输出错误信息。同时,我还有其他页面输出html代码。问题出在了echo上,你很友善地指出了这个问题并解释了原因。你和Mario的回答非常有见地,不仅仅回答了我的问题。谢谢你们两位。现在一切正常了!我对php的理解也更深入了。 - Stu
我不知道“好好地请求”是什么意思,我认为这取决于您的Web服务器的个性。 - dokgu
6个回答

14
你可以使用以下的php.ini设置:php.ini参考手册
error_prepend_string = "<div class='error'>"
error_append_string = "</div>"

或类似的东西。


我重新阅读了他的问题,事实上他展示的是一个回声相关的问题,而不是一个错误报告问题。 - Jared Farrish
@Jared:嗯,我不知道。也许OP会回来澄清一下。我字面上理解是关于PHP生成的错误。但无论如何,回显错误并不是最佳实践。至少他应该使用trigger_error("oh noes, something went wrong");往返,然后再像你的示例中使用一个错误消息池。(问题可能还在于错误在<body>开始之前就被打印出来了。) - mario
我知道这很令人困惑。最终我回答了两个问题,但我认为两个答案都不是非常具体的(考虑到他提到将错误发送到页面上的一个div)。希望能得到更多细节。 - Jared Farrish
使用它时有一个小问题。如果错误出现在HTML标记的属性内部,那么如果使用单引号设置属性,则会破坏布局。如果您只使用单引号,则在此错误类中使用双引号,反之亦然。但是,如果您的代码包含混合引号(像我的一样),则不使用引号。最新版本的FF、Chrome和IE8及以上版本都会补偿缺少的引号并正常显示。因此,请使用'<div class=error>' - user967451
谢谢!这太完美了。我使用它的方式是:ini_set('error_prepend_string',"<div class='error'>") ; ini_set('error_append_string',"</div>") ; ini_set('display_errors', 1); ini_set('display_startup_errors', 1); error_reporting(E_ALL); - MaxRocket

7

编辑

实际上,我刚意识到你所说的“错误”涉及一个回显/打印输出。问题在于:

你直接将字符串“error”printecho)到输出缓冲区(当你完成运行所有代码时,它会将HTML发送到浏览器)。 echo()print()将你要回显/打印的内容直接发送出去,除非它在output_buffer块中(我不会让你混淆细节)。

因此,在管理常规的HTML/文本输出方面,你不采用print将页面内容输出到输出缓冲区,但在这种情况下,你使用了echo,它会立即将字符串数据直接发送到缓冲区。

例如:

一个简单示例中的问题

<?php

$mystr = "<html>";
$mystr .= "<body><h1>Hello World</h1></body></html>";

echo "<head></head>";

echo $mystr;

?>

这将在浏览器中输出:

<head></head><html><body><h1>Hello World</h1></body></html>

我正在存储字符串数据,但在 echo 其他 HTML 数据之前,echo HEAD 块。
我需要做的是:
<?php

$mystr = "<html>";
$mystr .= "<head></head>";
$mystr .= "<body><h1>Hello World</h1></body></html>";

echo $mystr;

?>

哪个会在浏览器上输出给我:
<html><head></head><body><h1>Hello World</h1></body></html>

我将存储字符串输出(在此情况下为错误信息),直到稍后需要输出它。这是您需要了解并在代码中实现的内容。

我会调查error_reporting(0)/display_errorserror_get_lastset_error_handler

http://www.php.net/manual/en/function.error-reporting.php

http://www.php.net/manual/en/errorfunc.configuration.php#ini.display-errors

http://php.net/manual/en/function.error-get-last.php

http://www.php.net/manual/en/function.set-error-handler.php

这样你就可以停止将所有错误立即发送到输出缓冲区(这就是为什么它在页面顶部),然后捕获、存储和呈现你的错误。

error_reporting(0);

set_error_handler('phpLogError');

function phpLogError() {
    $error = error_get_last();

    if ($error['type'] == 1) {
        //do your stuff    
    } 
}

function phpGetLoggedErrors() {
    // return your prettified html errors
}

或者换句话说...

php_error_handle.php

<?php

$GLOBAL['_logged_php_errors'] = array();

error_reporting(0);

set_error_handler('phpLogError');

function phpLogError() {
    global $_logged_php_errors;

    $error = error_get_last();

    if ($error['type'] == 1) {
        $_logged_php_errors[] = "<span>$error</span>";
    } 
}

function phpGetLoggedErrors() {
    global $_logged_php_errors;

    return "<ol><li>".implode('</li><li>',$_logged_php_errors)."</li></ol>";
}

?>

other.php

<?php

require_once 'php_error_handle.php';

// other stuff, pages included/required, etc...

请确保这个 require_once 函数在代码的第一行。


2

在@mario的基础上进行扩展,我将这段代码放在我的php文件顶部(当然是在开发环境中,而不是生产环境中!),效果非常好。即使在WordPress管理文件中也可以使用!

ini_set('error_prepend_string',"<div class='error'>")  ;
ini_set('error_append_string',"</div>")  ;
ini_set('display_errors', 1);
ini_set('display_startup_errors', 1);
error_reporting(E_ALL);

0
echo '<div class="yourerrorclass">error, please do something!</div>';

如果输出的位置不正确,那是因为您太早输出了错误。整个 HTML 是由 PHP 顺序输出的。如果在其他任何 HTML 之前输出错误,则错误将位于页面顶部,并实际上使您的 HTML 无效。


0

0
在生产环境中运行时,应完全抑制向屏幕显示错误,而是将其记录到文件中以进行检查和修复。有关详细信息以及建议的设置,请参阅php.ini文件。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接