PHP isset($_SESSION[$var]) вообще не работает

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

Может ли кто-нибудь сказать мне, почему попытка проверить, установлена ​​ли переменная сеанса, ничего не возвращает?


person Jormundir    schedule 20.03.2012    source источник
comment
Вы помните session_start(); ? Хотя это может показаться тривиальным, вы должны убедиться.   -  person Repox    schedule 20.03.2012
comment
Да, сеанс запускается в конструкторе родительского класса. die(session_id) возвращает строку, как и предполагалось.   -  person Jormundir    schedule 20.03.2012
comment
Используйте var_dump вместо die или echo. В PHP логическое значение false, которое преобразуется в строку (в вашем случае для вывода), будет преобразовано в пустую строку. var_dump покажет вам фактическое значение и тип. Это просто базовый PHP, сначала освойтесь с языком.   -  person hakre    schedule 16.10.2012


Ответы (8)


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

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

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

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

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

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

var_dump($_SESSION)

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

person F21    schedule 20.03.2012
comment
публичная функция __isset($var) { return isset($_SESSION[$var]); } публичная функция isItSet($var) { die(isset($_SESSION[$var])); } Спасибо за быстрый ответ, но у меня все еще есть та же проблема с приведенным выше кодом. Я также пробовал isset($this-›session-›idUser) - person Jormundir; 20.03.2012
comment
Вы можете удалить функцию isItSet(), так как она бесполезна. Я также обновил свой ответ. - person F21; 20.03.2012
comment
isset($this-›session-›var) по-прежнему ничего не возвращает. Я избавился от isItSet(). var_dump показывает, что $_SESSION — пустой массив. (Что ожидается, поэтому isset не должен возвращать false?) - person Jormundir; 20.03.2012
comment
Просто чтобы убедиться... __isset() поддерживается только с php 5.1.0, какая у вас версия php? - person Andreas Wong; 20.03.2012
comment
ты пробовал var_dump($this->session->var)? Я обнаружил, что большую часть времени повторение логического значения ничего не выводит. - person F21; 20.03.2012
comment
Это хорошо. А как насчет var_dump(isset($this->session->var))? - person F21; 20.03.2012

На мой взгляд, проблема связана с тестированием, а не с сеансом PHP.

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

http://in1.php.net/die

Поэтому вместо этого используйте var_dump().

person dikesh    schedule 01.04.2014

isset возвращает пустую страницу, потому что ваша переменная не существует в сеансе, поэтому isset возвращает false, однако echo false возвращает ''.
Это уже было написано в комментарии к 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'])));

person doydoy44    schedule 26.03.2014

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

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

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

ДАВАЙТЕ ЭТО ПО ОДНОМУ

// 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". Логическое значение FALSE преобразуется в ""
person Jhonathan H.    schedule 02.04.2014

Функция isset: возвращает TRUE, если var существует и имеет значение, отличное от NULL, в противном случае FALSE. если переменная сеанса установлена, дает TRUE, если переменная сеанса не установлена, она дает FALSE.

Пример:

$_SESSION['views']=1; установлена ​​переменная сеанса. => дает ИСТИНА

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

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

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

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

person Community    schedule 26.03.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);
}

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

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

person Stephen O'Flynn    schedule 27.03.2014

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

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

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

person Community    schedule 02.04.2014

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

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

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

Что-то вроде следующих строк решит как «false is invisible», так и проблему с удалением значений сеанса.

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