Я столкнулся с очень странной проблемой в отношении переменных сеанса и локальных переменных в php.
Я пытаюсь выяснить, не понимаю ли я что-то о сеансах в php или если это проблема с PHP-версией, используемой моим хостом.
Вот очень простой код, чтобы продемонстрировать странную проблему:
session_start(); var_dump($kenny); var_dump($_SESSION['kenny']); $_SESSION['kenny']='def'; var_dump($kenny); var_dump($_SESSION['kenny']); $kenny = 'abc'; var_dump($kenny); var_dump($_SESSION['kenny']);
При первом запуске кода я получаю следующие результаты (как и следовало ожидать):
NULL NULL NULL string(3) "def" string(3) "abc" string(3) "def"
Я запускаю его второй раз (без закрытия моего браузера, конечно), я получаю это сейчас!
string(3) "def" string(3) "def" string(3) "def" string(3) "def" string(3) "abc" string(3) "abc"
Я запускаю его 3-й, 4-й, 5-й раз и так далее, я получаю это !!!
string(3) "abc" string(3) "abc" string(3) "def" string(3) "def" string(3) "abc" string(3) "abc"
Мне кажется, что переменная сеанса «kenny» и локальная переменная $ kenny становятся псевдонимами для одного и другого после запуска сценария более одного раза. hmm … Я действительно не думаю, что это то, как переменные сеанса и локальные переменные работают в php. Пожалуйста, поправьте меня, если я что-то упустил.
Мой веб-хост работает php 5.2.2. Когда я пытаюсь использовать тот же самый код на других хостах, на которых запущены php 5.2.1, 5.2.14 и 5.3.1, они всегда дают мне то, что я ожидаю:
1-й раз :
NULL NULL NULL string(3) "def" string(3) "abc" string(3) "def"
после этого :
NULL string(3) "def" NULL string(3) "def" string(3) "abc" string(3) "def"
Я проверил журнал изменений на php.net и не нашел ничего, к чему я могу относиться, что может решить эту проблему. Но, как я уже упоминал, более ранняя сборка (5.2.1) работает нормально, так что это очень озадачивает меня.
Если кто-либо запускает какую-либо другую версию php 5.2.x, попробуйте и дайте мне знать, если вы увидите ту же проблему. Или, если кто-нибудь знает о проблеме, я бы очень признателен за любую обратную связь.
Бесконечно благодарен!
Вероятно, это связано с тем, что register_globals
директива register_globals
. На этой странице не сказано, что переменные $_SESSION
включены, но здесь говорится:
Если
register_globals
включен, то глобальные переменные и записи$_SESSION
будут автоматически ссылаться на те же значения, которые были зарегистрированы в предыдущем экземпляре сеанса. Однако, если переменная зарегистрирована$_SESSION
глобальная переменная доступна со следующего запроса.