Сбой сеанса PHP на кнопке выхода
В настоящее время я работаю над сайтом, на котором есть вход (имя пользователя и пароль). Защита паролем выполняется операционной системой внутри веб-сервера на уровне папок под названием Realm в ОС. Пока это нужно будет сделать, пока мы не выясним правильную систему регистрации PHP.
Нижеприведенный код основан на предыдущем вопросе о переполнении стека.
Я использую 3 файла (см. фрагменты кода внизу).
Процесс:
- Нажмите кнопку "Вход" на index.php
- Введите имя пользователя и пароль для доступа к файлу индекса аутентификации.
- Нажмите кнопку выхода из системы, которая ссылается на файл logout.php - СЛЕДУЕТ очистить кеш и вернуть пользователя в индекс верхнего уровня.
Он не "разрушает сеанс" в том смысле, что вам не предлагается повторно вводить пароль при появлении запроса, что по сути является тем, что я хочу.
Мое минимальное знание php оставляет меня немного в тупике.
index.php (файл верхнего уровня с кнопкой входа)
<?php session_start(); ?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<title>Test</title>
</head>
<body>
<a href="authenticate/index.php">Log In Btn</a>
</body>
</html>
authenticate/index.php (эта папка защищена паролем - содержит индексный файл с кнопкой выхода из системы, которая ссылается на файл logout.php)
<?php session_start(); ?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<title>Log out</title>
</head>
<body>
<a href="logout.php">Log Out Btn</a>
</body>
</html>
Authenticate/logout.php
<?php
session_start(); //to ensure you are using same session
session_destroy(); //destroy the session
header("location:/index.php"); //to redirect back to "index.php" after logging out
exit();
?>
Ответы
Ответ 1
Папка с защитой паролем имеет ничего для PHP!
Используемый метод называется "Базовая аутентификация". Не существует сквозных способов "выхода из системы", кроме как попросить пользователя закрыть, а затем открыть браузер...
Вот как вы могли бы сделать это в PHP вместо этого (полностью удалите базовый auth в Apache в .htaccess
или где бы он ни был первым):
login.php:
<?php
session_start();
//change 'valid_username' and 'valid_password' to your desired "correct" username and password
if (! empty($_POST) && $_POST['user'] === 'valid_username' && $_POST['pass'] === 'valid_password')
{
$_SESSION['logged_in'] = true;
header('Location: /index.php');
}
else
{
?>
<form method="POST">
Username: <input name="user" type="text"><br>
Password: <input name="pass" type="text"><br><br>
<input type="submit" value="submit">
</form>
<?php
}
index.php
<?php
session_start();
if (! empty($_SESSION['logged_in']))
{
?>
<p>here is my super-secret content</p>
<a href='logout.php'>Click here to log out</a>
<?php
}
else
{
echo 'You are not logged in. <a href="login.php">Click here</a> to log in.';
}
logout.php:
<?php
session_start();
session_destroy();
echo 'You have been logged out. <a href="/">Go back</a>';
Очевидно, что это базовая реализация очень. Вы ожидали, что имена пользователей и пароли будут находиться в базе данных, а не в виде жесткого сравнения. Я просто пытаюсь дать вам представление о том, как сделать сеанс.
Надеюсь, это поможет вам понять, что происходит.
Ответ 2
Сначала дайте ссылку страницы logout.php
в этой кнопке выхода. На этой странице введите код, который приведен ниже:
Вот код:
<?php
session_start();
session_destroy();
?>
Когда сеанс запущен, сеанс для последнего/текущего пользователя запущен, поэтому не нужно объявлять имя пользователя. Он будет автоматически удален методом session_destroy.
Ответ 3
//выход из системы
if(isset($_GET['logout'])) {
session_destroy();
unset($_SESSION['username']);
header('location:login.php');
}
? >
Ответ 4
попробуй это:
session_start(); session_destroy();
уничтожить определенную переменную unset($_SESSION["products"])