我怎么能这样做,当时只有1个用户可以在线?想法?
因此,您无法在一台PC /浏览器上登录User1,然后在另一台PC /浏览器上登录User1?
我在PHP中使用了我的社区系统,它存储在会话中..
答案 0 :(得分:6)
我假设您将用户保存在数据库中,添加active_session
字段,在登录时更新它,并检查请求以确保当前用户会话ID与存储在数据库中的最后一个匹配。
登录时:
UPDATE `users` SET `active_session`='$session_id';
当用户转到需要登录的页面时,您搜索该值:
SELECT * FROM users WHERE `active_session`='$session_id';
这样,如果用户在其他地方登录,则前一个会话密钥被覆盖,上面的SELECT返回一个空的结果集。
答案 1 :(得分:6)
您可以将会话ID(和上次访问时间)存储在数据库中,如果上次访问时间过晚(例如,在过去20分钟内),则拒绝具有不同会话ID的用户的登录尝试。当然,在注销时清除ID。
但请注意,如果用户关闭浏览器而未注销然后重新打开,则可能会被锁定一段时间(上面20分钟或您决定的任何时间间隔),因为他们不会匹配的会话cookie了。
答案 2 :(得分:3)
无需使用会话。只需在数据库users
表中创建一个列,无论用户是否登录。从那里检查。
该列可以命名为LoggedIn
,可以是enum ('Yes','No')
。此外,将上次登录的时间存储在某列LastLoggedIn
中。因此,当用户想要登录时,请先检查:
select 1 from users where ID = {$UserID} and `LoggedIn` = 'No'
如果返回一行,请让他/她登录。
如果有人忘记退出:
运行一个cron作业或脚本,通过检查LoggedIn
时间,在登录了几个小时的用户设定的一段时间后重置LastLoggedIn
状态。
答案 3 :(得分:2)
Just for anyone who might need this in the future.
When a user creates a session or logs in you could take the session id that it generates and store it into a column in your database under that user's account. Then on each page on your application do a check to see if the current Session ID matches the one stored in the database for that user. If not, kill the current session and redirect them to a sign in page.
That way, the session id will be different on each device they are using to login.
答案 4 :(得分:0)
执行此操作的最佳方法是在users表中创建一个额外列,默认设置为0(false),并在设置为1(true)时登录。然后,当用户注销重置为0.每隔几个小时运行一次检查,这需要用户单击“是”继续会话,或者在倒计时器达到零后自动注销。 这里的最后一点是你离开它的时间越长,你运行支票的时间就越长,用户必须等待才能再次登录,如果他们离开你的网站并直接返回而没有正确登出,因为用户表仍然是真的直到退出副作用是更频繁地要求用户输入以防止在更长的时间内失去访问权限。需要对其进行权衡,以免对用户造成烦扰。 您可以检测到用户已使用js离开您的站点,然后注销,但用户可以将其关闭,因此不可靠。
答案 5 :(得分:0)
我有同样的任务,我只希望用户只有一个会话。这样只能是他/她使用该帐户,而不是其他很多人。
我设计它的方式是我有一个表,我存储会话的开始和结束。这将用于用户查看上次访问的时间以及他/她上次上线的时间。
然后我设计了一个会话表,每当用户做某事时我都会更新时间/日期。 如果此处的时间超过30-60分钟(尚未确定范围),则会话值将被删除。这样,如果用户决定这样做,用户可以稍后再次登录。但不是在30-60圈内锁定。
会话表将由cron作业跟踪。
答案 6 :(得分:0)
我的想法将从这里继续我看到的第一个答案:
您可以将会话ID(和上次访问时间)存储在数据库中,如果上次访问时间过晚(例如,在过去20分钟内),则拒绝具有不同会话ID的用户的登录尝试。当然,在注销时清除ID。
在数据库中创建列当前_session,当用户登录时将表中的当前会话保存在此处我们假设我们将登录时间设置为20分钟,登录后用户关闭浏览器并在接下来的10分钟内再次返回,所以这里我们有他的旧会话集有效20分钟,但实际上他最后一次关闭浏览器所以这次他将有一个新的会话ID,所以我们将抓住这个会话不匹配,这将要求用户登录再次删除我们保存的旧记录。
答案 7 :(得分:0)
此解决方案不需要您访问每个页面上的数据库,并且在用户注销失败后也不会锁定用户。
将sessionID的字段添加到数据库中的用户表中。
在调用session_start()之前设置默认的会话处理程序:
session_set_save_handler(new \SessionHandler());
每次成功登录后,从数据库中检索存储的$ sessionID。使用以下命令破坏旧会话:
(new \SessionHandler())->destroy($sessionID);
使用以下方法获取新的会话ID:
$sessionID = session_id();
将新的会话ID存储到数据库中。