会话没有真正被破坏?

时间:2014-09-15 01:39:22

标签: php mysql session cookies session-variables

我一直遇到登出后没有被销毁的会话的问题。 (虽然由于某种原因它在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');
}
?>

我还将这两个文件包含在每个页面的顶部:

<?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的东西比较新,所以非常感谢任何帮助) 有什么想法,以及如何解决它? 提前谢谢!

3 个答案:

答案 0 :(得分: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();

答案 1 :(得分:0)

以下是基于观察您当前代码的一些建议:

  1. session_unset();已弃用,不应与$_SESSION一起使用 - 摆脱它。
  2. 使用setcookie处理程序删除使用您的域设置的Cookie:
  3. session_commit()之后直接使用session_destroy()来编写会话数据结束会话。
  4. <强>代码:

    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()会销毁与之关联的所有数据   本届会议。它不会取消任何全局变量   与会话关联,或取消设置会话cookie。要使用   会话变量,必须调用session_start()。

         

    为了完全杀死会话,喜欢将用户注销掉,   会话ID也必须取消设置。如果使用cookie来传播   会话ID(默认行为),然后会话cookie必须是   删除。 setcookie()可以用于此。

         

    如果使用$ _SESSION(或PHP 4.0.6或更低版本的$ HTTP_SESSION_VARS),   使用unset()取消注册会话变量,即取消设置   ($ _SESSION [&#39; VARNAME&#39;]);

    <强>注意:

      

    请勿使用unset($ _ SESSION)取消整个$ _SESSION   禁用通过$ _SESSION注册会话变量   超全局。

答案 2 :(得分:0)

感谢所有帮助人员,但我发现了问题。 显然我必须对我的退出文件的网址非常具体。

我将退出链接转到http://domain.com/logout.php

而不是

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

... 捂脸