PHP: 服务器如何检查用户是否已登录或退出

3
我希望能够从服务器端判断用户是否已登录。目前,我的数据库中的每个用户记录都有一个“loggedin”(布尔)属性。如果用户通过登录流程,则其“loggedin”设置为“1”(true)。如果用户通过注销页面,则将其设置为“0”(false)。但是,如果他们的cookie过期而没有经过注销页面,该怎么办?
为了帮助任何人更好地理解我想要实现的功能。我只是想制作一个功能,显示用户上次登录以来的时间长度。我目前正在计算,但它显示“用户在线”或“4分钟前在线”,具体取决于先前描述的数据库中的'loggedin'值。因此,如果我访问朋友的页面,它会告诉我他们离开多久了。
** 我想在数据库中存储另一个属性,用于存储登录后cookie的超时时间,这样我就可以检查'loggedin'值和超时值,以确定要显示哪些信息。这似乎不是一种很好的方法,但我不知道。
如果您有比我上述描述的方法更好的方法,请告诉我 :)
感谢您提供的任何信息!

Alexander Ivanov提供的答案:if($_SESSION['logged'] == 1;) mysql_query('UPDATE users SET last_seen=NOW() WHERE id='. $user_id); 我在我的用户认证代码中放置了类似的版本。所以每次我认证用户时,它都会更新他们“最后一次查看”的时间。 - daveomcd
2个回答

2

使用会话变量:

$_SESSION['logged'] = 1;

您可以在整个脚本中使用它们,它们的值将在重新加载之间保持不变。


1
问题在于问题仍然存在,即会话未被取消。 - Basic
2
用户与网页断开连接(关闭网页)15分钟后,会自动注销该会话。 - Alexander Ivanov
如果会话在15分钟后自动超时,那么这可能有效。但是我如何从服务器端检查特定用户的会话呢?是否有一种方法可以通过用户ID搜索$_SESSION? - daveomcd
1
忘了告诉你,在脚本开头使用 session_start() 才能让会话起作用。每次用户登录时,您都会设置 $_SESSION['logged'] = 1; - 会话变量仅为此用户设置,因此您不必担心冲突。但是,如果您想向所有用户显示此信息,则应该将用户的最后操作时间保存到数据库中。if($_SESSION['logged'] == 1;) mysql_query('UPDATE users SET last_seen=NOW() WHERE id='.$user_id); 或类似的东西。 - Alexander Ivanov
好的,现在听起来像是我正在寻找的解决方案。我不确定这是否是最好的方法,但肯定比我目前拥有的更好。我将尝试一下并查看是否可以解决我的问题,谢谢! - daveomcd

1

创建这样的语句

if (isset($_COOKIE['loggedin'])) {
    echo '<p>User is online</p>';
} elseif (!isset($_COOKIE['loggedin'])) {
    echo '<p>User Offline!</p>';
} else {
    // another statement if needed to handle errors
}

我觉得只要在登录脚本中创建了cookie,这个可能可以根据你的需求进行调整。
可能需要稍微调试一下。

好的,但这仅适用于用户访问页面的情况。我是指当用户1登录并查看网站但离开时。用户2来查看用户1的页面。我如何告诉用户1的cookie是否已超时? - daveomcd
1
如果用户不知道该做什么,认为您误按了回车键,那我就帮忙吧 :p - Basic
1
将cookie设置为在非活动状态下经过多少分钟后超时,如果发生这种情况,则elseif语句将返回true,显示用户离线,如果已设置,则用户在线,您可以添加更多的else if来显示所需的时间或其他内容。 - Basic
好的,也许我没有正确理解 cookies,但是这行代码 if(isset($_COOKIE['loggedin'])) --- 它不是在访问用户电脑上的信息吗?这意味着该用户必须在页面上,如果是这样,那对我没有帮助。因为我有兴趣检查的是另一个用户是否已登录。据我所知,上面的代码只会告诉我正在访问页面的用户是否将 cookie“loggedin”设置在他们的计算机上。如果是这种情况,那在这种情况下无法帮助我。 - daveomcd
1
将其更改为mysql上的表格,如果用户登录,则更改为1,并设置$_SESSION,如果用户不活动15分钟,则更改回0,然后使用相同的ifelse结构查询mysql数据库,这就是您的答案。 - Basic

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接