数据库表 user_login_info

字段:id,user_ip,user_id,last_access_time

user_id 做唯一性索引

1. 用户登录后

如果没有当前用户的数据,插入一条数据,user_ip(用户机器的IP),user_id(用户ID),last_access_time(当前登录时间)

如果已经存在,则更新 user_ip,last_access_time 2个字段

2. 如何判断?

另一个用户,如果用相同的账号

1)在同一台机器上再次登录的情况 【ip相同】,直接更新这个用户的 last_access_time 时间为最新时间就可以了。

处理:直接更新 last_access_time 为最新时间

2)在另外一台机器上登录的情况【ip不同】,根据user_id取出数据,判断ip和last_access_time(上次登录时间),

如果当前时间 now()-last_access_time < 10 (分钟) 【这里是关键,设置一个时间】,说明有人在其他机器上已经登录了,则不允许登录。

now()-last_access_time > 10 (分钟) ,则可以登录,说明另一个人要不已经有10分钟没有活动了,要不就是没登陆,这2种情况下都允许重新登录。

3. 在程序的入口文件 index.php (ZF框架参考),每次用户登录后的操作,都更新 last_access_time 时间为最新时间 (这个也许效率上需要考虑一下,其实也应该没什么问题,数据库完全可以承受,也可以在程序里加上一个判断,last_access_time 时间存在 session里,如果这个时间跟当前时间 date() 比较,超过设定的10分钟时间,则更新数据库 last_access_time 字段。这样可以减少更新数据库的次数)

4. 异常退出的情况,比如用户直接关闭浏览器,数据库里还有这条记录,因为设置的过期时间是10分钟,所以如果同一个用户立刻再次登录的情况下,肯定不行,会 提示已经有人登陆了。但10分钟后就可以再次登录,所以这个10分钟时间看具体情况,可以设置成 1分钟,或其他时间。

但这个时间不要设置成几个小时,那用户会疯掉。

原理:就是设置一个过期时间的技巧和记录IP。

一,会员表加一个字段(last_session),会员登陆时获取当前SESSIONID更新此字段。

二,会员登陆时取得该(last_session)值去session_save_path看该文件有没有,如有则直接删除。

三,假如有两个人以上同时使用的话,那么前一个的会话文件就会被后面的一个所删除,也就被逼下线了。

这样也就达到了每次只能一个帐号使用的目的了,虽然用户体验略差,但也算是较高效的方法了。

