【问题标题】:PHP fails to setcookiePHP 无法设置cookie
【发布时间】:2009-06-12 18:29:04
【问题描述】:

我是PHP处女(第一天),所以请慢慢打字。

我有许多图像,bg_001.jpg、bg_002.jpg 等,我想在每次刷新页面时旋转它们。我试过这个:

if (isset($_COOKIE["bg1"])) {
  $img_no = $_COOKIE["bg1"] + 1;
} else {
  $img_no = 1;
}
$filename = 'bg_' . sprintf("%03d", $img_no) . '.jpg';
if (!file_exists("/img/" . $filename)) {
  $img_no = 1;
  $filename = 'bg_' . sprintf("%03d", $img_no) . '.jpg';
}
setcookie("bg1", $img_no, time() + 86400);
print '<img src="img/' . $filename . '" alt="" height="175" width="800"> '; 

我得到一个 cookie 而不是

Warning: Cannot modify header information - headers already sent by (output 
started at /home2/.../about.php:7) in /home2/.../about.php on line 31

第 31 行是带有 setcookie 的行。我已经找到了关于 PHP 在 Unicode 的 BOM 上遇到问题的指针,但我不知道如何解决它(如果它首先是这里的问题)。 所以,为了使它正式(并避免“不是一个真正的问题”标签),我该如何解决这个问题? :-)

也欢迎对我的代码提出建设性的批评。

结语:
看起来像一个常见的新手错误:十五分钟内对同一个解决方案的多个答案。谢谢guyz/galz。

所以我将除了 print 之外的所有内容都移到了文件的开头,并且确实:已修复。

【问题讨论】:

  • 要添加到每个人的标题优先级答案中,我会告诉您检查该页面的第 7 行。这就是输出的罪魁祸首。
  • 第 7 行?喜欢 ''??
  • 坦率地说,我从没想过“7”会指代行号(尽管我不知道还有什么。错误/警告代码?)为什么他们会使用两种不同的方式来表示一行同一条消息中的数字? "...php:7" vs. "...php on line 31"

标签: php cookies


【解决方案1】:

只有在没有事先发送信息的情况下才能发送 cookie。这意味着您的 PHP 文件中的第一件事必须是 &lt;?php,并且在该部分之前没有任何内容(甚至是可怕的 UTF-8 BOM),因为如果某些内容在第一个 &lt;?php 之前(例如 &lt;html&gt; ),然后 php 将为浏览器发送这些数据,并且在发送数据后您不能使用 setcookie。重构您的代码,使其看起来像这样:

(...)

并仔细检查记事本等编辑器是否没有在文件中的第一个 &lt;?php 之前放置任何 UTF-8 BOM 签名。

【讨论】:

    【解决方案2】:

    使用 HTTP,您的标头(请求/响应信息)和内容(实际文本或二进制内容)是分开设置的,标头必须在内容之前。

    设置 cookie 实际上会在响应头中添加一个命令,因此对 cookie 的任何修改都需要在您开始输出任何内容之前进行。

    将所有引用 cookie 的代码移到页面上的打开 html 元素之前,应该没问题。

    【讨论】:

      【解决方案3】:

      您可能还会发现使用会话而不是自己操作 cookie 更容易。 session_start() 仍然需要放在任何其他内容之前,但它可以更轻松地存储数据结构等。

      看看http://php.net/session_start

      【讨论】:

        【解决方案4】:

        要在不进行重大代码更改的情况下解决此问题,请像这样使用Output Buffering,--

        <?php
          ob_start();
          // ... my code here
        ?>
        <html></html>
        <?php
          // ... end of the file
          ob_end_flush();
        ?>
        

        【讨论】:

          【解决方案5】:

          您收到的错误/警告说明了一切:标头已发送

          这意味着在调用 setcookie() 方法之前,输出已经发送到浏览器。

          正如您所理解的,在将任何输出发送到浏览器之前“应该设置”cookie。

          所以检查 about.php 的第 7 行。您应该有 html 代码,否则您可能会调用 print 或 echo。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2013-05-02
            • 1970-01-01
            • 1970-01-01
            • 2011-09-05
            • 2010-12-12
            相关资源
            最近更新 更多