2012-01-24 82 views
3

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

此刻我正在通过个人取消设置声明到我想要删除的SESSION变量。

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

例如

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

使用情况下这个过程将是:

用户登录 - >用户执行任务 - >一旦任务是与任务相关联的完整删除会话数据 - >用户仍登录!

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

谢谢你的时间!

+0

你可以for_each遍历数组来取消除了你想要的那个之外的任何事情。另一种方法是你可以将你想要设置的$ _SESSION变量保存到一个新的数组中,并将var放回去。 – jakx

回答

3

无法删除“SESSION数组的整个部分,同时保留特定的变量”。而不是您可以使用二维数组来处理任务并删除该数组。

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

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

时TASK1完全删除像

unset($_SESSION["task1"]); 

现在$ _SESSION [ “任务2”]仍然存在。在一个层次

+0

简单而有效! - 谢谢 :) – kaleeway

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你可以做到这一点,但没有必要完成你的目标,除非有你没有列出你原来问题ID的移动部件,否则你可能不需要做任何复杂的事情。

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 
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; 
} 

在PHP文档的session_destroy功能,我们可以看到这一点:

session_destroy()销毁所有与当前 会话相关的数据。它不会取消设置任何与会话相关的全局变量,也不会取消设置会话Cookie。要再次使用会话变量 ,必须调用session_start()。

所以,“诀窍”就是在session_sttroy后面调用session_destroy。

希望这会有所帮助。