2014-09-15 4 views
0

У меня возникла проблема с тем, что сеансы не были уничтожены после выхода из системы. (Хотя по какой-то причине он прекрасно работает в IE ..... но не в любом другом браузере (Chrome, Firefox, опера, или сафари))Сессии на самом деле не уничтожаются?

Вот код авторизации для входа

<?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> 

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

Я пробовал так много разных разрывов сеанса, но неважно, у меня такая же проблема. (да, я относительно новичок в этой всей работе php, поэтому НИКОЛАЯ помощь очень ценится) Любые идеи, что происходит и как их исправить? Спасибо заранее!

+0

Без тщательно просматривал ваш код, вы говорите, он работает в некоторых браузерах и не другие. Это проблема кеша? –

+0

Ну, я тестировал на нескольких компьютерах, все еще работает только в IE и имеет проблемы во всех других браузерах. :/@RyanKempt – user3817799

+0

@ user3817799 Возможно, ваши файлы cookie не включены в другом браузере. Попробуйте включить его, поскольку сеанс также является файлом cookie –

ответ

0

Спасибо за помощь всем, но я нашел проблему. Видимо, я должен быть предельно специфичным с моим URL-адресом для моего файла выхода.

я имел связь выхода из системы собирается http://domain.com/logout.php

вместо

http://www.domain.com/logout.php 

... FACEPALM

0
// 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(); 
+0

Пробовал это ранее, все еще не работал: / – user3817799

0

Вот несколько предложений, основанных на соблюдении текущий код:

  1. session_unset(); устарела и не должна использоваться с $_SESSION - избавиться от него.
  2. Используйте setcookie обработчик для удаления куки, установленные с доменом:
  3. Использование 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(); 

Примечания:

сес sion_destroy() уничтожает все данные, связанные с текущим сеансом . Он не отменяет ни одну из глобальных переменных , связанных с сеансом, или не удаляет файл cookie сеанса. Чтобы снова использовать переменные сеанса , необходимо вызвать session_start().

Чтобы убить сеанс вообще, как и для входа пользователя в систему, идентификатор сеанса также должен быть отменен. Если cookie используется для распространения идентификатора сеанса (поведение по умолчанию), тогда cookie сеанса должен быть удален . Для этого может использоваться setcookie().

Если $ _SESSION (или $ HTTP_SESSION_VARS для PHP 4.0.6 или менее) используется, использование снята с охраны() для отмены регистрации переменной сеанса, т.е. задана ($ _SESSION [ 'VarName']) ;.

Внимание:

ли НЕ незадан весь $ _SESSION с $ (в отключенном _ SESSION), так как это будет отключить регистрирующий сеансовые переменные через $ _SESSION суперглобальный.

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