2010-04-17 104 views
28

我是新来的PHP,我练的PHP setcookie()函数刚才和失败。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。

回答

45

警告很清楚。

警告:无法修改标题信息 - 头已经发出(输出开始C:\ XAMPP \ htdocs中\测试\的index.php:9)在C:\ XAMPP \ htdocs中\上测试\的index.php线12个

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

http://php.net/setcookie

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

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

<?php 
$value = 'something from somewhere'; 

setcookie("TestCookie", $value); 
?> 
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> 
.... 
+0

@KennyTM,还有更多问题。我测试了代码,它运行良好。但是当我创建另一个** viewMore.php **,它使用与** view.php **相同​​的代码。但viewTwo.php位于** http://localhost/testMore/viewMore.php**。(不同的目录),我无法用viewMore.php“回声”cookie值,否则view.php仍能正常工作。你能告诉我为什么吗? – 2010-04-17 12:13:51

+0

@Nano:将'$ path'参数设置为'/'。请参阅文档。 – kennytm 2010-04-17 15:00:17

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> 
19

Cookies是在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_startob_end_flush函数。

查看setcookie也许有帮助。

+0

你救了我的日子:-)谢谢你的伙伴 – Thamaraiselvam 2016-02-08 12:39:49

8

或者只是把

output_buffering = On 

php.ini

参考http://digitalpbk.com/php/warning-cannot-modify-header-information-headers-already-sent一个完整的解决方案

+0

这是唯一的原因和解决方案!谢谢!以上都不适合我!有时候某处可能有用!但是你说了什么!太棒了!〜 – Hossein 2013-02-19 13:25:16

+0

有时候我需要在体内循环中设置cookie ..所以这也解决了我的问题。 – rusly 2013-03-30 11:08:22

1

这里的东西值得看出来......

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

相关问题