Страница 1 из 2

Странное поведение переменной в сессии

Добавлено: 03 сен 2014, 17:54
Борис
Добрый день коллеги.
Столкнулся с такой проблемой: глобальная переменная является условием прохода по двум последовательным блокам программы.
<?php 
…..
if (isset($_POST['btn']))
{
    if ((int)$_SESSION['var1']=0)
          { …..
             $_SESSION['var1']=1;
          }
    if ((int)$_SESSION['var1']=1)
         {
           …….
         }
}
…..
echo $_SESSION['var1'];
?>
При первом проходе по скрипту значение переменной, как и устанавливал, при втором проходе по нажатию на кнопку «btn» не заходит в первый if, а сразу идет во второй, т.е. при втором входе в скрипт значение $_SESSION['var1']=1. Почему ведь при первом прохождении скрипта в if, где происходит присвоение, мы не заходили, я это проверял?

Добавлено: 03 сен 2014, 18:45
Asmodey
= - присваивание
==, === - сравнение

Добавлено: 03 сен 2014, 20:46
Борис
Если использовать == и === то при любом значении переменной проходит только первый if.

Добавлено: 03 сен 2014, 21:58
duxabilii
Я подозреваю, что должно быть что-то такое
<?php 
…..
if (isset($_POST['btn']))
{
    if ((int)$_SESSION['var1'] === 0)
          { …..
             $_SESSION['var1'] = 1;
          }
    if ((int)$_SESSION['var1'] === 1)
         {
           …….
         }
}
…..
echo $_SESSION['var1'];
?>

Добавлено: 03 сен 2014, 22:48
Борис
Коллеги если бы проблема решалась изменением количества знаков равно, я вряд ли бы взялся ее описывать здесь.

Добавлено: 04 сен 2014, 08:21
DelphinPRO
Дебажить умеем? Хотя бы var_dump`ом?
Проверьте состояние Переменной на каждом шаге программы.

Добавлено: 04 сен 2014, 14:11
Dragon_Knight
Борис, "Коллега", если Вы пытаетесь решить проблему, наугад подбирая кол-во знаков равенства, то стоит задуматься: А программирование это вообще ваша стихия?

Займитесь с основ, например с Оператор присваивания и Операторы сравнения....

Добавлено: 04 сен 2014, 14:21
Борис
Если бы не пользовался не мог бы объяснить, что происходит.

Добавлено: 04 сен 2014, 14:31
DelphinPRO
Ну давайте попробуем разобраться.
Первое, что мы видим - некорректный код, Вместо оператора сравнения - оператор присваивания. Ну, допустим, это опечатка при создании вопроса на форуме, и в вашем скрипте используется "==" (нестрогое сравнение)

При первом заходе у нас, вероятно, глобальная переменная либо не существует, либо равна нулю. Если она не существует, то при нестрогом сравнении с числом null будет приведен к числу 0. Т.е. первое условие при первом заходе будет выполнено, и в глобальную переменную запишется значение 1. Далее выполняется второе условие (в переменной уже записана единичка) и скрипт завершается.

При втором заходе глобальная переменная в сессии у нас равна единице, значит первое условие не сработает. А второе сработает. И если значение этой переменной больше нигде не меняется, то при втором и последующих заходах будет исполняться только второе условие.

Вопросы?

Добавлено: 04 сен 2014, 15:36
Борис
При заходе в скрипт глобальная переменная уже определена, ей присвоен 0
но при проходе через скрипт она проходит через присвоение 1 тип ее int. При вторичном проходе она опять проходит через if ... ==0 а в if ..==1 даже не заходит.