2009-06-12 61 views
1

我是PHP处女(第一天),所以请慢慢输入。PHP未能setcookie

我有许多图像,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"> '; 

代替饼干的,我收到了

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方面遇到麻烦的指针,但我不知道如何解决它(如果这是第一位的问题)。 因此,要使它正式(并避免“不是真正的问题”标签),我该如何解决这个问题? :-)

对我的代码的建设性批评也是受欢迎的。

结语:
似乎是一个共同的新手错误:朝向15分钟内的相同溶液几个答案。谢谢guyz/galz。

所以我把除了print之外的所有东西都移动到了文件的开头,而且的确是:fixed。

+1

要添加到每个人的标题优先答案生病告诉你检查该页上的第7行。这是输出的罪魁祸首。 – Galen 2009-06-12 18:39:38

回答

8

如果没有先前发送的信息,则只能发送cookie。这意味着你的PHP文件中的第一件事必须是<?php,并且在该部分之前没有任何东西可以得到(甚至不是可怕的UTF-8 BOM),因为如果在第一个<?php(如<html>)之前有什么东西,那么php将发送那些浏览器和数据发送后的数据不能使用setcookie。重构你的代码看起来是这样的:

 
<?php 
(...) 
setcookie(...) 
(...) 
?> 
<HTML> 
(...) 
</HTML> 

并仔细检查,像记事本编辑没有把任何UTF-8 BOM签名的文件中第<?php之前。

3

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

设置cookie实际上会向标题响应添加一条命令,因此在开始输出任何内容之前,需要对cookie进行任何修改。

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

1

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

看看http://php.net/session_start

0

为了解决这个问题没有重大代码更改,使用Output Buffering像这样, - -

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

错误/警告你得到了一切:头文件已经发出已

这意味着,输出具有的setcookie()方法W前已经被发送到浏览器如所称。

正如你可以理解的cookie“应该设置”之前,任何输出发送到浏览器。

因此请在about.php处查看第7行。你应该有HTML代码,或者你可能打电话打印或回声。