setcookie,不能修改标题信息 – 已经发送的标题

我是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操作系统和XAMPP 1.7.3使用。

警告很清楚。

警告:无法修改头文件信息 – 第12行的C:\ xampp \ htdocs \ test \ index.php中已经发送了头文件(输出在C:\ xampp \ htdocs \ test \ index.php:9开始)

Cookie在HTTP响应头中发送。 由于HTML内容已经开始,你不能回头去添加cookie。

http://php.net/setcookie

setcookie()定义一个cookie和其余的HTTP头一起发送。 和其他头文件一样,Cookie必须在脚本输出之前发送(这是一个协议限制)。 这要求您在任何输出之前调用此函数,包括<html><head>标记以及任何空格。

在出现任何HTML之前移动setcookie语句:

 <?php $value = 'something from somewhere'; setcookie("TestCookie", $value); ?> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> .... 

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也许是有用的。

在设置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> 

这里值得一看…

我有同样的问题,发现有一个空格后closures?>在一个文件的结尾,我正在包括在正确的地方,在任何输出产生之前。 这让我发疯了!