【问题标题】:Partially delete/destroy $_SESSION data? PHP部分删除/销毁 $_SESSION 数据? PHP
【发布时间】:2012-02-17 22:49:57
【问题描述】:

我正在寻找一种方法来仅删除存储的特定数量的 SESSION 数据,同时保留与正在登录的用户关联的会话数据。

目前,我正在通过对要删除的 SESSION 变量的单个 unset 语句执行此操作。

但是我希望可能有一种更聪明的方法来删除 SESSION 数组的整个部分,同时保留特定变量

例如

$_SESSION['username'];
$_SESSION['user_id'];
$_SESSION['ttl'];

这个过程的用例是:

用户登录 --> 用户执行任务 --> 任务完成后删除与任务关联的会话数据 --> 用户仍处于登录状态!

我曾考虑在我的数据库监控登录中使用表,您对此有何看法?

感谢您的宝贵时间!

【问题讨论】:

  • 您可以对数组进行 for_each 以取消设置除您想要的之外的所有内容。另一种方法是您可以将要设置 $_SESSION 的变量保存到新数组中,然后将 var 放回其中。

标签: php session unset


【解决方案1】:

没有办法删除“SESSION 数组的整个部分同时保留特定变量”。取而代之的是,您可以将二维数组用于任务并删除该数组。

$_SESSION["task1"]["username"] = "name"
$_SESSION["task1"]["pass"] = "pass"

$_SESSION["task2"]["name"] = "name";

当task1完成删除时

  unset($_SESSION["task1"]);

现在 $_SESSION["task2"] 仍然存在。

【讨论】:

    【解决方案2】:

    您可以将所有这些易失性数据存储在另一个密钥中:

    $_SESSION['volatile'] = array(
       'one' => 'value'
    );
    

    如果你不想这样做,你可以使用数组比较函数,例如:

    // specify what keys to keep
    $_SESSION = array_intersect_key($_SESSION, array('keepme1', 'keepme2', 'etc'));
    
    //specify what keys to remove
    $_SESSION = array_diff_key($_SESSION, array('deleteme1', 'deleteme2', 'etc'));
    

    就数据库而言,您可以这样做,但它不是实现您的目标所必需的,除非您在原始问题中没有列出移动部件,否则您现在可能不需要做任何复杂的事情。

    【讨论】:

      【解决方案3】:

      按层次结构构建会话数据:

      $_SESSION['loggedIn'] = TRUE;
      
      // Temporary session data
      $_SESSION['temporary'] = array(
          'temp_var1' => 'foo',
          'temp_var2' => 'bar',
          // ...
          'temp_var99' => 'baz'
      );
      
      echo $_SESSION['temporary']['temp_var2']; // bar
      
      // Remove all temporary session data
      unset($_SESSION['temporary']);
      
      echo $_SESSION['loggedIn'] ? 'yes' : 'no'; // yes
      

      【讨论】:

        【解决方案4】:

        我不得不不同意@sathishkumar,以下方法会破坏部分会话变量。

        public static function destroyPartial($keys)
        {
        
            if (session_status() === \PHP_SESSION_NONE) {
                session_start();
            }
        
            if (!is_array($keys)) {
                $keys = [$keys];
            }
            foreach ($_SESSION as $k => $v) {
                if (in_array($k, $keys, true)) {
                    unset($_SESSION[$k]);
                }
            }
        
        
        
            $recoveringSession = $_SESSION;
            session_destroy();
            session_start();
            $_SESSION = $recoveringSession;
        }
        

        在 session_destroy 函数的 php 文档中,我们可以看到:

        session_destroy() 销毁所有与当前关联的数据 会议。它不会取消设置与 会话,或取消设置会话 cookie。使用会话变量 再次,必须调用 session_start()。

        因此,“诀窍”是在 session_destroy 之后调用 session_start。

        希望这会有所帮助。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2020-04-27
          • 1970-01-01
          • 1970-01-01
          • 2011-07-01
          • 2014-05-10
          • 2017-01-18
          • 1970-01-01
          相关资源
          最近更新 更多