这是我的代码:
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。
答案 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_destroy
和session_regenerate_id
。从数据库中获取每个请求的用户信息,或者在会话中存储完整的用户行/对象,具体取决于您想要使用的权衡(额外的数据库查找与处理陈旧数据/更大的会话对象)(除非您和#39;重新做高流量网站,只做任何事情)。如果您将整个用户存储在会话对象中,请在执行此操作之前取消设置密码哈希或其他敏感信息。
由于您希望在多个会话中跟踪用户,因此在创建会话时必须有一些方法来识别它们,并且通常使用电子邮件/用户名/密码组合。