在运行脚本时,我会遇到以下几个错误:

警告:无法修改标头信息-标头已由第23行的/some/file.php中的/some-file.php发送(输出开始于/some/files.php:12)

错误消息中提到的行包含header()和setcookie()调用。

这可能是什么原因?如何修复?


当前回答

当在发送HTTP头(带有setcookie或头)之前发送任何内容时,会触发此错误消息。在HTTP头之前输出内容的常见原因是:

意外的空白,通常出现在文件的开头或结尾,例如:<?php文件//注意“<?php”之前的空格?>

为了避免这种情况,只需省略结尾?>-无论如何都不需要。

php文件开头的字节顺序标记。使用十六进制编辑器检查php文件,以确定是否是这种情况。它们应该以字节3F 3C开头。您可以安全地从文件开头删除BOM EF BB BF。显式输出,例如调用echo、printf、readfile、passthru、<?等如果设置了display_errors php.ini属性,则php输出的警告。php不会因程序员错误而崩溃,而是默默地修复错误并发出警告。虽然您可以修改display_errors或error_reporting配置,但您应该解决这个问题。常见的原因是访问数组中未定义的元素(例如$_POST['input'],而不使用空或isset来测试是否设置了输入),或者使用未定义的常量而不是字符串文字(如$_POSD[input],请注意缺少的引号)。

打开输出缓冲将使问题消失;调用obstart之后的所有输出都会缓冲在内存中,直到您释放缓冲区,例如使用obendflush。

然而,虽然输出缓冲避免了这些问题,但您应该真正确定应用程序在HTTP头之前输出HTTP主体的原因。这就像打电话讨论你的日子和天气,然后告诉对方他打错了电话。

其他回答

而不是下面的行

//header("Location:".ADMIN_URL."/index.php");

echo("<script>location.href = '".ADMIN_URL."/index.php?msg=$msg';</script>");

or

?><script><?php echo("location.href = '".ADMIN_URL."/index.php?msg=$msg';");?></script><?php

这肯定能解决你的问题。我也遇到了同样的问题,但我通过以上述方式编写头位置来解决。

一个简单的提示:脚本中的一个简单空格(或不可见的特殊字符),就在第一个<?php标记,可能会导致这种情况!特别是当你在一个团队中工作时,有人在使用一个“弱”IDE,或者用奇怪的文本编辑器在文件中乱动。

我见过这些事;)

当在发送HTTP头(带有setcookie或头)之前发送任何内容时,会触发此错误消息。在HTTP头之前输出内容的常见原因是:

意外的空白,通常出现在文件的开头或结尾,例如:<?php文件//注意“<?php”之前的空格?>

为了避免这种情况,只需省略结尾?>-无论如何都不需要。

php文件开头的字节顺序标记。使用十六进制编辑器检查php文件,以确定是否是这种情况。它们应该以字节3F 3C开头。您可以安全地从文件开头删除BOM EF BB BF。显式输出,例如调用echo、printf、readfile、passthru、<?等如果设置了display_errors php.ini属性,则php输出的警告。php不会因程序员错误而崩溃,而是默默地修复错误并发出警告。虽然您可以修改display_errors或error_reporting配置,但您应该解决这个问题。常见的原因是访问数组中未定义的元素(例如$_POST['input'],而不使用空或isset来测试是否设置了输入),或者使用未定义的常量而不是字符串文字(如$_POSD[input],请注意缺少的引号)。

打开输出缓冲将使问题消失;调用obstart之后的所有输出都会缓冲在内存中,直到您释放缓冲区,例如使用obendflush。

然而,虽然输出缓冲避免了这些问题,但您应该真正确定应用程序在HTTP头之前输出HTTP主体的原因。这就像打电话讨论你的日子和天气,然后告诉对方他打错了电话。

常见问题:

(复制自:源)

====================

1) 在标题(……..)之前不应有任何输出(即echo...或HTML代码);命令

2) 删除<?php及其之后?>标签。

3) 黄金法则!-检查php文件(如果包含其他文件)是否具有UTF8而没有BOM编码(而不仅仅是UTF-8)。这在很多情况下都是一个问题(因为UTF8编码的文件在php文件的开头有一个特殊的字符,而您的文本编辑器不会显示)!!!!!!!!!!!

4) 在标题(…)之后;您必须使用exit;

5) 始终使用301或302参考:

header("location: http://example.com",  true,  301 );  exit;

6) 打开错误报告并查找错误。您的错误可能是由于某个函数不工作导致的。打开错误报告时,应始终首先修复最顶部的错误。例如,它可能是“警告:date_default_timezone_get():依赖系统的时区设置是不安全的。”-然后往下看,您可能会看到“headers not send”错误。修复最上面(第一个)错误后,重新加载页面。如果仍有错误,请再次修复最上面的错误。

7) 如果以上任何一项都没有帮助,请使用JAVSCRIPT重定向(但是,强烈不推荐的方法),这可能是自定义情况下的最后机会…:

echo "<script type='text/javascript'>window.top.location='http://website.com/';</script>"; exit;

通常,当我们在回显或打印后发送标头时,会出现此错误。如果在特定页面上出现此错误,请确保该页面在调用start_session()之前没有回显任何内容。

不可预测错误示例:

 <?php //a white-space before <?php also send for output and arise error
session_start();
session_regenerate_id();

//your page content

再举一个例子:

<?php
includes 'functions.php';
?> <!-- This new line will also arise error -->
<?php
session_start();
session_regenerate_id();

//your page content

结论:在调用session_start()或header()函数之前不要输出任何字符,甚至不要输出空格或新行