PHP isset($ _ SESSION [$ var])根本不工作

时间:2012-03-20 06:17:58

标签: php session isset

在我的项目中,我有$_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.

任何人都可以告诉我为什么尝试检查会话变量是否设置何时返回?

8 个答案:

答案 0 :(得分:8)

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

所以,在你的包装器中,添加:

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

要使用它,您只需要:

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

如果仍然无效,请执行:

var_dump($_SESSION)

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

答案 1 :(得分:3)

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

MAIN REASON 背后为什么会话变量isset返回什么都没有使用 的模具() 根据PHP手册本身等同于exit()的函数。

http://in1.php.net/die

所以,改为使用var_dump()

答案 2 :(得分:1)

isset返回一个空页面,因为你的变量在session中不存在,所以isset返回false,但是,echo false返回''。
它已经写在了对hakre的评论中 你可以这样测试:

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

=>

false : 
true : 1

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

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

答案 3 :(得分:1)

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

传递给每个函数的布尔值让我觉得困惑。

明确解释你的每一个陈述会发生什么。

让我们一个接一个

// 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已转换为“”

答案 4 :(得分:0)

isset函数:如果var存在并且其值不是NULL,则返回TRUE,否则返回FALSE。 如果会话变量设置为TRUE,如果会话变量未设置,则给出FALSE。

示例:

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

未设置

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

有两种选择:会话变量是否已设置。

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

For More Information about isset click here

答案 5 :(得分:0)

你可以尝试一些事情:

将此添加到您的代码库:http://philsturgeon.co.uk/blog/2010/09/power-dump-php-applications。它比var_dump好得多,您可以清楚地看到布尔值的 true false 。这给我带来了很多悲伤。

其次,die()并不总能给我我的期望,所以echo更好,然后die()

正如@ doydoy44所提到的,false会输出一个空白,因此您可能会因为某个原因而得到一个空白页面。同样,上面的链接将解决这个问题并使事情变得更加清晰。

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

最后,我会反复核对会话包装器是否正常工作,例如

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

我显然希望从这两者中获得相同的内容。

希望有所帮助。

答案 6 :(得分:0)

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

您可以做的是定义/初始化&#34; ID&#34;键入会话数组,其值为null或空字符串&#34;&#34;会话开始后。然后在您的代码中使用您的值填充它。

这是为了确保在使用isset($ _ SESSION [&#34; ID&#34;]时,结果可以是true或false,而不是未定义的索引错误。

答案 7 :(得分:0)

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

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

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

以下内容将解决'false is invisible'和删除会话值的问题。

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