2010-08-31 33 views
4

我不記得在過去使用Cookies有許多問題,但我在玩耍時遇到了一些意想不到的結果。

(我在本地主機上運行,​​因此我的域設置)

<?php 
$sessionCookie = rand(); 
setcookie("crav_auto_login_cookie", $sessionCookie, false,"/crav/", false); 
echo "Cookie Set<br/>"; 
echo "Cookie equals: ".$_COOKIE["crav_auto_login_cookie"]."<br/>"; 
echo "should equal: ". $sessionCookie; 
?> 

這將在下面的輸出產生:

Cookie Set
Cookie equals: 457718770
should equal: 318511886

我顯然缺少一些東西,但不知道爲什麼值不同。是否因爲頁面調用加載了cookie,並且​​返回打開頁面時調用的實例的結果,而不是反映新設置的值?如果是這樣的話,那爲什麼?

回答

5

setcookie設置標題發送回客戶端以設置cookie。 $_COOKIE陣列(其中包含從客戶端發送的發送的的cookie)將無法訪問新的cookie,直到下一個請求。

這裏是事件的簡化進程,當用戶訪問你的頁面:

  1. 用戶瀏覽器發送一個請求您的服務器。此請求包含標題,包括爲您的域爲該用戶設置的Cookie。 PHP根據此請求中的數據填充$_COOKIE(以及$_GET,$_POST等)數組。
  2. 服務器解析用戶的請求,並設置響應。此響應以響應標題(包括您通過header設置的任何標題以及通過setcookie設置的標題爲開頭)開始。所有標題必須位於任何頁面輸出之前(正如您可能遇到的那樣,如果您在開始輸出頁面內容之後嘗試發送更多標題,PHP會給您一個錯誤)。
  3. 服務器發送頁面內容(實際上,標題和內容是同一傳輸的一部分)。
  4. 服務器和客戶端之間的連接關閉(爲討論目的,我們忽略AJAX)。
  5. 客戶端解析收到的標題和內容,根據需要設置cookie並呈現頁面(實際上,這可能會在接收頁面的情況下順序發生)。

因此,當客戶端收到並處理set-cookie頭時,客戶端已經完成了與服務器的通信,這就是爲什麼在下一個請求之前cookie不會顯示給PHP。

+0

謝謝,我只是在玩了一會之後才注意到它。 – 2010-08-31 01:19:18

+0

不錯的解釋! – 2010-08-31 02:07:12

1

PHP.net's setcookie documentation下的「常見錯誤」:

餅乾不會成爲可見,直到 到的網頁上 餅乾應該是可見的未來負載。要測試 ,如果cookie已成功設置,則在cookie過期之前, 將在下一個加載 頁面上檢查cookie。

+0

是。我只是注意到,新設置的一個可以在下一頁加載..我想我從來沒有嘗試設置和獲取一個這樣的腳本中的cookie,所以我什至沒有想到它:P – 2010-08-31 01:18:39

1

你可以直接覆蓋超全球。

$ sessionCookie = rand(); (「crav_auto_login_cookie」,$ sessionCookie,false,「/ crav /」,false); $ _COOKIE [「crav_auto_login_cookie」] = $ sessionCookie;

echo「Cookie Set」;
echo「Cookie equals:」。$ _ COOKIE [「crav_auto_login_cookie」];
回聲「應該等於:」。 $ sessionCookie;