2013-09-25 43 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

正如我所说,我确实同意你的看法:-) –