2009-06-12 87 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代碼,或者你可能打電話打印或回聲。