others - 在php,如何修复"Headers already sent"错误

92 0

运行脚本时,我得到了以下几个错误:

Warning : cannot modify header information - headers already sent by ( output started at /some/file. php:12 ) in /some/file.php on line 23

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

原因是什么? 如何修复它?

时间: 原作者:

108 0

在发送http标头(用setcookie还是header )之前发送内容时触发此错误消息,在http头之前输出某些内容的常见原因有:

  • 意外的空白,通常在文件的开头或结尾,如下所示:

    
     <?php
    
    
    // Note the space before"<?php"
    
    
    ?>
    
    
    
    

为了避免这种情况,只需省略关闭?> #它不是必需的。

  • 使用十六进制编辑器检查php文件,它们应该以字节3F 3C开始,你可以安全地从文件开头删除bom EF BB BF
  • 显式输出,如对echo,printf的调用,
  • php输出的警告,如果设置了display_errors,php不会因程序员错误而崩溃,而是静默修复错误并发出警告,虽然你可以修改display_errors
    常见的原因是访问数组的未定义元素(例如$_POST ['input']而不使用empty或isset来测试是否设置了输入),或使用未定义的常量而不是字符串文字(如$_POST [ input],请注意缺少的引号)。

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

原作者:
139 2

可能的解决方案 1

此错误可能是由文件开头之前或文件结尾之后的空格引起的,这些空格不应在这里。

这里不应该有空格


 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();


?> 



原作者:
146 2


//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



一定会解决你的问题。

原作者:
71 4


printf ("Hi %s,</br />", $name);



在设置Cookie之前,这是不允许的,不能在header前发送输出,甚至不能是空行。

原作者:
82 0

原因如下:


printf ("Hi %s,</br />", $name);



发送header之前不应打印任何内容。

原作者:
86 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-------------------



这种情况并不少见,做好准备。

来自PSR-2 2.2 :

  • 所有php文件必须使用 Unix LF (linefeed) line ending
  • 所有php文件必须以single blank line结尾,
  • 结束标记必须是omitted来自包含only php的文件

相信我,遵循这些标准能为你节省很多时间:

原作者:
149 0

通常,当我们在回显或打印后,发送header时,会出现此错误,如果在特定页面上出现此错误,那么在调用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()函数前不输出字符甚至不输出空白

原作者:
...