【问题标题】:PHP 5.6 unset $_SESSION sub array entryPHP 5.6 未设置 $_SESSION 子数组条目
【发布时间】:2015-09-24 14:42:29
【问题描述】:

我得到了以下功能:

public function stopWatcherSession($sessionID) {
    if(array_key_exists($sessionID, $_SESSION[self::WATCHER_SESSION_KEY])) {
        foreach ($_SESSION[self::WATCHER_SESSION_KEY][$sessionID]['names'] as $v) {
            $ptype = $this->paramTypeFromName($v);
            unset($_SESSION[self::SESSION_KEY][$ptype][$v]); //does not work, sets entry to null
        }
        unset($_SESSION[self::WATCHER_SESSION_KEY][$sessionID]); //does not work, sets entry to null
    }
}

正如 cmets 所说,数组条目没有被取消设置,array_key_exists() 函数仍然返回 true,如果你 var_dump($_SESSION) 可以看到,$_SESSION[self::WATCHER_SESSION_KEY][$sessionID] 为空。

如何取消设置变量,以便删除数组中的键?

我尝试过的事情,但没有奏效:

// v1 (tried also for `$_SESSION[self::WATCHER_SESSION_KEY][$sessionID]` )
$tmp = $_SESSION[self::SESSION_KEY][$ptype];
unset($tmp[$v]);
$_SESSION[self::SESSION_KEY][$ptype] = $tmp;

//v2
unset($_SESSION[self::WATCHER_SESSION_KEY][$sessionID]);
session_write_close();
session_start();

//v3 => v1 & v2 combined
$tmp = $_SESSION[self::SESSION_KEY][$ptype];
unset($tmp[$v]);
$_SESSION[self::SESSION_KEY][$ptype] = $tmp;
session_write_close();
session_start();

我可以在整个代码中添加一个糟糕的 hack 来检查它是否是 null,但是必须将 »empty« 值更改为其他值(例如预定义的 const,但这是一个讨厌的解决方法,并导致其他人混淆开发者!)

有人有想法吗?

【问题讨论】:

  • 空值可以保留在数组中,用于空值检查使用isset
  • 如果“已提交,但未输入值”的标准值是 null 并且不在数组中是“未提交”,那么让密钥仍然漂浮在周围并不是一件好事带有null-值。取消设置应该可以解决这个问题...

标签: php session unset array-unset


【解决方案1】:

搞定了:

unset($GLOBALS['_SESSION'][self::WATCHER_SESSION_KEY][$sessionID]); 完成这项工作。

http://php.net/manual/en/function.unset.php 说:

函数内部的 unset() 行为可能会根据您尝试销毁的变量类型而有所不同。 [...] 要在函数内取消设置()全局变量,然后使用 $GLOBALS 数组来执行此操作

似乎是经典的»PHP 行为在某些情况下未定义«-示例。

【讨论】:

    猜你喜欢
    • 2013-11-06
    • 1970-01-01
    • 1970-01-01
    • 2012-10-08
    • 1970-01-01
    • 2021-01-01
    • 2011-07-03
    • 2014-06-09
    • 2015-04-24
    相关资源
    最近更新 更多