#php
#php
Вопрос:
Я создал страницу пользователя с меню, содержащим кнопку выхода из системы. После нажатия кнопки пользователь перенаправляется на страницу выхода из системы со следующим кодом:
session_start();
session_destroy();
include("/var/www/include/header.inc");
echo "<h>Logout Success</h>";
include("/var/www/include/menu.inc");
include("/var/www/include/footer.inc");
Код в файле menu.inc написан так, что:
if(@$_SESSION['login'] == "yes")
{
// show expanded menu
}
else
{
// show normal menu
}
То, что я вижу сейчас после выхода из системы, — это расширенное меню. Кажется, что меню включается быстрее, чем сеанс может быть уничтожен, что создает впечатление, что пользователь все еще вошел в систему. Есть ли способ избежать такой ситуации?
Комментарии:
1. Убедитесь, что вы ознакомились с примерами (и мелким шрифтом) для session_destroy (помните, что есть файлы cookie и другая информация, которую, возможно, потребуется очистить).
Ответ №1:
session_destroy не сбрасывает массив $ _SESSION, поэтому остальная часть страницы после session_destroy все равно будет его видеть. Вы могли бы просто попробовать это
session_destroy();
unset($_SESSION);
Комментарии:
1. Спасибо!
unset
выполняет свою работу.
Ответ №2:
session_destroy()
уничтожает все данные, связанные с текущим сеансом. Он не сбрасывает ни одну из глобальных переменных, связанных с сеансом, или не сбрасывает cookie сеанса.
Комментарии:
1. Как раз собирался сослаться на это.
Ответ №3:
Чтобы полностью очистить все данные сеанса, вы должны использовать что-то похожее на
<?php
// Initialize the session.
// If you are using session_name("something"), don't forget it now!
session_start();
// Unset all of the session variables.
$_SESSION = array();
// If it's desired to kill the session, also delete the session cookie.
// Note: This will destroy the session, and not just the session data!
if (ini_get("session.use_cookies")) {
$params = session_get_cookie_params();
setcookie(session_name(), '', time() - 42000,
$params["path"], $params["domain"],
$params["secure"], $params["httponly"]
);
}
// Finally, destroy the session.
session_destroy();
?>
Это объясняется в руководстве по PHP:
session_destroy() уничтожает все данные, связанные с текущим сеансом. Он не сбрасывает ни одну из глобальных переменных, связанных с сеансом, или не сбрасывает cookie сеанса. Чтобы снова использовать переменные сеанса, необходимо вызвать session_start() .
Чтобы полностью завершить сеанс, например, для выхода пользователя из системы, идентификатор сеанса также должен быть отключен. Если cookie используется для распространения идентификатора сеанса (поведение по умолчанию), то cookie сеанса должен быть удален. для этого можно использовать setcookie() .