2013-10-14 70 views
1

我已閱讀in_array上的所有其他文章,但仍不明白爲什麼我會得到奇怪的結果。我從別人那裏繼承了這個代碼,並沒有完全理解他們爲什麼做了某些事情。當用戶登錄時,數據從數據庫中獲取,其中一個字段是其「級別」。 1是管理員,2是普通用戶等。一旦數據從數據庫中抓取,我們將用戶級別(存儲爲1:{i:0; s:1:「2」)存儲到一個數組中:php in_array給出奇數結果

$user_level = unserialize($this->result['user_level']); 
$_SESSION['unt']['user_level'] = $user_level; 

後來我們檢查,如果這是一個管理:

error_log(print_r($_SESSION['abc']['user_level'])); //this is always "1" 
if (in_array('1', $_SESSION['abc']['user_level'])) { //should be yes, correct? 

但不知怎麼的if語句永遠評估爲真,即使session變量1.什麼我缺少什麼?

+0

你的print_r應該有真正的作爲第二個參數,如果你傳遞的結果,而不是打印它,例如error_log(print_r($ _ SESSION ['abc'] ['user_level'],true)); – AsksAnyway

回答

0

即使我注意到閉架}缺少從您輸入的字符串我只是認爲你可能有可能同時複製粘貼錯過。

a:1:{i:0;s:1:"2" 

所以in_array不是問題,但你的輸入字符串是問題。
使用display_errors設置Off當您嘗試使用unserialize時,您不會看到任何錯誤。

你可以使用下面的函數來檢查,如果輸入的是一個有效的字符串反序列化:

// Copied from http://www.php.net/manual/en/function.unserialize.php 
function is_serialized($str) 
{ 
    return($str == serialize(false) || @unserialize($str) !== false); 
} 

然後沿着這些路線的東西:

$inputString = 'a:1:{i:0;s:1:"2";}'; // Is valid and is holding one array of info 
// $inputString = 'a:1:{i:0;s:1:"2"'; // Invalid as is missing a closing baracket } 

if(! is_serialized($inputString)) 
{ 
    echo 'Is not serialized'; 
} 
else 
{ 
    $user_level = unserialize($inputString); 

    $_SESSION['unt']['user_level'] = $user_level; // Is an array 

// Note the second argument as was already pointed by @AsksAnyway 
    error_log(print_r($_SESSION['unt']['user_level'] , true)); 

    var_dump(in_array('1' ,$_SESSION['unt']['user_level'])); 

    var_dump(in_array('2' ,$_SESSION['unt']['user_level'])); 
} 
+0

有趣。所以即使gettype表示它是一個數組,print_r只打印數字1.兩個var_dumps都返回爲NULL。 – user1309220

+0

你的序列化的字符串缺少結束括號'}':'a:1:{i:0; s:1:「2」'並且你好像轉向關''display_errors'。在這種情況下,我也得到了相同的結果:'1','null','null'。如果'display_errors'是'On',那麼在反序列化時PHP會失敗。我已經相應地更新了我的答案。 – Uours

+0

當我剪切並粘貼時,我錯過了結束花括號,並打開了display_errors。Uours的解決方案就像一個魅力 - 謝謝你! – user1309220

2

$_SESSION['abc']['user_level']看起來不是一個數組。看起來像你想要以下之一。

如果的GetType($ _ SESSION [ 'ABC'] [ 'user_level'])是 '整數':

if ($_SESSION['abc']['user_level']) === 1) { 

如果的GetType($ _ SESSION [ 'ABC'] [ 'user_level'])爲'字符串 ':

if ($_SESSION['abc']['user_level']) === '1') { 

如果將gettype($ _ SESSION [' ABC '] [' user_level'])是 '串',其價值實際上包含引號:

if ($_SESSION['abc']['user_level']) === '"1"') { 

如果它是一個陣列輸出將具有這樣的結構,不只是「1」:

Array 
(
    [0] => 1 
) 
+0

有趣 - 當我使用gettype時,它會作爲一個數組返回,因此上述工作都不起作用! – user1309220