如何保持独特的会话?跟踪个人登录


How to maintain unique sessions? Tracking individual logins?

这是我的代码:

if (!isset($_SESSION)) {

 mysql_select_db($database_localhost, $localhost);
 $log = mysql_query("SELECT email FROM loggedin") or die(mysql_error());
     while($cols = mysql_fetch_array($log)){
         $value = $cols['email'];
         $email[$index] = $value;
         $index++;
     } 
 session_start();
 $user=session_id();
 }

它以前在工作。但是现在,当我让某人从另一台计算机登录用户然后登录时,它不会给第二个用户一个会话 ID。

如果我去掉 if(isset) 条件,它会创建一个新会话以及新的会话 ID,但相同的 id 将应用于登录的第一个用户。

为什么会发生这种情况,以及如何使每个登录用户都有一个单独的会话 ID。

每个会话都有自己唯一的会话 ID。您不应该关心会话 id 的值,除了知道session_start()使用它来查找上一个会话。您的代码没有做任何有用的事情,但是处理用户登录的正确方法是如下所示,在 psesudo-ish 代码中。

session_start();
if (isset($_POST['email'], $_POST['password']))
{
    $user = fetch_user_from_database($_POST['email']);
    if (!$user)
    {
        // display error about user not found (or wrong password)
    }
    else if (!password_verify($_POST['password'], $user['password_hashed']))
    {
        // display error about incorrect password
    }
    else
    {
        $_SESSION['user_id'] = $user['id'];
    }
}

当您想检查某人是否已登录时,请!empty($_SESSION['user_id']),注销某人时请使用session_destroysession_regenerate_id。要么从数据库中获取每个请求的用户信息,要么将完整的用户行/对象存储在会话中,具体取决于您想要接受的权衡(额外的数据库查找与处理陈旧数据/更大的会话对象)(除非您正在做高流量站点,否则只需执行任何操作)。如果要将整个用户存储在会话对象中,请在执行此操作之前取消设置密码哈希或其他敏感信息。

由于您希望跨多个会话跟踪用户,因此在创建会话时必须有某种方法来识别他们,而电子邮件/用户名/密码组合是执行此操作的常用方法。

您确定代码库中没有其他session_starts吗?

不太确定您的代码是做什么的,但这对您有用吗?

session_start();
if (!isset($_SESSION['user'])) {
    mysql_select_db($database_localhost, $localhost);
    $log = mysql_query("SELECT email FROM loggedin") or die(mysql_error());
    while($cols = mysql_fetch_array($log)){
         $value = $cols['email'];
         $email[$index] = $value;
         $index++;
    } 
    $user = session_id();
    $_SESSION['user'] = true;
 }    

您可以将uniqid()添加到会话 ID 中。