php同个用户同时只能登陆一个, 后登陆者踢掉前登陆者php同个用户同时只能登陆一个, 后登陆者踢掉前登陆者

通常用户登陆,如果没有特别的限定, 同一个用户可以同时登陆, 今天搞了一个东西限定一个用户不能同时登陆到一个系统上, 后登陆者会把前面登陆的踢出来.(有点像QQ,同个帐号不能在多个地方同时在线, 后面登陆成功后就把前面登陆的掉线)
SQL : 两张表,一张是用户信息,另一张用来保存session
[code] 
--
-- 数据库: `single_user`
--
CREATE TABLE IF NOT EXISTS `session` (
  `username` varchar(50) default '',
  `time` varchar(14) default '',
  `session_id` varchar(200) NOT NULL default '0',
  `userid` int(11) default '0',
  PRIMARY KEY  (`session_id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;

CREATE TABLE IF NOT EXISTS `users` (
  `userid` int(11) NOT NULL auto_increment,
  `username` varchar(255) NOT NULL,
  `password` varchar(255) NOT NULL,
  PRIMARY KEY  (`userid`)
) ENGINE=MyISAM  DEFAULT CHARSET=utf8 AUTO_INCREMENT=2 ;
[/code]

数据表 session 以session_id 为主键, 这个主键是 userid + user name + user login time 的 md5值算出来的. 每次用户登陆的时候就会像session表里插入一条,同时以userid username为条件查询旧的session记录并且删除他,所以当页面判断当前用户是否有效时,是通过$_SESSION数组里面保存在session_id值和数据库里取出来的session_id进行比较, 旧的session_id 在此用户第2次登陆时已经被删除,因此找不到,从而被退出系统.
代码部分
1.config.php 一些简单的配置,包括数据库的连接
[code]<?php
$live_site = 'testing';
$session_life = 600;
function getConnect()
{
$db_local = 'localhost';
$db_user = 'root';
$db_pwd = '';
$db_name = 'single_user';

$db_link = mysql_connect($db_local, $db_user, $db_pwd);
$rs = mysql_select_db($db_name, $db_link);
if ($rs)
{
return $db_link;
}
return false;
}
?>
[/code]
2. index.php 登陆页面[code] 
<?php
require_once('config.php');
$db = getConnect();
if (isset($_POST['username']) && isset($_POST['password']))
{
    //处理用户登陆后的数据验证
    $query = 'SELECT * FROM `users` WHERE `username`="' . trim($_POST['username']) . '" AND `password`="' .md5( trim( $_POST['password'] ) ) . '"';
    $result = mysql_query($query, $db);
    $rs_num = mysql_num_rows($result);
    if ($rs_num > 0 )
    {
        //该用户存在
        $row = mysql_fetch_assoc($result);
        $userid = $row['userid'];
        $username = $row['username'];
        $logintime = time();
    
        //创建session_id值    
        $session_id = md5( $userid . $username . $logintime );
        
        //登陆成功后要插入一条记录到session表中
        $sql = 'INSERT INTO session SET `time`="'.$logintime.'", `session_id`="'.$session_id.'", `userid`='.$userid.', `username`="'.$username.'"';
        mysql_query($sql, $db);
        
        //并且要把session表里旧的session_id删除掉
        $query = 'DELETE FROM `session` WHERE `userid`=' . $userid . ' AND `username`="' . $username . '" AND `session_id`!="' . $session_id . '"';
        $old_session = mysql_query($query);

//开启session, 把新登陆的用户信息进入$_SESSION中
        session_name( md5( $live_site ) );
    session_id( $session_id );
    session_start();

$_SESSION['session_id'] = $session_id;
        $_SESSION['userid'] = $row['userid'];
        $_SESSION['username'] = $row['username'];
        $_SESSION['logintime'] = $logintime;
        session_write_close();
        echo '<script type="text/javascript">window.location.href="index2.php"</script>';
    } else {
        echo '<script type="text/javascript">window.location.href="index.php?mosmsg=Username Error"</script>';
    }
} else {
    //用户登陆框
    ?>
    <form method="post" name="user_login" id="user_login" action="index.php">
    Username:<input type="text" name="username" id="username" value=""/>
    <br />
    password:<input type="password" name="password" id="password" value=""/>
    <br />
    <input type="submit" name="submit" id="submit" value="Submit"/>
    </form>
<?php
}
?>
[/code]
3. index2.php 用户成功登陆后需要处理原来上一次该用户的session信息, 如果上一次此用户的登陆信息还有效,需要将其删除
[code] 
<?php
require_once('config.php');
$db = getConnect();
session_name( md5( $live_site ) );
session_start();

$userid = $_SESSION['userid'];
$username = $_SESSION['username'];
$logintime = $_SESSION['logintime'];
$session_id = $_SESSION['session_id'];

//判断用户是否有登陆
if ($session_id != session_id()) {
    echo "<script>document.location.href='index.php?mosmsg=Invalid Session'</script>\n";
    exit();
}
if ($session_id == md5( $userid . $username . $logintime )) {
    $past = time() - $session_life;
    
    //删除已经超时但是记录还存在的记录
    $query = "DELETE FROM session"
        . "\n WHERE time < '" . (int) $past . "'"
        . "\n AND userid <> 0"
        ;
    mysql_query($query);
    $current_time    = time();
    // update session timestamp 更新登陆用户的时间戳
    $query = 'UPDATE #__session'
        . '\n SET time="' .  $current_time . '"'
            . '\n WHERE session_id = "' . $session_id . '"';
    
    //以当前用户登陆后产生的$session_id 来查询 session表里的记录是否存在
    //如果不存在那么就跳到登陆页面
    $query = "SELECT COUNT( session_id )"
            . "\n FROM session"
            . "\n WHERE session_id = '" .  $session_id . "'"
            . "\n AND username = '". $username . "'"
            . "\n AND userid = ". $userid;
    $session_rs = mysql_query($query);
    $session_row = mysql_fetch_row($session_rs);
    $session_num = $session_row[0];
    if ($session_num > 0 )
    {
        echo 'WELCOME<br / ><a href="logout.php">Logout</a>';
    } else {
        echo "<script>document.location.href='index.php?mosmsg=Admin Session Expired'</script>\n";
    }
} else {
    // session id does not correspond to required session format
    echo "<script>document.location.href='index.php?mosmsg=Invalid Session'</script>\n";
    exit();
}
?>
[/code]

4. logout.php 退出用户,并且删除 SESSION
[code] 
<?php
require_once('config.php');
$db = getConnect();
session_name( md5( $live_site ) );
session_start();

$userid = $_SESSION['userid'];
$username = $_SESSION['username'];
$logintime = $_SESSION['logintime'];
$session_id = $_SESSION['session_id'];

$sql = 'DELETE FROM session WHERE userid='.$userid.' AND username="'.$username.'" AND session_id = "'.$session_id.'"';
mysql_query($sql);
session_destroy();
echo "<script>document.location.href='index.php'</script>\n";
exit();
?>
[/code]

转载于:https://blog.51cto.com/1875281/944760

php同个用户同时只能登陆一个, 后登陆者踢掉前登陆者相关推荐

  1. J2EE用监听器实现同一用户只能有一个在线

    这里我们讨论的是已登陆或将要登陆的用户,游客不在讨论的范围之内.这一点大家应该很容易就能理解的吧.                那么我们应该怎样去实现同一用户只能有一个在线这样的一个小功能呢? 有人 ...

  2. 微信电脑客户端登陆_电脑端的微信只能开一个?简单操作就能随意开

    微信已经成为工作和生活的必备交流工具,每个人几乎都拥有微信号,而且有些人还会注册两个或多个,用以区分工作和私人. 但同时登陆多个账号却成为了难题,现在手机上多开已经很方便,而在电脑上默认只能登录一个, ...

  3. 同一个PC只能运行一个应用实例(考虑多个用户会话情况)

    原文:同一个PC只能运行一个应用实例(考虑多个用户会话情况) 1 class Program 2 { 3 private static Mutex m; 4 5 [STAThread] 6 stati ...

  4. java中限制多人登录的_Spring Boot + Spring Security 防止用户在多处同时登录(一个用户同时只能登录一次)及源码分析...

    网上很多文章的实现方法写得比较复杂 这里介绍一个简单的方法. 实现 @Configuration @EnableWebSecurity public class SecurityConfigurati ...

  5. linux中一个用户可以同时属于多个组吗,为什么linux用户可以属于多个用户组,文件只能属于一个用户组?...

    是没必要还是我说错了? 谁说文件不能属于多个组的?支持 ACL 扩展就可以,现在大多数发行版都支持,只是默认它不给你显示出来罢了. 为避免无休止的争论,特意补充说明一些观点,不强求接受,若有异议还请引 ...

  6. 数据库xxx已打开,并且一次只能有一个用户访问。 (Microsoft SQL Server,错误: 924)

    操作数据库失败,提示如下错误: 数据库xxx已打开,并且一次只能有一个用户访问. (Microsoft SQL Server,错误: 924) 重启数据库问题仍然存在.可执行以下sql解决: USE ...

  7. java判断用户是否在某一个区域登录_Java实现QQ登录和微博第三方登录

    来源:http://www.cnblogs.com/liuxianan转自公众号:Java后端 1. 前言 个人网站最近增加了评论功能,为了方便用户不用注册就可以评论,对接了 QQ 和微博这 2 大常 ...

  8. java中登陆界面怎么连接到下一个界面啊_JavaWeb登陆成功后跳转到上一个页面

    JavaWeb登陆成功后跳转到上一个页面,这个标题注定要词不达意,你可能会遇到这样的情形,当点击页面的某个请求时,由于用户未登录,需要跳转到登录页,用户登录成功后,再跳转到上一个页面:还有一种情况,多 ...

  9. 如何让你的程序同时只能运行一个?

    有些程序我们希望在一台机器上只有一个实例在运行,我在windows下也遇到过很多类似这样的程序,如QQ,它只允许同时运行一个.那么我们在Linux该如何实现这样的单例运行的程序呢? 思路 实现这样的程 ...

最新文章

  1. [Ruby01]Class, Module, Object,Kernel的关系
  2. 3篇量子计算里程碑论文同登Nature封面:保真度超99%,达到实用化水平
  3. 解决windows图片查看器背景色变成米黄色
  4. php处理heic格式图片,iPhone 照片为heic格式怎么处理?
  5. Nulgrind:最小的Valgrind工具
  6. 操作系统 ——进程的状态与转换
  7. x264_scan8分析
  8. 前端:CSS/14/综合案例:传智首页
  9. python图像卷积_图像处理——卷积原理、二维卷积python实现
  10. rocketmq namesrv 第一章启动过程
  11. iOS 数据持久化 NSUserDefault
  12. jvm压缩指针原理以及32g内存压缩指针失效详解
  13. 笔记5 bean的作用域
  14. 硬,软连接,以及在windows中的用法
  15. 第二十四课、布局管理器(三)
  16. K3路由器自建服务器,折腾路由器 篇一:K3路由器刷官改固件小白日记
  17. 深圳javascript培训:名师精品文章--JS有哪些变态语法系列
  18. win7桌面快捷方式图标修复方法
  19. PHP语言之表单基础
  20. Android Bottom Sheet详解

热门文章

  1. Cloudstack系统配置(三)
  2. Win32页上的所有控件属性与方法
  3. Mybatis 拦截器
  4. 怎样实现MathType中带箭头向量的输入
  5. JFinal整合CKFinder
  6. javascript与xml实例应用
  7. logcat崩溃_使用logcat抓取Android崩溃日志
  8. Python 循环删除指定文件夹下所有的.longtian类型文件
  9. 知识点:Mysql 索引原理完全手册(1)
  10. 算法马拉松13 A-E解题报告