PHP isset ($ _ SESSION [$ var]) вообще не работает - PullRequest
5 голосов
/ 20 марта 2012

В моем проекте у меня есть класс-оболочка для $_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 ]

8 голосов
/ 20 марта 2012

Для поддержки isset() вам необходимо перегрузить функцию в вашей оболочке.

Итак, в вашей оболочке добавьте:

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

Чтобы использовать ее, вам просто нужно сделать:

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

Если он все еще не работает, выполните:

var_dump($_SESSION)

Это выгрузит весь массив $ _SESSION и покажет, существует ли переменная, которую вы проверяете, на самом деле.

3 голосов
/ 01 апреля 2014

По моему мнению, проблема связана с тестированием, а не с сеансом PHP.

ОСНОВНАЯ ПРИЧИНА , почему переменная сеанса isset ничего не возвращает, это использование die () функция, которая эквивалентна exit () в соответствии с самим руководством по PHP.

http://in1.php.net/die

Итак, вместо этого используйте var_dump () .

1 голос
/ 02 апреля 2014

Ваши результаты в основном верны.

Булевы значения, передаваемые каждой функции, просто запутали вас, я думаю.

Вот четкое объяснение того, что происходит с каждым вашим утверждением.

ДАВАЕТ ПОЛУЧИТЬ ЭТОONE BY ONE

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

  • возвращает логическое значение true или false

is_null()

  • принимает только значение параметра NULL для возврата логического значения true, в противном случае оно идет false.

die()

  • возвращает значение 1 для true и пустое значение для false.

Причины:

  • Логическое значение TRUE преобразуется в строку "1".Boolean FALSE конвертируется в ""
1 голос
/ 27 марта 2014

isset возвращает пустую страницу, потому что ваша переменная не существует в сеансе, поэтому isset возвращает false, однако, echo false return ''.
Это уже было написано в комментарии к хакре

Вы можете проверить это так:

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 голосов
/ 02 апреля 2014

Переменные сессии немного волшебны.Менее волшебно, чем исторически, но все же неудивительно, что наблюдаются необычные вещи.

Имеет смысл запускать тесты в вопросе в трех состояниях: один раз с установленной переменной сеанса и дважды без установленной переменной сеанса- один раз с другой установленной переменной сеанса и один раз без установленных переменных сеанса.

Адаптация ответа F21 для поддержки isset () вам необходимо перегрузить функцию в вашей оболочке.Выполняя это, вы также можете создать isset, который будет функционировать так, как вы ожидаете.

Что-то в соответствии с приведенным ниже описанием решит и «false is notisible», и проблему с удалением значений сеанса.

public function __isset($var){
 if (isset($_SESSION[$var]) && $_SESSION[$var]."">"") {
  return true;
 } else {
  return false;
 }
}
0 голосов
/ 02 апреля 2014

Судя по всему, кажется, что в массиве сеансов нет ключа "ID". Это было подтверждено в вашем комментарии к ответу F21 («неопределенная ошибка индекса»).

Что вы можете сделать, это определить / инициализировать ключ "ID" в массиве сеансов со значением в виде нулевой или пустой строки "" после начала сеанса. Затем заполните его с вашим значением позже с вашими кодами.

Это делается для того, чтобы при использовании isset ($ _ SESSION ["ID"] результат мог быть либо истинным, либо ложным, а не неопределенной ошибкой индекса.

0 голосов
/ 27 марта 2014

Несколько вещей, которые вы можете попробовать:

Добавьте это в свою кодовую базу: 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);
}

Я бы, очевидно, ожидал получить одинаковое содержимое от них обоих.

Надеюсь, это немного поможет.

0 голосов
/ 26 марта 2014

Функция isset: возвращает TRUE, если переменная существует и имеет значение, отличное от NULL, иначе FALSE.если переменная сеанса установлена, то ИСТИНА, если переменная сеанса не установлена, дает ЛОЖЬ.

Пример:

$_SESSION['views']=1; переменная сеанса установлена.=> дает TRUE

unset($_SESSION['views']); переменная сеанса не установлена.=> после этого if(isset($_SESSION[$var])) это дает FALSE

Есть два варианта: переменная сеанса установлена ​​или нет.

isset () работает только с переменными, поскольку передача чего-либо еще приведет к ошибке разбора.Для проверки, установлены ли константы, используйте функцию define ().

Для получения дополнительной информации об isset нажмите здесь

...