部分删除/销毁$ _SESSION数据? PHP

时间:2012-01-24 17:15:08

标签: php session unset

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

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

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

e.g。

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

此过程的用例是:

  

用户登录 - >用户执行任务 - >任务完成后,删除与任务相关的会话数据 - >用户仍然登录!

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

谢谢你的时间!

4 个答案:

答案 0 :(得分:3)

没有办法在保留特定变量的同时删除“SESSION数组的整个部分”。相反,您可以使用二维数组执行任务并删除该数组。

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

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

当task1完成删除时

  unset($_SESSION["task1"]);

现在$ _SESSION [“task2”]仍然存在。

答案 1 :(得分:1)

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

$_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'));

就DB而言,你可以做到这一点,但它没有必要实现你的目标,除非有你在原始问题中列出的移动部件,否则你可能不需要做任何复杂的事情。

答案 2 :(得分:0)

在层次结构中构建会话数据:

$_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

答案 3 :(得分:0)

我将不同意@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。

希望这有帮助。