我在网站上使用set_cookie()。添加一些功能后,我收到Warning: Cannot modify header information - headers already sent by...
错误。它引用的标题所引用的行号是set_cookie()所在的行!我检查过,它没有被调用两次。
如何追踪这些过早的标题?我查看了源代码,并且在错误消息开始之前没有看到任何流浪角色或任何东西(我正在使用xdebug,所以第一件事就是一个,我认为是我,但实际上是开始xdebug消息)。我已经为我的代码添加了额外的echo
等等 - 什么都没有。
PHP可以告诉我标题何时何地开始?或者他们是否真的从set_cookie线开始,如果是这样,我是如何让自己陷入这种情况的,我该怎么走出去?
编辑:我不确定我可以粘贴代码 - 你只想要set_cookie()行吗?我认为标题是在那之前出来的。在此之前还有很多事情要进行实例化。而且我也不认为我可以发布所有课程和内容 - 你知道,专有信息;)
编辑:我已经摆脱了所有终止分隔符(所有?>
s),并确保每个包含文件的第一个字符为<?
。这令人沮丧!在我做这些最近的改变之前它正在工作:((
另外,为什么headers_sent()
不起作用?
if ( headers_sent($filename, $linenum) ) {
echo "headers sent: $filename:$linenum.";
}
set_cookie(...);
给出
headers sent: :0.
答案 0 :(得分:7)
您可以使用headers_sent()
:
if (!headers_sent($filename, $linenum)) {
set_cookie(/*...*/);
} else {
echo "Headers already sent in $filename on line $linenum\n";
exit;
}
答案 1 :(得分:2)
一种方法是从命令行运行脚本,并将STDERR重定向到null。
这将显示发送给STDOUT的所有内容,即服务器发送给客户端的所有内容。
希望一旦你看到这一点,你的标题就会变得清晰。
答案 2 :(得分:1)
除了使用headers_sent
检测HTTP标头是否已被发送之外,您还可以使用PHP’s output control来缓冲输出。即使您已经完成了某些输出,也可以更改标题。
以下是通过调用ob_start
使用显式输出缓冲的一些示例:
ob_start();
echo 'foobar';
header('Content-Type: text/plain;charset=utf-8');
但请确保在完成任何输出之前调用ob_start
。否则,HTTP标头可能已经被发送。
答案 3 :(得分:0)
可以粘贴代码吗?
如果它的说法标题已经由[line where set_cookie]发送,那么脚本中的错误就会进一步显示。
答案 4 :(得分:0)
您确定在set_cookie()初始化之前没有调用任何包含文件吗?您是否有会话正在运行,因为如果您这样做,您可以在开始会话时在脚本中的同一点设置cookie。
答案 5 :(得分:0)
如果在set_cookie()初始化之前甚至只有一个空格,则会导致标题无法正确发送。也许尝试使用不同的编辑器并检查结果。
答案 6 :(得分:0)
我找到了!这是一个flush();
,我在其中一个页面中独自躺着。令人惊讶的是,它没有正确地将$filename
和$linenumber
绑定到headers_sent()
。