如何修复PHP中的“标头已发送”错误

运行脚本时,出现以下错误: php

警告:不能更改头信息-已经( 输出在/some/file.php:12开始 )在/some/file.php发送上线23程序员

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

这多是什么缘由? 以及如何解决? session


#1楼

一个简单的提示:在脚本中,就在第一个<?php标记以前的简单空格(或不可见的特殊字符)会致使这种状况! 尤为是当您在团队中工做且有人在使用“弱” IDE或使用奇怪的文本编辑器弄乱了文件时。 框架

我看过这些东西;) 编辑器


#2楼

我以前曾屡次收到此错误,而且能够确定全部PHP程序员至少一次收到过此错误。 函数

可能的解决方案1 spa

该错误多是由文件开头以前或文件结尾以后的空格引发的。这些空格不该在此处。 code

例)这里应该没有空白 ip

echo "your code here";

?>
THERE SHOULD BE NO BLANK SPACES HERE

检查与致使此错误的文件关联的全部文件。

注意: 有时,像gedit(默认的Linux编辑器)之类的EDITOR(IDE)在保存文件上添加一个空行。 这不该该发生。 若是您使用的是Linux。 您可使用VI编辑器删除页面末尾?>以后的空格/行。

可能的解决方案2:若是不是您这种状况,请使用ob_start输出缓冲:

<?php
  ob_start();

  // code 

 ob_end_flush();
?>

这将打开输出缓冲,而且将在缓冲页面以后建立标题。


#3楼

代替下面的行

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

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

要么

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

确定会解决您的问题。 我遇到了一样的问题,但经过上述方式编写标题位置解决了。


#4楼

另外一个很差的作法可能会引发此问题,还没有说明。

请参见如下代码段:

<?php
include('a_important_file.php'); //really really really bad practise
header("Location:A location");
?>

事情还好吧?

若是“ a_important_file.php”是怎么办:

<?php
//some php code 
//another line of php code
//no line above is generating any output
?>

 ----------This is the end of the an_important_file-------------------

这行不通吗? 为何?由于已经生成了新行。

如今,尽管这不是常见的状况,可是若是您使用的是MVC框架,该框架会在将内容移交给控制器以前加载大量文件? 这并不是罕见的状况。 为此作好准备。

PSR-2 2.2开始:


  • 全部PHP文件都必须使用Unix LF (linefeed) line ending
  • 全部PHP文件都必须以single blank line结尾。
  • only php包含only php文件中必须omitted ?>标记

相信我,遵循这些标准能够为您节省不少时间:)


#5楼

一般,当咱们在回显或打印后发送标题时,会出现此错误。 若是在特定页面上发生此错误,请确保在调用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()函数header()甚至是空格或换行符session_start()以前,请勿输出任何字符

相关文章
相关标签/搜索