40

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

4

5 回答 5

56

警告很明确。

警告:无法修改标头信息 - 标头已由第 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">
....
于 2010-04-17T10:52:35.793 回答
24

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

于 2010-04-17T11:01:03.187 回答
14

或者只是转

output_buffering = On

在你的php.ini

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

于 2011-11-05T02:51:21.860 回答
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>
于 2010-04-17T10:52:26.773 回答
4

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

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

于 2013-03-14T08:59:17.597 回答