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

时间:2014-04-05 16:36:24

标签: php session

这是我的代码:

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。

3 个答案:

答案 0 :(得分:0)

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

答案 1 :(得分:0)

您确定代码库中没有其他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;
 }    

答案 2 :(得分:0)

每个会话都有自己唯一的会话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。从数据库中获取每个请求的用户信息,或者在会话中存储完整的用户行/对象,具体取决于您想要使用的权衡(额外的数据库查找与处理陈旧数据/更大的会话对象)(除非您和#39;重新做高流量网站,只做任何事情)。如果您将整个用户存储在会话对象中,请在执行此操作之前取消设置密码哈希或其他敏感信息。

由于您希望在多个会话中跟踪用户,因此在创建会话时必须有一些方法来识别它们,并且通常使用电子邮件/用户名/密码组合。