PHP:只销毁$\u COOKIES,而不销毁$\u会话?

PHP:只销毁$\u COOKIES,而不销毁$\u会话?,php,session-cookies,php-5.4,Php,Session Cookies,Php 5.4,我只想销毁所有$\u cookie信息,但不销毁$\u会话中的info/data,因此我使用下面的代码,但是它会破坏我的$\u会话数据,这不是我想要的 // Destroy all cookies. foreach ( $_COOKIE as $key => $value ){ setcookie( $key, "", time()-1800, '/' ); } 但是,如果我逐个取消设置$\u COOKIES数据,$\u会话数据将保持未设置状态,例如 setcookie('acc

我只想销毁所有$\u cookie信息,但不销毁$\u会话中的info/data,因此我使用下面的代码,但是它会破坏我的$\u会话数据,这不是我想要的

// Destroy all cookies.
foreach ( $_COOKIE as $key => $value ){
    setcookie( $key, "", time()-1800, '/' );
}
但是,如果我逐个取消设置$\u COOKIES数据,$\u会话数据将保持未设置状态,例如

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

为什么
foreach
代码也会破坏$\u会话。我可以只销毁$\u COOKIE吗?

当您启动会话时,
PHPSESSID
将添加到
$\u COOKIE
数组中,您可以在使用foreach设置
setcookie
时重置该数组

您可以尝试以下方法:

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

启动会话时,
PHPSESSID
将添加到
$\u COOKIE
数组中,使用foreach设置
setcookie
时会重置该数组

您可以尝试以下方法:

// Destroy all cookies.
foreach ( $_COOKIE as $key => $value ){
    if($key != 'PHPSESSID'){
        setcookie( $key, "", time()-1800, '/' );
    }
}
会话通常(它是php.ini参数)使用cookie。因此,您必须对要销毁的cookie进行筛选,以避免销毁会话使用的cookie。 cookie名称默认为“PHPSESSID”,但可能是其他名称,请使用session_name()获取它

foreach ( $_COOKIE as $key => $value ){
    if ( $key != session_name() ) { 
        setcookie( $key, "", time()-1800, '/' );
    }
}
会话通常(它是php.ini参数)使用cookie。因此,您必须对要销毁的cookie进行筛选,以避免销毁会话使用的cookie。 cookie名称默认为“PHPSESSID”,但可能是其他名称,请使用session_name()获取它

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

我同意你的方法,但是
会话\u name()
是一种昂贵的使用方法。至于开发人员以前是如何设置(或不设置)一个
session\u name()
的,在这里再次检查似乎无关紧要。你是对的。我应该使用一个在foreach循环之外设置的变量来只存储一次session_name()内容。使用session\u name()可以确保,如果您(或其他团队同事)更改了会话名称,您的代码将在没有任何其他更改的情况下继续工作。正如我所说,我同意您的观点:-)我同意您的方法,但是
session\u name()
是一种昂贵的使用方法。至于开发人员以前是如何设置(或不设置)一个
session\u name()
的,在这里再次检查似乎无关紧要。你是对的。我应该使用一个在foreach循环之外设置的变量来只存储一次session_name()内容。使用session_name()可以确保,如果您(或其他团队同事)更改了会话名称,您的代码将在没有任何其他更改的情况下继续工作