这是我的代码:
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_destroy
和session_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 中。