微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

通常用户登陆,如果没有特别的限定,同一个用户可以同时登陆,今天搞了一个东西限定一个用户不能同时登陆到一个系统上,后登陆者会把前面登陆的踢出来.(有点像QQ,同个帐号不能在多个地方同时在线,后面登陆成功后就把前面登陆的掉线)

sql : 两张表,一张是用户信息,另一张用来保存session

--
-- 数据库: `single_user`
--
CREATE TABLE IF NOT EXISTS `session` (
`username` varchar(50) default '',
`time` varchar(14) session_id` varchar(200) NOT NULL default '0',1)">
 `userid` int(11) 
 PRIMARY KEY  (`session_id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;

 

 

CREATE TABLE  NOT EXISTS `users` (
`userid` int(11) NOT NULL auto_increment,1)">
  `username` varchar(255) NOT NULL,1)">
  `password` varchar(255) NOT 
  PRIMARY KEY  (`userid`)
) ENGINE=MyISAM  DEFAULT CHARSET=utf8 AUTO_INCREMENT=2 ;

 


数据表 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 一些简单的配置,包括数据库的连接

<?PHP
$live_site = 'testing';
$session_life = 600;
function getConnect()
{
    $db_local = 'localhost';
    $db_user = 'root'$db_pwd = 'root'$db_name = 'single_userlogin';

    $db_link = MysqLi_connect($db_local,$db_user,1)">$db_pwd,1)">$db_name);

    if ($db_link)
    {
        return ;
    }
        return false;
}

 


2. index.PHP 登陆页面

<?PHP
require_once('config.PHP');
$db = getConnect();
if (isset($_POST['username']) && $_POST['password']))
{
    //处理用户登陆后的数据验证
    $query = 'SELECT * FROM `users` WHERE `username`="' . trim($_POST['username']) . '" AND `password`="' .md5( trim( $_POST['password'] ) ) . '"'$result = MysqLi_query($db,1)">$query);

    $rs_num = MysqLi_num_rows($result$rs_num > 0 )
    {
        用户存在
        $row = MysqLi_fetch_assoc();
        $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.'"';
        MysqLi_query( $sql);
        echo $sql; echo "<br>"并且要把session表里旧的session_id删除
        $query = 'DELETE FROM `session` WHERE `userid`=' . $userid . ' AND `username`="' . $username . '" AND `session_id`!="' . $session_id . '"';
        $old_session = ;

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

        $_SESSION['session_id'] = $_SESSION['userid'] = $_SESSION['username'] = $_SESSION['logintime'] = echo '<pre>'var_dump($_SESSIONsession_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>';
    }
}  {
    用户登陆框
    ?>
    <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
}
?>

 


3. index2.PHP 用户成功登陆后需要处理原来上一次该用户的session信息,如果上一次此用户的登陆信息还有效,需要将其删除

<? ) );
();

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

判断用户是否有登陆
$session_id != ()) {
    echo "<script>document.location.href='index.PHP?mosmsg=Invalid Session'</script>\n";
    exit();
}
$session_id ==  )) {
    $past = time() - $session_life;
    
    删除已经超时但是记录还存在的记录
    $query = "DELETE FROM session"
        . "\n WHERE time < '" . (int) $past . "'"
        . "\n AND userid <> 0"
        ;
    );
    $current_time    = ();
     update session timestamp 更新登陆用户的时间戳
    $query = 'UPDATE #__session'
        . '\n SET time="' .  $current_time . '"'
            . '\n WHERE 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 = $session_row = MysqLi_fetch_row($session_rs$session_num = $session_row[0];
    $session_num > 0echo 'WELCOME<br / ><a href="logout.PHP">logout</a>'echo "<script>document.location.href='index.PHP?mosmsg=Admin Session Expired'</script>\n" session id does not correspond to required session format
    ;
   ();
}
?>

 


4. logout.PHP 退出用户,并且删除 SESSION

<?];

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

转载:https://www.cnblogs.com/belie8/articles/2196529.html

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