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

2022-08-30 11:48:27

我是PHP的新手,我刚才练习了PHP setcookie()并失败了。

http://localhost/test/ 索引.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/ 查看.php

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

?>

但是我没能像这样运行索引.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。


答案 1

警告很清楚。

警告:无法修改标头信息 - 已由 C:\xampp\htdocs\test\index.php 第 12 行的 C:\xampp\htdocs\test\index.php:9 开始的标头

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">
....

答案 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的信息也可能很有用。


推荐