我是PHP的新手,我刚刚练习PHP setcookie()并且失败了。
http://localhost/test/的的index.php
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title></title>
</head>
<body>
<?php
$value = 'something from somewhere';
setcookie("TestCookie", $value);
?>
</body>
</html>
http://localhost/test/的 view.php
<?php
// I plan to view the cookie value via view.php
echo $_COOKIE["TestCookie"];
?>
但我没能运行index.php,这样的IE警告。
Warning: Cannot modify header information - headers already sent by (output started at C:\xampp\htdocs\test\index.php:9) in C:\xampp\htdocs\test\index.php on line 12
毫无疑问,我启用了IE 6 cookie。
我的手术上面有什么不对吗?谢谢。
使用WinXP OS和XAMPP 1.7.3。
答案 0 :(得分:49)
警告很清楚。
警告:无法修改标头信息 - 已在第12行的C:\ xampp \ htdocs \ test \ index.php中发送的标头(输出从C:\ xampp \ htdocs \ test \ index.php:9开始)< / p>
Cookie在HTTP响应标头中发送。由于HTML内容已经启动,因此您无法返回标题并添加Cookie。
setcookie()定义要与其他HTTP标头一起发送的Cookie。与其他标头一样,Cookie必须在 之前发送 来自脚本的任何输出(这是协议限制)。这要求您在输出之前调用此函数,包括
<html>
和<head>
标记以及任何空格。
在出现任何HTML之前移动setcookie
语句:
<?php
$value = 'something from somewhere';
setcookie("TestCookie", $value);
?>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
....
答案 1 :(得分:21)
Cookie在HTTP页面传输的标头中发送。一旦输出了一些输出,就不能再修改它们了。
您的案例中的问题在于您在尝试设置Cookie之前输出了一些HTML文档。
有几种方法可以解决它;其中一个是在输出页面上的任何内容之前设置cookie,如此
<?php
$value = 'something from somewhere';
setcookie("TestCookie", $value);
?>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title></title>
</head>
<body>
</body>
</html>
或者,您可以缓冲输出,以便在明确告诉
之前不会写入任何内容<?php
ob_start(); // Initiate the output buffer
?>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title></title>
</head>
<body>
<?php
$value = 'something from somewhere';
setcookie("TestCookie", $value);
?>
</body>
</html>
<?php
ob_end_flush(); // Flush the output from the buffer
?>
有关此最后一种方法的详细信息,请查看ob_start和ob_end_flush函数。
阅读setcookie也可能有用。
答案 2 :(得分:9)
或者只是转动
output_buffering = On
在php.ini
请参阅http://digitalpbk.com/php/warning-cannot-modify-header-information-headers-already-sent获取完整解决方案
答案 3 :(得分:7)
您在设置Cookie之前发送了一些HTML。必须在发送任何输出之前设置cookie,因为它随响应头一起发送。这样做:
<?php
$value = 'something from somewhere';
setcookie("TestCookie", $value);
?>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title></title>
</head>
<body>
</body>
</html>
答案 4 :(得分:3)
这是值得关注的事情......
我遇到了同样的问题,发现在生成任何输出之前我在正确位置包含的文件末尾的?>
结束后有一个空格。这让我很生气!