【问题标题】:setcookie, Cannot modify header information - headers already sent [duplicate]setcookie,无法修改标头信息 - 标头已发送 [重复]
【发布时间】:2011-02-09 03:03:51
【问题描述】:

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

【问题讨论】:

    标签: php http cookies httpresponse


    【解决方案1】:

    警告很明确。

    警告:无法修改标头信息 - 标头已由第 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(这是协议限制)。这要求您在任何输出之前调用此函数,包括&lt;html&gt;&lt;head&gt; 标记以及任何空格。

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

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

    【讨论】:

    • @KennyTM,还有一个问题。我测试了代码,它运行良好。但是当我创建另一个 viewMore.php 时,它使用与 view.php 相同的代码。但是 viewTwo.php 位于 localhost/testMore/viewMore.php.(不同的目录)我没有用 viewMore.php echo cookie 值,否则 view.php 仍然可以正常工作。你能告诉我为什么吗?
    • @Nano:将$path参数设置为/。请参阅文档。
    • 放置 PHP 标头的绝佳解决方案。
    【解决方案2】:

    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 也可能很有用。

    【讨论】:

    • 你拯救了我的一天 :-) 谢谢你的朋友
    【解决方案3】:

    或者直接转

    output_buffering = On
    

    在你的php.ini

    请参阅http://digitalpbk.com/php/warning-cannot-modify-header-information-headers-already-sent 以获得完整的解决方案

    【讨论】:

    • 这是唯一的原因和解决方法!谢谢!以上都不适合我!有时某处可能有用!但是你说的!太棒了!~
    • 有时我需要在主体内的while循环中设置cookie..所以这也解决了我的问题..
    • 不起作用。 -1
    • 很遗憾,它在这里也不起作用
    【解决方案4】:

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

    【讨论】:

      【解决方案5】:

      这里有一些值得关注的东西......

      我遇到了同样的问题,发现在文件末尾关闭 ?&gt; 后有一个空格,我在生成任何输出之前将其包含在正确的位置。快把我逼疯了!

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2012-06-19
        • 1970-01-01
        • 1970-01-01
        • 2011-01-15
        • 1970-01-01
        相关资源
        最近更新 更多