PHP isset($_SESSION[$var]) 根本不起作用


PHP isset($_SESSION[$var]) Not working at all

在我的项目中,我有一个用于$_SESSION的包装类,因此会话变量可以通过$session->var访问。我试图检查是否设置了会话变量isset

if (!isset($this->session->idUser)) {
    ...
}

isset没有返回任何东西。所以在我的包装类中,我编写了以下函数来测试发生了什么。

public function isItSet($var)
{
   die(isset($_SESSION["id"]));
}

这将导致空白页。我试过了:

public function isItSet($var)
{
    die(is_null(isset($_SESSION["id"])));
}

仍然是一张空页。然后我尝试了:

public function isItSet($var)
{
    die(isset($_SESSION));
}

这将返回 1。

谁能告诉我为什么尝试检查是否设置了会话变量,什么也没返回?

为了支持isset(),您需要在包装器中重载函数。

因此,在您的包装器中添加:

public function __isset($var){
  return isset($_SESSION[$var]);
}

要使用它,您只需要执行以下操作:

isset($this->session->myVar);

如果仍然无法正常工作,请执行以下操作:

var_dump($_SESSION)

这将转储整个 $_SESSION 数组,并显示您正在检查的变量是否确实存在。

在我看来,问题与测试有关,而不是与 PHP 会话有关。

会话变量 isset 不返回任何内容背后的主要原因是使用die((函数,根据 PHP 手册本身等效于 exit((。

http://in1.php.net/die

因此,请改用 var_dump((。

isset 返回一个空页面,因为您的变量在会话中不存在,因此 isset 返回 false,但是,回显 false 返回 ''。
它已经写在哈克雷

的评论中您可以像这样测试:

echo "false : " . false . "'n";
echo "true : " . true . "'n";

=>

false : 
true : 1

因此,对于您的测试,请执行var_dump($_SESSION),您将看到isset($_SESSION['id'])返回 false 是否正常。

你也可以测试: die("false : " . (false == isset($_SESSION['id'])));

你的结果基本上是正确的。

我认为传递给每个函数的布尔值只会让您感到困惑。

这里有一个清晰的解释,你的每个陈述会发生什么。

让我们一一得到

// declaring this array as a set of session being passed as sample.
$string = array('name'=>'kaii');
echo die(isset($string['id'])); // figure 1
// step
// isset($string) returns a value of false because of unexistent of an array with the name of id.
// die(false)   returns nothing because of the value being passed by isset is false.
// result would be definitely empty
echo die(is_null(isset($string['id']))); // figure 2
// step
// isset($string) returns a value of false because of unexistent of an array with the name of id.
// is_null(false) returns a value of false because it only accepts NULL as its parameter value to return true.
// die(false)   returns nothing because of the value being passed by is_null is false.
// result would be definitely empty

echo die(isset($string)); //figure 3
// step
// isset($string) returns a value of true because of a $string variable is set and exist.
// die(true)    returns a value of 1 because of the value being passed is true which is equivalent to 1 .
// result would be definitely return a value of 1.

注意:一般来说,您的陈述是正确的,只需要一些理由来支持它。


附加:

print_r()var_dump()

  • 使用它来检查您的会话是否具有您尝试的名称宣布。

简要说明:

isset()

  • 返回布尔值 truefalse

is_null()

  • 仅接受NULL参数值以返回布尔值 true否则它会false.

die()

  • 对于 true 返回值 1,对于 false 返回空值。

原因:

  • 布尔TRUE值将转换为字符串"1"。布尔 FALSE转换为 ">

isset 函数:如果 var 存在并且具有 NULL 以外的值,则返回 TRUE,否则返回 FALSE。如果会话变量已设置,则给出 TRUE,如果会话变量未设置,则给出 FALSE。

例:

$_SESSION['views']=1;会话变量设置。=> 给出 TRUE

unset($_SESSION['views']);会话变量未设置。=> 在此if(isset($_SESSION[$var]))之后,它给出 FALSE

有两个选项:会话变量是否设置。

isset(( 仅适用于变量,因为传递任何其他内容都会导致解析错误。要检查是否设置了常量,请使用 defined(( 函数。

有关isset的更多信息,请单击此处

您可以尝试以下几件事:

将此添加到您的代码库:http://philsturgeon.co.uk/blog/2010/09/power-dump-php-applications。它比var_dump好得多,您可以清楚地看到布尔值的假。这让我省去了不少悲伤。

其次,die()并不总是能给我我所期望的,所以最好先echo一些东西,然后再die()

如@doydoy44所述,false输出一个空白,因此您可能有充分的理由得到一个空白页。同样,上面的链接将解决此问题并使事情更加清晰。

上面的原始代码idUser为正在检查的变量,所有其他示例都使用 id 。我想你知道这一点,但我想我会提到它以防万一。

最后,我会交叉检查会话包装器是否按预期工作,例如

if (!isset($this->session->idUser)) {
    dump($_SESSION);
    dump($this->session);
}

我显然希望从他们俩那里得到相同的内容。

希望这有所帮助。

从外观上看,会话数组上似乎没有"ID"键。这在您对 F21 答案的评论中得到了验证("未定义的索引错误"(。

您可以做的是在会话启动后定义/初始化会话数组上的"ID"键,其值为 null 或空字符串 "。然后稍后用您的代码填充您的值。

这是为了确保在使用 isset($_SESSION["ID"] 时,结果可以是真或假,而不是未定义的索引错误。

会话变量有点神奇。没有历史上的魔力那么神奇,但观察到不寻常的事情仍然不足为奇。

三种状态运行问题中的测试是有意义的:一次设置了会话变量,两次没有设置会话变量 - 一次使用不同的会话变量集,一次使用未设置会话变量。

调整 F21 的答案,以支持 isset((,您需要在包装器中重载函数。在这样做的同时,您还可以创建一个按预期运行的 isset。

类似于以下内容的内容将解决"false 是不可见的"和删除会话值的问题。

public function __isset($var){
 if (isset($_SESSION[$var]) && $_SESSION[$var]."">"") {
  return true;
 } else {
  return false;
 }
}