setcookie,无法修改标题信息 - 已发送的标题

时间:2010-04-17 10:49:02

标签: php http cookies httpresponse

我是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。

5 个答案:

答案 0 :(得分:49)

警告很清楚。

  

警告:无法修改标头信息 - 已在第12行的C:\ xampp \ htdocs \ test \ index.php中发送的标头(输出从C:\ xampp \ htdocs \ test \ index.php:9开始)< / p>

Cookie在HTTP响应标头中发送。由于HTML内容已经启动,因此您无法返回标题并添加Cookie。

来自http://php.net/setcookie

  

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_startob_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)

这是值得关注的事情......

我遇到了同样的问题,发现在生成任何输出之前我在正确位置包含的文件末尾的?>结束后有一个空格。这让我很生气!