Переменная сеанса PHP isset (..) = 1 после session_start () - PullRequest
0 голосов
/ 07 января 2011

Полагаю, я не понимаю объем переменных сеанса или самого сеанса в PHP, поэтому возникает вопрос:

Это мой код

  if(session_id()!=""){
  echo "Getting rid of session"."</br>";
  session_destroy();
 }
 echo "Before session_start(): ".isset($_SESSION["first_date_of_week"])."</br>";
 session_start();
 echo "After session_start(): ".isset($_SESSION["first_date_of_week"])." ".$_SESSION["first_date_of_week"]->format("Y-m-d")."</br>";

Вывод:

Before session_start():
After session_start(): 1 2011-01-09

Почему при выполнении isset (..) для переменной сеанса она устанавливается сразу после запуска сеанса, даже если я ее еще не использовал или не установил? Однако он по-прежнему имеет то же значение, что и раньше.

Кроме того, session_id () = "", поскольку предложение if никогда не запускается. Я никогда не убиваю сессию, почему она установлена ​​на ""? То есть Я обновляю страницу и ожидаю, что сеанс будет еще жив.

Использование функции isset (..) в таком случае довольно бесполезно, если она уже установлена ​​...

Заранее спасибо!

/ Никлас

Ответы [ 3 ]

3 голосов
/ 07 января 2011

Существует несколько проблем с кодом:

  1. Тест !session_id()=="" неверен, поскольку ! имеет более высокий приоритет, чем ==.Это должно быть записано как session_id() != "".Из-за неявных преобразований все должно работать правильно, но я не могу сказать, что это что-то еще, кроме ошибки.
  2. session_destroy работает только при вызове после session_start.

Теперь вот что именно происходит:

  1. Вы проверяете активный сеанс.Так как его нет, тест не пройден и session_destroy никогда не вызывается (он бы ничего не делал, даже если бы он был вызван).
  2. Вы проверяете наличие $_SESSION["first_date_of_week"].Поскольку активного сеанса нет, isset возвращает false.
  3. Вы запускаете сеанс.$_SESSION["first_date_of_week"] теперь становится доступным, , но только потому, что вы установили его на каком-то более раннем сеансе, в коде, который вы не показываете .

Попробуйте этот код, чтобы улучшитьпонять, что происходит:

$logout = true; // play with this
session_start();
if ($logout) {
    session_destroy();
    echo "Logged out.";
    die;
}

if (!isset($_SESSION['counter'])) {
    $_SESSION['counter'] = 1;
}
else {
    ++$_SESSION['counter'];
}

echo "The counter value is ".$_SESSION['counter'];
die;
2 голосов
/ 07 января 2011
session_start();
if(isset(session_id())) {
    session_destroy();
}
$_SESSION['data'] = "something";
2 голосов
/ 07 января 2011

Помните, что session_start не запускает новый сеанс, просто запускает "сеанс".Так что, если вы что-то установили (и не уничтожили, см. Ответ @Jon), то вы вернетесь к своему сеансу :)

...