在运行脚本时,我会遇到以下几个错误:
警告:无法修改标头信息-标头已由第23行的/some/file.php中的/some-file.php发送(输出开始于/some/files.php:12)
错误消息中提到的行包含header()和setcookie()调用。
这可能是什么原因?如何修复?
在运行脚本时,我会遇到以下几个错误:
警告:无法修改标头信息-标头已由第23行的/some/file.php中的/some-file.php发送(输出开始于/some/files.php:12)
错误消息中提到的行包含header()和setcookie()调用。
这可能是什么原因?如何修复?
当前回答
这是因为这句话:
printf ("Hi %s,</br />", $name);
在发送邮件头之前,不应打印/回显任何内容。
其他回答
我以前多次遇到过这个错误,我确信所有的PHP程序员都至少在以前遇到过一次这个错误。
可能的解决方案1
此错误可能是由文件开始之前或文件结束之后的空格造成的。这些空格不应在此处。
前)这里不应该有空格在这里回显“您的代码”;?>这里不应该有空格检查与导致此错误的文件关联的所有文件。注意:有时像gedit(默认的linux编辑器)这样的EDITOR(IDE)会在保存文件中添加一行空白。这不应该发生。如果您使用的是Linux。您可以使用VI编辑器删除?>之后的空格/行在页面末尾。可能的解决方案2:如果不是这样,则使用ob_start输出缓冲:<?php文件ob_start();//代码ob_end_flush();?> 这将打开输出缓冲,页面缓冲后将创建标题。
这是因为这句话:
printf ("Hi %s,</br />", $name);
在发送邮件头之前,不应打印/回显任何内容。
你知道
printf ("Hi %s,</br />", $name);
在设置cookie之前,这是不允许的。您不能在标题之前发送任何输出,甚至不能发送空行。
另一种不良做法可能会引发尚未说明的问题。
请参见以下代码段:
<?php
include('a_important_file.php'); //really really really bad practise
header("Location:A location");
?>
一切都很好,对吧?
如果“a_import_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:
所有PHP文件必须使用Unix LF(linefeed)行尾。所有PHP文件必须以一个空白行结尾。闭幕式?>标记必须从仅包含php的文件中省略
相信我,遵循这些标准可以为你的生活节省很多时间:)
一个简单的提示:脚本中的一个简单空格(或不可见的特殊字符),就在第一个<?php标记,可能会导致这种情况!特别是当你在一个团队中工作时,有人在使用一个“弱”IDE,或者用奇怪的文本编辑器在文件中乱动。
我见过这些事;)