通过引用取消设置会话不起作用

Posted

技术标签:

【中文标题】通过引用取消设置会话不起作用【英文标题】:Unsetting Session by Reference does not work 【发布时间】:2019-09-02 17:09:22 【问题描述】:

我正在尝试使用函数取消设置会话,所以它更容易。 我这样调用函数:unsetSession("index1/index2/index3/...)

当我提供最后一个元素的完整路径时,它可以工作。但是,当我想删除包含更多元素的元素时,它不起作用。

例子:

$_SESSION

["test"]=>
array(1) 
  ["value1"]=>
  array(1) 
    ["value2"]=>
    string(6) "String"
  
 

这:unsetSession("test/value1/value2") 将起作用并删除 value2。 这:unsetSession("test/value1") 不会工作。那是我的问题。

代码:

PUBLIC function unsetSession($s) 

        if (!strstr($s, "/")) 

            unset($_SESSION[$s]);

         
        else 

            $temp = &$_SESSION;

            $path = explode('/', $s);

            if (!isset($temp[current($path)]) OR is_string($temp[current($path)])) return false;
            $temp = &$temp[current($path)];

            while ($next = next($path)) 

                if ((isset($temp[$next]) OR $temp[$next] == null) AND !is_array($temp[$next])) 

                    unset($temp[$next]);
                    return true;

                

                $temp = &$temp[$next];

            

            unset($temp); // <- DOES NOT UNSET SESSION, why?
            return true;

        

        return false;

    

知道为什么这不起作用吗?

【问题讨论】:

【参考方案1】:

我将使用 current() 和 next() 替换提供数组最后一个元素的函数 end():

   function unsetSession($s) 
    if (!strstr($s, "/")) 
        unset($_SESSION[$s]);
     else 
        $path = explode('/', $s)
        unset(end($path));
    
    return false;
    

【讨论】:

以上是关于通过引用取消设置会话不起作用的主要内容,如果未能解决你的问题,请参考以下文章

如何在生产中设置快速会话。快速会话在 https 中不起作用

为什么在取消引用非元组时,对取消引用的引用元组的匹配不起作用?

通过 C# 或 jQuery ajax 调用时,Web API 不起作用

取消设置变量不起作用

TommEE 会话持久存储不起作用

PhP 5.4 中的 PhP 上传进度不起作用。未设置会话变量