2013-10-14 4 views
1

Я прочитал все другие статьи на in_array и до сих пор не понимаю, почему мои данные приводят к нечетным результатам. Я наследую этот код от кого-то еще и не понимаю, почему они сделали определенные вещи. Когда пользователь входит в систему, данные захватываются из db, причем одно из полей является их «уровнем». 1 - администратор, 2 - обычный пользователь и т. Д. Как только данные захватываются из db, мы помещаем пользовательский уровень (сохраненный как a: 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? 

Но так или иначе, если заявление никогда не оценивает, как верно, даже если переменная 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 "' и кажется, что вы отключили 'Off'' display_errors'. В этом случае я тоже получил тот же результат: '1',' null', 'null'. Если 'display_errors' является' On' PHP, он потерпел бы неудачу, пока 'unserialize'ing. Я соответствующим образом обновил свой ответ. – Uours

+0

Я пропустил конец фигурного скобки, когда я вырезал и вставил, и включил display_errors.Решение от Uours работало как шарм - спасибо! – user1309220

2

$_SESSION['abc']['user_level'] не представляется массивом. Похоже, вам нужно одно из следующего.

Если GetType ($ _ SESSION [ 'а'] [ 'user_level']) является 'целого':

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

Если GetType ($ _ SESSION [ 'а'] [ 'user_level']) является " строка ':

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

Если GetType ($ _ SESSION [' а '] [' user_level ']) является 'строки' и его значение фактически содержит цитаты:

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

Если это было массив выход будет иметь такую ​​структуру, а не только «1»:

Array 
(
    [0] => 1 
) 
+0

Интересно - когда я использую gettype, он возвращается как массив, поэтому ни одна из вышеперечисленных задач не работает! – user1309220

Смежные вопросы