无法发送会话cookie - 已发送的标头

时间:2010-12-23 23:59:24

标签: php header

  

可能重复:
  Headers already sent by PHP

下面是我的PHP代码的一个简单示例(我希望如此)是自我解释的。我尝试做的是更新会话变量。但脚本的输出如下:

  

警告:session_start()   [function.session-start]:无法发送   会话cookie - 已发送的标头   通过(输出开始于   /Library/WebServer/Documents/facebook/test.php:8)   在   /Library/WebServer/Documents/facebook/test.php   在第11行

警告当然是由第8行和第9行中的echo语句引起的。是否有任何简单的解决方案可以阻止此警告。

感谢任何指针,Andrej

<?php
session_start();
$_SESSION['percent'] = 0;
$iterations = 50;

for ($i = 0; $i <= iterations; $i++) {
  $percent = ($i / $iterations) * 100;
  echo "Hello World!";
  echo "<br />";
  // update session variable
  session_start();
  $_SESSION['percent'] = number_format($percent, 0, '', '');
  session_commit();
}
?>

对我来说唯一有效的解决方案(即更新会话变量)是:

<?php
ob_start();
session_start();
$_SESSION['percent'] = 0;
$iterations = 50;

for ($i = 0; $i <= 50; $i++) {
  $percent = ($i / $iterations) * 100;
  echo "Hello World!";
  echo "<br />";
  // update session variable
  session_start();
  $_SESSION['percent'] = number_format($percent, 0, '', '');
  session_commit();
}
ob_flush();
?>

它很难看,而它首先缓冲输出......

5 个答案:

答案 0 :(得分:4)

从for循环中删除session_start()。

将session_commit()放在for循环的最后面。

这两个函数只能在脚本中调用一次。

答案 1 :(得分:2)

启动输出后无法设置cookie(或发送任何其他标头)。您可以在第1行添加ob_start()来缓冲输出。

正确的解决方案是将逻辑与输出分开。查看例如 http://www.paragoncorporation.com/ArticleDetail.aspx?ArticleID=21

答案 2 :(得分:2)

如果在session-start()语句之前没有任何previeus输出,则尝试将.php文件重新保存为ansi文件或不包含BOM文件的utf-8。 在某些情况下,编辑器本身会将文件作为输出写入文件中。

它对我有用

答案 3 :(得分:1)

您必须只执行一次session_start()功能。所以只需将其放在循环中即可。

此外,您不必手动执行session_commit(),在大多数情况下,PHP会自动为您处理此问题。

答案 4 :(得分:1)

正如其他人所说,错误的原因是你正在使用的第二个session_start()。但是,它抛出错误的实际原因是因为您在已经发送输出后尝试设置标头。由于session_start()函数设置会话cookie,因此它尝试设置cookie标头,这是在您已经回显内容之后。