PHP如何实现同一个帐号不允许同时登陆? 本帖最后由 free212 于 2009-07-12 13:20:24 编辑 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 你可以在表里建个login列 如果登陆了login=1 退出=0;if(login=1){ 重复登陆了;} 挤掉上一个已登陆的用户:用户表加一个字段(last_session), 或加一个新表(user_id, last_session)当同一个用户登入时取得上一次的session id 并删除该id的内容再更新成新的 session id提示该帐号已经登陆:用户表加2个字段(last_access,last_session), 或加一个新表(user_id,last_access ,last_session)当同一个用户登入时取得上一次的last_access time,session id如果最后存取时间过久, 清除该session , 换新的否则提示已登入强行挤掉上一个会比较简单及少资源第二个方法如果想用户体验比较好的话,你还需要用ajax 定时送keepalive 你是指把sessionid存入数据表吗?这同样也存在着无法处理异常退出的可能,可否请你具体写下实现的过程。 1。将用户登录时间入库,每次登录将修改这个时间2。在用户session信息里保存首次登录时间可以用ajax或者是页面刷新,每次提取数据库中的登录时间与session里比较,不一样,直接掉线。 不过这个只能在二次登录时,注销前一个登录的用户 这个用session和cookie不能实现吗? 增加一个最后动作的时间字段..登录用户的每个操作都重写此字段.点击退出时将此字段修改为 1970-01-01...用户登录时判断此时间段内的值和当前时间的差值是否在某个规定的时间之内(如5分钟),如果是,则不允许登录,否则,允许登录.当然,在每个页面上都用ajax写入时间字段最好了,以免某页停留时间过长出现问题 在用户数据表中,增设一个登陆的字段,如logining字段,可以选用布尔型或int型.以0和1来判断用户登陆是否.当用户登陆,即更新该字段为1(即已登陆),用户下线或超时后,更新该字段为0.如果要挤掉上一个同账号的登陆用户,可以利用IP来判断,或者,用cookies.增设个表格,用于储存登陆时生成的临时cookies(识别码),当用户再次登陆后,随机生成的cookies再次更新,这时候,页面刷新时,就可以以数据库储存的识别码和登陆的计算机的cookies对照,相同者可以继续浏览,不同者,即显示"您已在别处登陆,请重新登陆!"呵呵.这功能好像QQ的啊...朋友,采纳我的吧.利用数据库来判断是最稳当的了. ip + sid + cookie 最简单的是用FLASH xmlsocket 呵呵 有这么麻烦吗?用二楼的方法就行了 没有必要在数据库添加字段换一种思路 用session的KEY来保存用户ID 判断该ID session 的值为OK或空 来表示该ID是否在线示例代码://登录判断session_start();if(session_is_registered($用户ID)){echo "该用户已经登录!";}else{$_SESSION[$用户ID] = "OK";echo "登录成功!";}如果用上面说的AJAX判断的话 流量少还是可以 等流量大 服务器一延时就完了 怎么现在的人回答的时候都不看清楚lz的问题呢,人家都说了,其他问题数据库存储就可以解决,关键是碰到用户没有退出就关闭网页,这样session还在,如果判断。我是菜鸟,lz解决问题了要pm我啊,我也很好奇这个问题 请使用session_id()这个函数。登录时的状态直接写成这个函数的值,而不是简单的用true和false。假如数据库中的状态已经和你的session_id()值不一样了,就说明有人在别的地方登录了,你已经被踢了,删除session。 看来是我的描述不清楚呀,我该强调下"异常退出"这一点,郁闷的是CSDN竟然不给人修改. 同意六楼的方法...我就用的那种方法.....不过我没有删除而是保存起来作为log ajax。数据库里设置一个字段。登陆时候插入登陆时间。如:2009-10-1 14:22:30登陆用户网页定时刷新提交当前时间(如1分钟间隔)。覆盖员时间字段。如果他关闭了网页。那么另外一个用户登录的时候。检测数据库里时间字段。登录时候把当前时间和数据库里时间比较。如果超过你设定的网页定时刷新提交时间的间隔(1分钟)那么默认该用户没人在使用。否则就提示有人在登录。 挤掉上一个已登陆的用户: 用户表加一个字段(last_session), 或加一个新表(user_id, last_session) 当同一个用户登入时 取得上一次的session id 并删除该id的内容 再更新成新的 session id -------------------------------------------你好yctin ,可是指这一段吗?我还是没能明白你的这个思路,能否请你就上面的说法再讲解一下吗?有劳 我觉得这个可行,异常退出时如果是多线程浏览器,最坏的情况就是SESSION在20分钟左右不会失效,一般的只要浏览器关闭SESSION就会失效,因此只需要判断SESSION是否存在就可以得到帐号的登录状态了答案来源:http://www.php0731.cn/index.php?news-content.html&id=425 挤掉上一个已登陆的用户 --> 单一登陆提示该帐号已经登陆 --> 这个暂时,恐怕还没有什么精确的解法。 好像没有精确办法第一步可以设logined字段,如果登陆陆,设为1如果退出,设为0第二个,如果用户没有主动退出,下次登陆时,如果为1,再查一下用户的状态是不是在线?discuz和uchome都有一种机制分析用户在不在线,可以研究下或者直接查在不在线了也行,当然,用户在线也不是十分精确的 发出“用户登录提示”在用户数据表中,增设一个登陆的字段,如flog字段,.以0和1来判断用户登陆是否. 当用户登陆,即更新该字段为1,用户下线或超时后,更新该字段为0.挤出其它用户这个方法比较特别,我以前用过,就是session[name]=IP 这里的name是当前用户名,IP是本机地址,登录以后就建立这样一个session,判断当这个session[name]变化以后或注销以后就退出当前用户(或者弹出提示退出)。 当再用同账号异地登录时候当前这个session[name]被更新其它的IP 这是异地刷新时候就会自动退出(或着异地弹出其它用户登录对话框)。 我是这么实现的。用户登录时,产生一随机数,存入COOKIE里并更新用户表里随机数的字段。用户访问时,对比COOKIE里的字段是否与表内字段相符合。如有人用相同帐号进行登录了,原来在线的这个用户COOKIE里的随机数肯定和表里的不符,就被判断注销登录了。 session_save_path :得到session数据存储的路径session_id :得到当前session id服务器端只要unlink(session_save_path().'/sess_'.session_id());就可做到让用户退出登录。问题在于用户 和 每次登录分配到的session_id要有关联,可以数据库记录,也可以用文件记录。只要可以根据用户名查询到对应的session_id,这样就好办了。 许多开源程序是这么用的,只是用在如果换电脑,要求重新登录,是一种安全机制如果用户换电脑,cookie肯定会不同,但也不能确定有用户已登录!如果判断是登录而不允许操作,那么这个用户在别的电脑将不能再登录 方法:数据库表 user_login_info字段:id,user_ip,user_id,last_access_timeuser_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。不知道这样做,是否是能满足lz的要求。 我觉得6楼和18楼的方面就能解决问题,都是得用SESSION,好像比较稳妥。 把session写进数据库中。登陆之前可以进行判断是否已经登陆。 这是不合理的,session_is_registered只是针对当前会话,而每次新开浏览器或是不同浏览器 SESSIONID是不一样的, 当一个帐号登陆后,不允许相同的帐号再次登陆,1.提示该帐号已经登陆2.或挤掉上一个已登陆的用户。 简单啊,a1用a帐号登陆后,在个公共的地方记录,a帐号使用中。数据库/文本a2用a帐号登陆时,看看公共记录有没有a使用,有就提示如果挤掉,a1登陆除了记录使用,还记录一个唯一号,每次操作时,都验证这个唯一号是否和会话中保存的一样,不一样,就说明被挤掉了楼上有说道,a2登陆时,直接删除a1的会话session,但这还是得a2要知道a1的session_id,如何知道?必须记录到一个公共地方------如果是1,提示该帐号已经登陆,那么a2什么时候可以登陆?就要约束一个不操作的刷新时间,比如20分钟,认为吊线/自动退出,那么公共地方还要记录,a1用户最后一次操作时间 感谢各位的回复,考虑到效率及简易性,最后采用了6楼yctin的方法并结合了其它几位的建议,实现过程如下:一,会员表加一个字段(last_session),会员登陆时获取当前SESSIONID更新此字段。二,会员登陆时取得该(last_session)值去session_save_path看该文件有没有,如有则直接删除。三,假如有两个人以上同时使用的话,那么前一个的会话文件就会被后面的一个所删除,也就被逼下线了。这样也就达到了每次只能一个帐号使用的目的了,虽然用户体验略差,但也算是较高效的方法了。再次感谢各位的建议,这个方法或许不是最好的,但至少解决了我的当务之急,当然更期待有更好的方法。 你丢一句话人就闪了,难怪没人理你,如果大家懂FLASH xmlsocket,早就有人提出来了,还需要在这边讨论半天吗,既然自认老鸟,本来就应该讲清楚,否则依老卖老,没负起教育的责任,谁会尊重你啊 php 释放内存 如何在类实例内部取得实例名? 问一下php开发工具zendstudio10 有即实窗口吗 console? 急求各位高手大侠!!! 娃哈哈,新年开始,这么多招聘的? 如何生成随机言广告 高难度问题:如何将WORD文档转换成HTML文档,急用!!! 用PHP怎样实现邮件的自动回复。。。。。。 要做一个类似的投票页面,请进来给点思路。谢谢大家。 php.ini 缺少php_pdo_mysql这个怎么解决 求高手解决 PHP登录页面与子页面代码写在一起后的问题 zend studio ctrl+单击跟踪方法的问题
if(login=1)
{
重复登陆了;
}
用户表加一个字段(last_session), 或加一个新表(user_id, last_session)
当同一个用户登入时
取得上一次的session id 并删除该id的内容
再更新成新的 session id提示该帐号已经登陆:
用户表加2个字段(last_access,last_session), 或加一个新表(user_id,last_access ,last_session)
当同一个用户登入时
取得上一次的last_access time,session id
如果最后存取时间过久, 清除该session , 换新的
否则提示已登入强行挤掉上一个会比较简单及少资源
第二个方法如果想用户体验比较好的话,你还需要用ajax 定时送keepalive
你是指把sessionid存入数据表吗?这同样也存在着无法处理异常退出的可能,可否请你具体写下实现的过程。
点击退出时将此字段修改为 1970-01-01...用户登录时判断此时间段内的值和当前时间的差值是否在某个规定的时间之内(如5分钟),如果是,则不允许登录,否则,允许登录.当然,在每个页面上都用ajax写入时间字段最好了,以免某页停留时间过长出现问题
用二楼的方法就行了 没有必要在数据库添加字段换一种思路 用session的KEY来保存用户ID 判断该ID session 的值为OK或空 来表示该ID是否在线
示例代码://登录判断
session_start();
if(session_is_registered($用户ID))
{
echo "该用户已经登录!";
}
else
{
$_SESSION[$用户ID] = "OK";
echo "登录成功!";
}
如果用上面说的AJAX判断的话 流量少还是可以 等流量大 服务器一延时就完了
我是菜鸟,lz解决问题了要pm我啊,我也很好奇这个问题
请使用session_id()这个函数。登录时的状态直接写成这个函数的值,而不是简单的用true和false。
假如数据库中的状态已经和你的session_id()值不一样了,就说明有人在别的地方登录了,你已经被踢了,删除session。
看来是我的描述不清楚呀,我该强调下"异常退出"这一点,郁闷的是CSDN竟然不给人修改.
数据库里设置一个字段。登陆时候插入登陆时间。如:2009-10-1 14:22:30
登陆用户网页定时刷新提交当前时间(如1分钟间隔)。覆盖员时间字段。
如果他关闭了网页。
那么另外一个用户登录的时候。检测数据库里时间字段。登录时候把当前时间和数据库里时间比较。如果超过你设定的网页定时刷新提交时间的间隔(1分钟)那么默认该用户没人在使用。否则就提示有人在登录。
挤掉上一个已登陆的用户:
用户表加一个字段(last_session), 或加一个新表(user_id, last_session)
当同一个用户登入时
取得上一次的session id 并删除该id的内容
再更新成新的 session id -------------------------------------------你好yctin ,可是指这一段吗?
我还是没能明白你的这个思路,能否请你就上面的说法再讲解一下吗?有劳
提示该帐号已经登陆 --> 这个暂时,恐怕还没有什么精确的解法。
或者直接查在不在线了也行,当然,用户在线也不是十分精确的
挤出其它用户这个方法比较特别,我以前用过,就是session[name]=IP 这里的name是当前用户名,IP是本机地址,登录以后就建立这样一个session,判断当这个session[name]变化以后或注销以后就退出当前用户(或者弹出提示退出)。 当再用同账号异地登录时候当前这个session[name]被更新其它的IP 这是异地刷新时候就会自动退出(或着异地弹出其它用户登录对话框)。
用户登录时,产生一随机数,存入COOKIE里并更新用户表里随机数的字段。
用户访问时,对比COOKIE里的字段是否与表内字段相符合。
如有人用相同帐号进行登录了,原来在线的这个用户COOKIE里的随机数肯定和表里的不符,就被判断注销登录了。
session_id :得到当前session id
服务器端只要unlink(session_save_path().'/sess_'.session_id());就可做到让用户退出登录。
问题在于用户 和 每次登录分配到的session_id要有关联,可以数据库记录,也可以用文件记录。
只要可以根据用户名查询到对应的session_id,这样就好办了。
字段:id,user_ip,user_id,last_access_timeuser_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。
不知道这样做,是否是能满足lz的要求。
这是不合理的,session_is_registered只是针对当前会话,而每次新开浏览器或是不同浏览器 SESSIONID是不一样的,
1.提示该帐号已经登陆
2.或挤掉上一个已登陆的用户。 简单啊,a1用a帐号登陆后,在个公共的地方记录,a帐号使用中。数据库/文本
a2用a帐号登陆时,看看公共记录有没有a使用,有就提示
如果挤掉,
a1登陆除了记录使用,还记录一个唯一号,每次操作时,都验证这个唯一号是否和会话中保存的一样,不一样,就说明被挤掉了
楼上有说道,a2登陆时,直接删除a1的会话session,但这还是得a2要知道a1的session_id,如何知道?必须记录到一个公共地方
------
如果是1,提示该帐号已经登陆,那么a2什么时候可以登陆?就要约束一个不操作的刷新时间,比如20分钟,认为吊线/自动退出,那么公共地方还要记录,a1用户最后一次操作时间
感谢各位的回复,考虑到效率及简易性,最后采用了6楼yctin的方法并结合了其它几位的建议,实现过程如下:一,会员表加一个字段(last_session),会员登陆时获取当前SESSIONID更新此字段。二,会员登陆时取得该(last_session)值去session_save_path看该文件有没有,如有则直接删除。三,假如有两个人以上同时使用的话,那么前一个的会话文件就会被后面的一个所删除,也就被逼下线了。
这样也就达到了每次只能一个帐号使用的目的了,虽然用户体验略差,但也算是较高效的方法了。再次感谢各位的建议,这个方法或许不是最好的,但至少解决了我的当务之急,当然更期待有更好的方法。
你丢一句话人就闪了,难怪没人理你,
如果大家懂FLASH xmlsocket,早就有人提出来了,
还需要在这边讨论半天吗,既然自认老鸟,本来就应该讲清楚,
否则依老卖老,没负起教育的责任,谁会尊重你啊