2012-02-23 89 views
0

我使用此代碼設置cookie,然後看看他們是否存在

setcookie("token", "value", time()+60*60*24*100, "/"); 
setcookie("secret", "value", time()+60*60*24*100, "/"); 
setcookie("key", "value", time()+60*60*24*100, "/"); 

if (!isset($_COOKIE['token']) || !isset($_COOKIE['secret']) || !isset($_COOKIE['key'])) { 

// do something because one of the cookies were not set 

} 

雖然餅乾的所有三個在我的瀏覽器設定,它仍然運行if()聲明。通過消除過程,我發現中間cookie !isset($_COOKIE['secret'])似乎會導致if()語句運行,即使在我的瀏覽器中設置了Cookie secret。腳本說,當我看着我的瀏覽器並且它已被設置時,它沒有被設置。你能想出任何理由爲什麼PHP說它沒有設置?

+0

你的代碼適合我。該塊在第一次訪問時被執行,因爲$ _COOKIE沒有被setCookie中的值填充。在進一步調用時,該塊不再執行。你有沒有機會安裝cookie攔截器? – Basti 2012-02-23 14:53:49

+1

你用什麼工具來判斷這個cookie是否存在?螢火蟲?看起來很奇怪...... – 2012-02-23 14:54:54

回答

0

使用

if(array_key_exists($_COOKIE, 'secret') && strlen($_COOKIE['secret']) > 0) { 
} 
+2

這不回答我的問題,爲什麼我的代碼不工作?當它適用於其他兩個餅乾時。 – Frank 2012-02-23 14:50:54

+1

'array_key_exists($ _ COOKIE,'secret')=== isset($ _ COOKIE ['secret'])'並且OP不想'檢查它是否爲空。問題仍然存在 – Basti 2012-02-23 14:52:32

+1

@Basti抱歉是不一樣的,如果array_key_exists檢查密鑰是否存在,isset檢查值是否存在,當值爲null時,isset將返回false。 – silly 2012-02-23 14:58:28

7

setcookie只定義要與HTTP標頭的其餘部分一起發送cookie,他們可以在與$_COOKIE下一個頁面加載訪問。使用您的代碼,HTTP頭不會被髮送。

你只需要setcookie當cookie沒有設置。像:

if (!isset($_COOKIE['token'])) { 
    setcookie("token", "value", time()+60*60*24*100, "/"); 
} 
+0

那麼如何解決這個問題呢? – Frank 2012-02-23 14:54:12

+0

請勿使用$ _COOKIE來存儲您的信息。分離變量$ token,$ secret和$ key。並使用$ _COOKIE中的值加載它們。如果$ _COOKIE爲空,則手動初始化它們並調用setCookie。 – Basti 2012-02-23 14:58:11

+0

或者如果用戶沒有設置cookie,請執行'setCookie'並使用'header()'重新將用戶重定位到同一站點。 – Basti 2012-02-23 14:59:21