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

Nan*_* HE 36 php cookies http 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>
Run Code Online (Sandbox Code Playgroud)

http:// localhost/test/view.php

<?php
 // I plan to view the cookie value via view.php
 echo $_COOKIE["TestCookie"];

?>
Run Code Online (Sandbox Code Playgroud)

但我没能运行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
Run Code Online (Sandbox Code Playgroud)

毫无疑问,我启用了IE 6 cookie.

上面的程序有什么问题吗?谢谢.

使用WinXP OS和XAMPP 1.7.3.

ken*_*ytm 51

警告很清楚.

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

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

来自http://php.net/setcookie:

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

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

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

 setcookie("TestCookie", $value);
?>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
....
Run Code Online (Sandbox Code Playgroud)


Seb*_*olm 23

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>
Run Code Online (Sandbox Code Playgroud)

或者,您可以缓冲输出,以便在您明确告知之前不会写入任何内容

<?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
?>
Run Code Online (Sandbox Code Playgroud)

有关此最后一种方法的更多信息,请查看ob_startob_end_flush函数.

阅读有关setcookie的内容可能也很有用.


小智 9

或者转身

output_buffering = On
Run Code Online (Sandbox Code Playgroud)

在你的 php.ini

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


Jac*_*ght 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>
Run Code Online (Sandbox Code Playgroud)


Ste*_*eve 5

这里有一些值得留意的事情......

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