2013-09-25 45 views
1

我只是想摧毀所有$ _COOKIES信息,但沒有信息/在$ _SESSION數據,所以我用這個代碼的下方,但它破壞我的所有$ _SESSION數據,以及這是不是我想要的,

// Destroy all cookies. 
foreach ($_COOKIE as $key => $value){ 
    setcookie($key, "", time()-1800, '/'); 
} 

但是,如果我取消設置由一個$ _COOKIES數據之一,比如$ _SESSION數據仍然未被破壞,

setcookie('accept_terms_conditions', "", time()-1800, '/'); 

爲什麼foreach代碼破壞$ _SESSION爲好。我可以只銷毀$ _COOKIES嗎?

回答

9

當您開始會話時,PHPSESSID將被添加到$_COOKIE陣列中,您在使用foreach設置setcookie時重置該陣列。

你可以試試這個:

// Destroy all cookies. 
foreach ($_COOKIE as $key => $value){ 
    if($key != 'PHPSESSID'){ 
     setcookie($key, "", time()-1800, '/'); 
    } 
} 
1

會議一般(這是php.ini中參數)使用的cookie。所以你必須過濾你想銷燬的cookies,以免銷燬會話中的一次使用。 Cookie名稱默認爲「PHPSESSID」,但可能是其他名稱,請使用session_name()來獲取它。

foreach ($_COOKIE as $key => $value){ 
    if ($key != session_name()) { 
     setcookie($key, "", time()-1800, '/'); 
    } 
} 
+0

我同意你的方法,但'session_name()'是一個昂貴的使用方法。而且,開發者以前已經自己設置了(或不是)'session_name()',所以在這裏再次檢查它似乎並不重要。 –

+1

你說得對。我應該使用一個變量,在foreach循環之外設置一次來存儲session_name()內容。使用session_name()可以確保如果您(或其他團隊的同事)更改會話名稱,您的代碼將繼續工作而不會發生任何其他更改。 – Armage

+0

正如我所說,我確實同意你的看法:-) –