销毁会话,但保留一个变量集

Posted

技术标签:

【中文标题】销毁会话,但保留一个变量集【英文标题】:Destroy session, but keep one variable set 【发布时间】:2011-11-16 01:27:05 【问题描述】:

我正在使用会话变量来控制登录和页面访问。我使用变量来控制一个用户所属的不同用户组,所以我有相当多的会话变量。

我还使用会话变量来记住用户在刷新时上次访问的页面。

当用户注销时,我使用 session_destroy();删除所有变量。 我想做的是即使在用户注销后也保持上次访问的页面变量。

我想我可以通过对每个其他变量使用 unset 函数来做到这一点,但是有很多,想知道是否有更简单的方法?

谢谢 编辑

【问题讨论】:

【参考方案1】:

你可以销毁会话,但在这样做之前,将最后一页保存到一个变量中,然后你将把它放入一个新的会话变量中。

$lastPage = $_SESSION['last_page'] $session_destroy(); 然后创建一个包含 $lastPage 的新会话。

另一种方法是将用户访问的最后一页保存到数据库的用户记录中。 (这将使它可以从任何地方访问,并且不会特定于位置)

【讨论】:

这也是一个好主意,就像所有其他人一样。这可能是我将来会去的东西!谢谢!!编辑【参考方案2】:

你可以试试下面的代码,

$Arr_not_destoy_session = array('last_visited_id');

        foreach($_SESSION as $sees_key => $sess_val )
            if(!in_array($sees_key, $Arr_not_destoy_session))
                unset($_SESSION[$sees_key]);    
               
        

这将仅取消设置除“last_visited_id”之外的所有会话变量。您还可以在此数组中添加更多您以后不想删除的值..

谢谢。

【讨论】:

【参考方案3】:

回到你现有的使用unset() 的后备解决方案,你说这个问题是有很多,但这不应该让它变得困难;我仍然认为这是解决您问题的好方法。

首先,您可以使用foreach() 循环将它们全部取消;这只需要几行代码:

foreach($_SESSION as $key=>$value) 
    if($key != "the_one_you_want_to_keep") 
         unset($_SESSION[$key]);
    

另一种方法是将会话数据组织到子数组中,这样您就可以通过取消设置单个***数组变量来清除它们,但保持其他子数组中的其他会话数据不变:

unset($_SESSION['user_data']);
//but don't unset $_SESSION['data_to_keep']

希望对您有所帮助。

【讨论】:

我现在已经有了另一个答案,但这是个好建议,谢谢!编辑【参考方案4】:

尝试将会话变量分组到数组中并取消设置它们,您只需取消设置$_SESSION 中的一个或多个数组。例如,如果您将用户信息保留在会话中,请尝试以下操作:

$_SESSION['user_info'] = array(...);

$_SESSION['last_visited_page'] = '...';

注销后您可以取消设置$_SESSION['user_info'] 并保留$_SESSION['last_visited_page']

【讨论】:

没有必要创建 $_SESSION['user_info']** 数组..这根本没用。所有会话变量都将仅在 **$_SESSION 中获取..Thx IMO 它更有用,因为您可以取消设置所有您需要的,只需取消设置 $_SESSION 中的一个变量,而不是一个一个地进行

以上是关于销毁会话,但保留一个变量集的主要内容,如果未能解决你的问题,请参考以下文章

PHPMyAdmin 自动会话销毁问题

CodeIgniter 3 会话在页面刷新后销毁

销毁 php 后启动会话

如何正确启动和销毁会话?

在会话自动销毁之前调用自定义方法

如何销毁 Symfony 2 中的所有会话