下面是我的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();
?>
它很难看,而它首先缓冲输出......
答案 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标头,这是在您已经回显内容之后。