2012-03-20 227 views
5

在我的项目中,我有一个包装类$_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.

谁能告诉我为什么想检查是否会话变量设置返回任何内容?

+0

你还记得session_start(); ?虽然它可能看起来微不足道,但你应该确定。 – Repox 2012-03-20 06:30:44

+0

是的,会话是在父类的构造函数中启动的。 die(session_id)按照预期返回一个字符串。 – Jormundir 2012-03-20 06:33:13

+2

使用'var_dump'而不是'die'或'echo'。在PHP中,转换为字符串的布尔型“假”(在您的情况下用于输出)将被转换为空字符串。 'var_dump'会显示实际的值和类型。这只是基本的PHP,请先让你自己熟悉语言。 – hakre 2012-10-16 07:55:37

回答

8

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

因此,在你的包装,添加:

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

要使用它,你就必须做到:

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

如果仍不能正常工作,这样做:

var_dump($_SESSION) 

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

+0

public function __isset($ var) { return isset($ _ SESSION [$ var]); ($ var) } \t \t public function isItSet($ var) {isset($ _ SESSION [$ var])); } 感谢您的快速响应,但我仍然有与上面的代码相同的问题。 我也试过isset($ this-> session-> idUser) – Jormundir 2012-03-20 06:30:05

+0

您可以删除'isItSet()'函数,因为它没有任何用处。我也更新了我的答案。 – F21 2012-03-20 06:43:04

+0

isset($ this-> session-> var)仍然不会返回任何内容。 我摆脱了isItSet()。 var_dump显示$ _SESSION是一个空数组。 (这是预期的,所以不应该isset返回false?) – Jormundir 2012-03-20 06:52:01

0

isset函数:如果var存在并且具有非NULL值,则返回TRUE;否则返回FALSE。 如果会话变量设置为TRUE,如果会话变量取消设置,则返回FALSE。

实施例:

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

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

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

isset()仅适用于变量,因为传递任何东西都会导致解析错误。为了检查是否设置了常量,使用defined()函数。因为你的变量不开庭存在,所以isset返回false,但是,回声返回false'

For More Information about isset click here

1

isset返回一个空页。
它已经写的评注中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'])));

0

一对夫妇的事情,你可以尝试:

添加到您的代码库: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); 
} 

我很明显希望从他们两个都得到相同的内容。

希望有所帮助。

3

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

主要原因后面为什么会话变量isset没有返回是根据PHP手册本身使用 模具() 函数,它是等效退出(的)

http://in1.php.net/die

所以,用var_dump()代替。

0

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

你可以做的是在会话开始之后,在会话数组中定义/初始化一个值为“null”或空字符串“”的“ID”键。然后用你的代码填入你的价值。

这是为了确保当您使用isset($ _ SESSION [“ID”],结果可以是真或假,而不是一个未定义的索引错误。

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()

  • 用它来检查你的会话,如果它有youre设法宣布 的名称。

的简要说明:

isset()

  • 返回true一个布尔值或false

is_null()

  • 只接受NULL参数值返回布尔值 true否则它会变为false

die()

  • 返回1 truefalse值空值。

原因:

  • 一个布尔TRUE值被转换为字符串 “1”。布尔型 FALSE转换为“”
0

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

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

调整F21的答案,为了支持isset(),你需要在你的wrapper中重载函数。虽然这样做,你也可以创建一个功能如你所期望的。

以下内容的某些部分将解决“错误是不可见的”和移除会话值的问题。

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