数据库表 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. C# Socket通信改进记录

    1. Socket 使用原始Socket,Send和Recv方法 进行发送和消息获取.(另起后台线程 不停获取和发送) public void RecvMsg() { //receive messag ...

  2. HTTP总结

    参考: https://www.cnblogs.com/fuqiang88/p/5956363.html https://www.cnblogs.com/zlingh/p/5887143.html h ...

  3. .NET Framework的一些基本概念

    各种Framework的区别(按在Windows程序管理中显示的名称) .NET Framework: 运行环境,仅用于运行程序 .NET Framework Developer Pack: 包含Ru ...

  4. ubuntu14.04,安装docker(源代码管理工具)

    一,安装docker: 1,安装curl:在shell中执行:sudo apt-get install curl 2,shell中执行:curl -sSL https://get.daocloud.i ...

  5. plantix插件工具,eclipse工具

    代码修改后部署流程: 修改代码-->自动构建工作空间(将修改的代码或配置文件复制到classes文件夹)-->发布到tomcat环境中-->重启服务器运行 常见报错:java.lan ...

  6. js 封装常用方法

    1. 获取数据类型 function getType(params) { , -) } 2. 深拷贝 function deepCopy(params) { var obj; if (typeof p ...

  7. 题解 P1534 【不高兴的津津(升级版)】

    题目链接 不算太难.就是题目有歧义. wa了好几次才发现.上一天要是小于8的话.结算是昨天一个负值在加上今天课时数.再减去8.233.... 而不是上一天小于8个小时.就清零了..大家要注意(ps:题 ...

  8. P2561 [AHOI2002]黑白瓷砖

    $ \color{#0066ff}{ 题目描述 }$ \(\color{#0066ff}{输入格式}\) 文件中以一行的形式存放一个正整数 n , n ≤ 20 . \(\color{#0066ff} ...

  9. 【离散数学】 SDUT OJ 建图

    建图 Time Limit: 1000 ms Memory Limit: 65536 KiB Submit Statistic Problem Description 编程使得程序可以接受一个图的点边 ...

  10. Matlab2015 双目相机自动标定

    标定步骤 调出标定工具箱 在命令行输入stereoCameraCalibrator,出现如下界面: 勾选相应的选项 然后将上面的“Skew”.“Tangential Distortion”以及“3 C ...