【问题标题】:PHP: destroy $_COOKIES only but not $_SESSION?PHP:只销毁 $_COOKIES 而不是 $_SESSION?
【发布时间】:2013-09-25 08:44:53
【问题描述】:

我只想销毁所有 $_COOKIES 信息,而不是 $_SESSION 中的 info/ 数据,所以我使用下面的这段代码,但它也销毁了我所有的 $_SESSION 数据,这不是我想要的,

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

但是如果我一一取消设置 $_COOKIES 数据,$_SESSION 数据仍然不会被破坏,例如,

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

为什么foreach 代码也会破坏 $_SESSION。我可以只销毁 $_COOKIES 吗?

【问题讨论】:

    标签: php session-cookies php-5.4


    【解决方案1】:

    当您启动会话时,PHPSESSID 将被添加到 $_COOKIE 数组中,您在使用 foreach 设置 setcookie 时重置该数组。

    你可以试试这个:

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

    【讨论】:

      【解决方案2】:

      Session 一般(它的 php.ini 参数)使用 cookie。因此,您必须过滤要销毁的 cookie,以免破坏会话使用的 cookie。 cookie 名称默认为“PHPSESSID”,但也可能是其他名称,使用 session_name() 获取。

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

      【讨论】:

      • 我同意你的方法,但session_name() 是一种昂贵的使用方法。由于开发人员之前已经设置(或不设置)session_name(),因此在这里再次检查似乎无关紧要。
      • 你是对的。我应该使用一个在 foreach 循环之外设置的变量来仅存储一次 session_name() 内容。并且使用 session_name() 可以确保如果您(或其他团队同事)更改会话名称,您的代码将继续工作而无需任何其他更改。
      • 正如我所说,我同意你的观点 :-)
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-02-17
      • 2015-06-01
      • 1970-01-01
      • 2012-03-26
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多