为同一用户存储多个会话的问题

时间:2010-10-05 23:33:26

标签: php session

我遇到的问题是同一个用户正在生成两个会话文件。我开始在数据库中记录这些内容,以便我可以看到发生了什么。我很想知道这是否源于在课堂上设置课程或者是否有一些编程失误。以下是我的计算机在一分钟内生成的会话:

session_id  session_data
kfmj13vi5o538mvi57at8th0n2  useradd|s:10:"xx.xx.62.69";redirect|s:10:"/index.php";
3bb0fkisndf3u0o1l3195iclh2  UID|s:1:"1";USERNAME|s:9:"kalpaitch";

有时(并非总是)当用户登录时,负责将“UID”和“USERNAME”添加到会话的类似乎完全创建了一个新会话(如上所述),因此页面不会注册用户已登录。

这是其他人写的脚本,其中包含以下路径=> loginform.php发布到validate.php,它调用下面的方法。

function validateUser($username,$password, $redirect){
        $password=md5($password);
        if(get_magic_quotes_gpc()){
            $username = stripslashes($username);
            $password = stripslashes($password);
        }       

        $sql = "SELECT id,username,password FROM users WHERE username='" . mysql_real_escape_string($username) . "' AND password='" . mysql_real_escape_string($password) . "' AND status='1' and verified=1"; 

        $result=mysql_query($sql);
        $row = mysql_fetch_array($result);

        if ($row["id"]){
            session_start();
             $_SESSION["UID"] = $row["id"];
             $_SESSION["USERNAME"]=$row["username"];
             header("location: http://www.xxx.com".$redirect);
        }else{
            unset($_SESSION["UID"]);
            unset($_SESSION["USERNAME"]);

            $sql = "select id,username,password from user where username='" . mysql_real_escape_string($username) . "' and password='" . mysql_real_escape_string($password) . "' and status='1' and verified=0"; 
            $result=mysql_query($sql);
            $row = mysql_fetch_array($result);
            if ($row["id"]){
                $_SESSION['login'] = 'Verify your account by email';
                header("location: http://www.xxx.com".$redirect);
            }else{
                $_SESSION['login'] = 'Incorrect username or password';
                header("location: http://www.xxx.com".$redirect);
            }
        }
    }

1 个答案:

答案 0 :(得分:2)

很可能这与会话Cookie设置,例如cookie-pathcookie-domain有关,尤其是当您在www.domain.tld和普通{{1}之间切换时站点;或登录后domain.tld来电(这实际上是一个好主意,因为它避免了会话固定)。