Глюк с unset и Сессией

idencial

Одинаковый
Глюк с unset и Сессией

Есть файл, в котором после авторизации, например, выдается следующая переменная
PHP:
session_start();
$_SESSION['auth'] = 1;
Далее к примеру пишем

PHP:
if(isset($_SESSION['auth']) and $_SESSION['auth']==1) echo "Вы авторизованы";
else echo "Вы не авторизованы";
Помимо этого на странице есть ссылка на logout.php, где

PHP:
session_start();
if(isset($_SESSION['auth']) and $_SESSION['auth']==1) unset($_SESSION['auth']);
Header("Location: $referer");
exit();
После этого переход на страницу, откуда вызывал logout.php, а там все равно выводит "Вы авторизованы".

Причем я проверял. Убирал Header в logout.php, переменная удаляется, но почему возникает вновь не понятно

Зы. PHP 4.1.1
 

nagash

Guest
почитай на пхп.нет про это дело...
там в коментах довольно неплохо эту проблему разобрали
 

idencial

Одинаковый
Я немного уточню.
Если в logout.php Header убрать и написать после unset

print_r($_SESSION);, то выводит Array ( )

Т.е unset работает

Далее из вызывающего файла
PHP:
if(isset($_SESSION['auth']) and $_SESSION['auth']==1) {
   echo "Вы авторизованы";
   print_r($_SESSION);
} else echo "Вы не авторизованы";
В итоге выводит
Array ( [auth] => 1)

Т.е вряд ли проблема в приоритетах операций, т.к 1 то появляется.

ЗЫ. Кстати, в logout.php аргументом Header является $referer=getenv("HTTP_REFERER");
Это так, мало ли в этом проблема

почитай на пхп.нет про это дело...
там в коментах довольно неплохо эту проблему разобрали
А где конкретно? Какая проблема? Уж не с приоритетом ли операций =)?
 

idencial

Одинаковый
Поставил я после unset($_SESSION['auth']) еще session_destroy(); и все заработало как надо.

Я так понимаю так всегда делать и надо.
Просто у меня 1 человек может зайти под разными паролями и я думал достаточно обнулить переменные, а сессию оставить на потом =)
Видимо неправильно думал.

Просто я неоднократно читал на форуме, что дескать для logout'а надо просто делать unset($_SESSION['auth']), а получается надо писать
PHP:
session_start();
$_SESSION = array();
session_destroy();
setcookie(session_name());//если узаем куки
т.е убивать всю сессию
 

tony2001

TeaM PHPClub
очень странно.
если можешь дать кусок проблемного кода - дай, протестирую.
вообще-то unset должен в этом случае работать как и ожидалось.
 

idencial

Одинаковый
Хорошо, вот тестируемый код:

PHP:
//test.php
<?php
  session_start();

  echo "До присвовения<br>";
  print_r($_SESSION); 
  echo "<hr>";
  $_SESSION['auth']=1;
  $_SESSION['comp_name']="test";
  $_SESSION['comp_id']="23";
  $_SESSION['comp_fio']="idencial";
  echo "После присовения<br>";
  print_r($_SESSION);
  echo "<hr>";
  echo "<br><a href=\"logout.php\">[выйти из авторизации]</a><br>";

?>

//logout.php

<?php
  session_start();

  $referer = getenv("HTTP_REFERER");

  unset($_SESSION['auth']);
  unset($_SESSION['comp_name']);
  unset($_SESSION['comp_id']);
  unset($_SESSION['comp_fio']);

  Header("Location: $referer");
  exit();  
?>
В итоге у меня после logout "до присовения" и "после присвоения" совпадают, хотя "до присовения" д.б пустым =(

ЗЫ. PHP 4.1.1 как CGI (ну вот такой хостер =))
 

tony2001

TeaM PHPClub
у меня (4.3.3rc1):
До
Array ( )

После
Array ( [auth] => 1 [comp_name] => test [comp_id] => 23 [comp_fio] => idencial )
4.1.1 - это позапрошлогодний релиз.
с тех пор пофиксено очень много багов.
кроме того, 4.1.1 - это первый релиз после введения $_SESSION, там могли быть недоработки.
как вариант - попробуй HTTP_SESSION_VARS.
 

idencial

Одинаковый
Спасибо, но проще я буду делать session_destroy(), чем ждать пока хостер сменит версию.
Хотя у него можно пробить 4.2.3. Там ведь должны были такие баги пофиксить

А вообще в чем приемущества делать просто unset без session_destroy(), а не просто убивать всю сессию?
 

Vasya

Guest
Дело в следующем.
Пусть register_globals = On

Тогда эта строка:
PHP:
$_SESSION['auth']=1;
- создает глобальную переменную $auth
- присваивает ей значение 1
- регистрирует ее в сессии

А эта строка
PHP:
unset($_SESSION['auth']);
- удаляет пару из ассоциативного массива (удаляет значение из сессии)
И все!
Остается еще глобальная переменная $auth, равная 1, которая при завершении скрипта опять попадает в сессию, потому что зарегистрирована.

Поэтому проблема решается, например, так:
PHP:
session_unregister("auth");
 

idencial

Одинаковый
Спасибо, у меня было подозрение на register_globals = On для этой версии (4.1.1.), а для следующих версий они, видимо, автоматом удаляют все, что связано с это переменной, поэтому и проблем не возникает.

Кстати, а чем же плох session_destroy(), т.е
В чем приемущества делать просто unset без session_destroy(), а не просто убивать всю сессию?
 

RomikChef

Guest
Ну тем же, чем плохо забивать гвозди микроскопом.
Тем, что для удаления переменной из сессии - надо пользоваться предназначенной для этого функцией, а для прибивания ВСЕЙ сессии - другой.
вот и все.
 

Vasya

Guest
у меня было подозрение на register_globals = On для этой версии (4.1.1.), а для следующих версий они, видимо, автоматом удаляют все
Не-е-е... Механизм универсальный и должен работать во всех версиях 4.x.x.
IMHO
 

Nakmar

Guest
to Vasya: Я думаю что это везде так работает, потому как логично это и абсолютно правильно.
 
Сверху