用PHP实现同一个帐号不允许同时登陆,只允许一个帐号登录?的更多相关文章

  1. php实现只需要一个QQ号就可以获得用户信息

    <?php // 通过QQ号即可获取用户信息 // 获取QQ头像接口 // http://q1.qlogo.cn/g?b=qq&nk=QQ号&s=100&t=154790 ...

  2. QC9.2登陆时显示一个X号

    这个是因为浏览器安全设置的问题,具体解决步骤如下: 进入“工具-Internet选项”设置窗口,进入“高级”选项卡,将“安全”设置中的“启用内存保护减少联机攻击”选项的勾选去掉,然后应用并确定.重启浏 ...

  3. System帐户!我使用你登陆

    大家知道,SYSTEM是至高无上的超级管理员帐户.默认情况下,我们无法直接在登录对话框上以SYSTEM帐户的身份登录到Windows桌面环境.实际上SYSTEM帐户早就已经“盘踞”在系统中了.想想也是 ...

  4. QQ帐户的申请与登陆

    QQ帐户的申请与登陆 实现QQ新帐户申请和老帐户登陆的简化版功能.最大挑战是:据说现在的QQ号码已经有10位数了. 输入格式: 输入首先给出一个正整数N(≤10^5,随后给出N行指令.每行指令的格式为 ...

  5. 第7章学习小结 不使用STL-map过实践题:QQ帐户的申请与登陆

    目录: 一:查找的概念与术语 二:折半查找 三:二叉排序树 四:平衡二叉树 五:B-树 六:B+树 七:散列表 八:实践题:QQ帐户的申请与登陆 九:自我总结 一.查找的概念与术语 (一)查找表 查找 ...

  6. 技术贴:asp.net实现唯一账户在线 禁止同一帐号同时在线 asp.net实现您的帐号在别处登录,您已被迫下线!

    技术要点: Application 全局变量的使用 hashtable 的使用 Session 对应唯一sessionID 标志会话状态 webpage 继承 BasePage的技术 整体比较简单,主 ...

  7. dedecms--二次开发文章内容页未登录禁止访问和同一个帐号只允许一个ip登录

    最近在用dedecms二次开发会员功能,领导要求,会员未登录不允许访问文章内容页,和同一个账号只允许一个ip登录,我是将这两个在一起判断的,判断session存不存在,不存在的情况下就是未登录,这时候 ...

  8. 两个 github 账号混用,一个帐号提交错误

    问题是这样,之前有一个github帐号,因为注册邮箱的原因,不打算继续使用了,换了一个新的邮箱注册了一个新的邮箱帐号.新账号提交 就会出现下图的问题,但是原来帐号的库还是能正常提交.   方法1:添加 ...

  9. 浙江大学PAT上机题解析之5-05. QQ帐户的申请与登陆

    实现QQ新帐户申请和老帐户登陆的简化版功能.最大挑战是:据说现在的QQ号码已经有10位数了. 输入格式说明: 输入首先给出一个正整数N(<=105),随后给出N行指令.每行指令的格式为:“命令符 ...

随机推荐

  1. android studio中使用recyclerview制作个显示考勤打卡的日历来

    1. 用户在app端选择个日期就能查询这个月的考勤打卡信息,并以日历上标注不同的颜色来显示给用户,当然这个日历是recyclerview做出来的,只是每行显示7个,表示一周的七天. 2. 员工考勤打卡 ...

  2. C# 继承(2)

    接着上章: 代码如下- class NameList { public string Name { get; set; } public void ID() => Console.WriteLi ...

  3. linux下文件权限的介绍

    linux操作系统下,使用ll查看该目录下所有文件及其文件权限,以下是对文件权限的介绍 d代表的是目录(或称之为文件夹)   红框内的这3个是代表3个组的权限每组都是3个 第一组rwx代表是本用户的权 ...

  4. 【bzoj4987】Tree 树形dp

    Description 从前有棵树. 找出K个点A1,A2,-,Ak. 使得∑dis(AiAi+1),(1<=i<=K-1)最小. Input 第一行两个正整数n,k,表示数的顶点数和需要 ...

  5. NetworkX初相识

    听说NetworkX是一个很牛的复杂网络研究的工具,就来试一下吧. import networkx as nx G= nx.Graph()#建立一个空白的图 G.add_node("node ...

  6. C语言中静态断言的使用

    编写代码时,我们总是会做出一些假设,断言就是用于在代码中捕捉这些假设,可以将断言看作异常处理的高级形式,用于代码调试. #define _CRT_SECURE_NO_WARNINGS //关闭安全监察 ...

  7. Python——变量的引用和函数的参数和返回值的传递方式

    变量的引用 在python中,所有的变量都是指向地址,变量本身不保存数据,而是保存数据在内存中的地址.我们用下面的程序来理解: a = 10 print(id(a)) a = 11 print(id( ...

  8. SpringCloud文章

    ZUUL路由服务遇到的坑:https://www.jianshu.com/p/2af5171fa2f3 springcloud----Zuul动态路由:https://blog.csdn.net/u0 ...

  9. MAC office2016 安装及激活(试了一下,靠谱, 非常感谢原作者)

    转载地址:https://blog.csdn.net/jxq0816/article/details/77248462 非常感谢原作者. 一.安装包下载地址 http://officecdn.micr ...

  10. python xlwt 与 xlsxwriter 模块差别

    Xlwt 模块有一个bug, 就是所用样式过多的话,之后的数据将使用不了样式,相反xlsxwriter 模块 不会有此问题. 用Xlwt模块的同学们,请务必转换用xlsxwriter模块 !!!!!! ...