2012-03-20 228 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; 
} 
}