2010-04-17 103 views
28

我是新來的PHP,我練的PHP setcookie()函數剛纔和失敗。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。

回答

45

警告很清楚。

警告:無法修改標題信息 - 頭已經發出(輸出開始C:\ XAMPP \ htdocs中\測試\的index.php:9)在C:\ XAMPP \ htdocs中\上測試\的index.php線12個

Cookies是在HTTP響應頭中發送。由於HTML內容已經開始,你不能回頭去添加cookie。

http://php.net/setcookie

setcookie()函數定義一個cookie與HTTP頭的其餘部分一起被髮送。像其他頭,餅乾必須發送之前任何輸出從您的腳本(這是協議限制)。這要求您在任何輸出之前調用此函數,包括<html><head>標記以及任何空格。

移動任何HTML之前setcookie語句出現:

<?php 
$value = 'something from somewhere'; 

setcookie("TestCookie", $value); 
?> 
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> 
.... 
+0

@KennyTM,還有更多問題。我測試了代碼,它運行良好。但是當我創建另一個** viewMore.php **,它使用與** view.php **相同​​的代碼。但viewTwo.php位於** http://localhost/testMore/viewMore.php**。(不同的目錄),我無法用viewMore.php「回聲」cookie值,否則view.php仍能正常工作。你能告訴我爲什麼嗎? – 2010-04-17 12:13:51

+0

@Nano:將'$ path'參數設置爲'/'。請參閱文檔。 – kennytm 2010-04-17 15:00:17

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> 
19

Cookies是在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也許有幫助。

+0

你救了我的日子:-)謝謝你的夥伴 – Thamaraiselvam 2016-02-08 12:39:49

8

或者只是把

output_buffering = On 

php.ini

參考http://digitalpbk.com/php/warning-cannot-modify-header-information-headers-already-sent一個完整的解決方案

+0

這是唯一的原因和解決方案!謝謝!以上都不適合我!有時候某處可能有用!但是你說了什麼!太棒了!〜 – Hossein 2013-02-19 13:25:16

+0

有時候我需要在體內循環中設置cookie ..所以這也解決了我的問題。 – rusly 2013-03-30 11:08:22

1

這裏的東西值得看出來......

我有同樣的問題,發現有一個空間後關閉?>在一個文件的結尾我包括在正確的地方之前任何出正在產生。這讓我發瘋了!

相關問題