2012-10-24 2 views
1

Я пишу сценарий, который должен завершить сеанс для пользователя, и вывести их из системы, возвращая их на страницу входа в систему.Завершение сеанса, сброс переменных не работает?

Мой выход из сценария выглядит следующим образом:

<?php 

$_SESSION['signin'] = null; 

session_destroy(); 

header("Location: /test/index.php"); 

?> 

Сначала я сбросить signin переменную таким образом, даже если сессия не разрушила переменной должно быть, по крайней мере изменилась таким образом, что система считает, что пользователь вошел в систему вне.

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

<?php 
session_start(); 
if($_SESSION['signin'] == 5) 
{ 
     header("Location: /test/home.php"); 
} 
?> 

Короче говоря, когда кто-то вошел в систему, и нажимает на ссылку, чтобы выйти из системы он использует первый блок кода, чтобы выйти из системы, а затем перенаправляется на страницу, содержащую второй blcok кода.

Однако эта страница по-прежнему пересылает меня на домашнюю страницу, полагая, что пользователь все еще подписан, и поэтому я предполагаю, что переменная signin не была сброшена.

Мысли о том, как решить мою проблему?

+0

Я думаю, что проблема в том, что вы не записываете выход, после header(); Проверьте значение сеанса, используя что-то вроде 'var_dump'; – pomaxa

ответ

0

session_destroy() не отменяет каких-либо глобальных переменных в сеансе. Просто с помощью:

session_unset(); 

на отключенное все глобальные переменные, или только в отключенном указанной переменной, использование:

unset($_SESSION['signin']); 
+1

ПРИМЕЧАНИЕ: Из руководства PHP: «Используйте только' session_unset() 'для более старого устаревшего кода, который не использует' $ _SESSION'! !! – nickhar

+1

Абсолютно, хорошая находка. Что касается вашего ответа, руководство по PHP также предлагает использовать unset ($ _ SESSION) всегда следует избегать, и вы также используете (по некоторым причинам) вышеупомянутые устаревшие $ HTTP_SESSION_VARS в своем собственном коде. –

+1

+1 Хе-хе. Touche, и это скоро будет удалено из кодовой базы и заработано (беспроигрышное);) – nickhar

0

Вы можете попробовать что-то вроде этого.

session_unset() 
0

вы не должны использовать

$_SESSION['signin'] = null; 

с помощью session_destroy(); должно быть достаточно

, и я не знаю точно, глубокий материал РНР, но если вы установите $ _SESSION переменная до NULL, PHP может ее прочитать, поскольку она установлена ​​в NULL, что означает «она установлена»? (не знаю точно)

+1

Да, $ var = null, заданная переменная со значением null; но isset ($ var), вернет false; но в то же время is_null ($ var) вернет true :) такой забавный язык: P – pomaxa

0

В этом случае, если вы хотите уничтожить переменную, вы можете сделать это: У вас есть страница с именем logout.php и всякий раз, когда пользователю нужно выйти из системы, перенаправить его/ее на эту страницу. Теперь внутри этой странице вы поставите следующую, и здесь я объясню вам, что это делает:

<?php 
session_start(); //Initializes the session 
unset($_SESSION['thenameofyoursession']); //This unsets a specific session, so the user is logged out, in this case it would unset "thenameofyoursession". 
$URL="/test/home.php"; //This is the redirect URL 
header ("Location: $URL"); //This basically will send the user back to the redirect URL using header. 
die(); //terminates the PHP script from running 
?> 

С, что вы должны быть хорошо.

0

Ваша процедура довольно очевидна и похож на тот, который мы используем, тем не менее, было бы лучше всего unset() весь сеанс, если в нем ничего нет. - Если они не вошли в систему, переменные сеанса не должны существовать.

Мой logout.php сценарий включает в себя следующее:

session_start(); 

session_register("loginMessage"); 
session_unregister("authenticatedUser"); 
session_destroy(); 

// relocate back to login page 
header("Location: /"); 

Который работает. session_unset() исторически избыточен.

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

Смежные вопросы