У меня была проблема с сеансами, не разрушаемыми после выхода из системы. (Хотя по какой-то причине он отлично работает в IE ….. но не в любом другом браузере (Chrome, Firefox, Opera или Safari))
Вот код для авторизации входа
<?php
session_start();
$host="localhost"; // Host name
$username="root"; // Mysql username
$password=""; // Mysql password
$db_name="testdatabase"; // Database name
$tbl_name="users"; // Table name
// Connect to server and select databse.
mysql_connect("$host", "$username", "$password")or die("cannot connect");
mysql_select_db("$db_name")or die("cannot select DB");
// email and password sent from form
$enteredEmail=$_POST['email'];
$enteredPassword=$_POST['password'];
// To protect MySQL injection (more detail about MySQL injection)
$enteredEmail = stripslashes($enteredEmail);
$enteredPassword = stripslashes($enteredPassword);
$enteredEmail = mysql_real_escape_string($enteredEmail);
$enteredPassword = mysql_real_escape_string($enteredPassword);
$sql="SELECT * FROM $tbl_name WHERE email='$enteredEmail' and password='$enteredPassword'";
$result=mysql_query($sql);
// Mysql_num_row is counting table row
$count=mysql_num_rows($result);
// If result matched $enteredEmail and $enteredPassword, table row must be 1 row
if($count==1){
// Register $enteredEmail, $enteredPassword and redirect to file "redirect.php"$_SESSION['email']="email";
header('location:redirect.php');
}
else {
header("location:index.php?error");
}
?>
Затем он перенаправляет на домашнюю страницу
Я поместил этот код в заголовок, чтобы показать, вошел ли пользователь в систему или нет
<?php
if (!isset($_SESSION['email']) || $_SESSION['email'] == ''){
include_once('loggedout.php');
}
else {
include_once('loggedin.php');
}
?>
Я также включаю эти 2 файла в начало каждой страницы:
<?php
if ($_SESSION['email']="email" ) {
session_start();
}
?>
а также
<?php
$connect_error= "Sorry, we\'re experiencing connection problems.";
mysql_connect('localhost', 'root', '') or die($connect_error);
mysql_select_db('testdatabase') or die($connect_error);
?>
И наконец, вот код страницы выхода, на которую пользователь переходит после нажатия кнопки «Выйти»:
<?php
session_start();
session_unset();
session_destroy();
$_SESSION = array();
?>
<html>
<head>
<title>Logged Out</title>
</head>
<body>
<p align="center">You have been successfuly logged out.</p>
<p align="center"><a href="home.php">Go back to homepage.</a></p>
</body>
</html>
Тем не менее, после возврата на домашнюю страницу, сначала кажется, что пользователь вышел из системы, но затем простая перезагрузка страницы снова регистрирует пользователя.
Я пробовал так много разных сессий уничтожать наценки, но несмотря ни на что, у меня та же проблема.
(да, я относительно новичок в этом деле, поэтому любая помощь очень ценится)
Есть идеи, что происходит и как это исправить?
Заранее спасибо!
// 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();
Вот пара предложений, основанных на соблюдении вашего текущего кода:
session_unset();
устарела и не должна использоваться с $_SESSION
— избавиться от этого.setcookie
Обработчик для удаления файлов cookie, установленных с вашим доменом:session_commit()
сразу после session_destroy()
, чтобы записать данные сеанса окончания сеанса.Код:
session_start(); // init session vars
if(isset($_COOKIE[session_name()])) {
setcookie(session_name(),'',time()-3600); # unset session id/cookies
}
unset($_SESSION['email']); // this is the key to unsetting your session.
session_destroy(); // destroy session
session_commit(); // commit session write (optional)
Код (альтернатива):
// unset session/cookies
$cs = array_keys($_COOKIE);
for ($x=0;$x<count($cs);$x++) setcookie($cs[$x],"",time()-1);
unset($_SESSION['email']); // this is the key to unsetting your session.
session_destroy();
session_commit();
Заметки:
session_destroy () уничтожает все данные, связанные с
текущая сессия. Не сбрасывает ни одну из глобальных переменных
связанный с сеансом, или сбросить куки сеанса. Чтобы использовать
Снова переменные сеанса, необходимо вызвать session_start ().Чтобы полностью завершить сеанс, например, выйти из системы,
Идентификатор сеанса также должен быть не установлен. Если cookie используется для распространения
идентификатор сеанса (поведение по умолчанию), тогда файл cookie сеанса должен быть
удален. Для этого можно использовать setcookie ().Если используется $ _SESSION (или $ HTTP_SESSION_VARS для PHP 4.0.6 или менее),
используйте unset () для отмены регистрации переменной сеанса, то есть unset
($ _SESSION [ ‘VarName’]) ;.
Внимание:
НЕ сбрасывайте весь $ _SESSION с помощью unset ($ _ SESSION), так как это
отключить регистрацию переменных сеанса через $ _SESSION
суперглобальный.
Спасибо за помощь, ребята, но я нашел проблему.
По-видимому, я должен быть очень конкретным с моим URL к файлу выхода из системы.
У меня была ссылка на выход http://domain.com/logout.php
вместо
http://www.domain.com/logout.php
…Facepalm