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

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

 

同个用户同时只能登陆一个, 后登陆者踢掉前登陆者--
同个用户同时只能登陆一个, 后登陆者踢掉前登陆者--
 数据库: `single_user`
同个用户同时只能登陆一个, 后登陆者踢掉前登陆者--
同个用户同时只能登陆一个, 后登陆者踢掉前登陆者
CREATE TABLE IF NOT EXISTS `session` (
同个用户同时只能登陆一个, 后登陆者踢掉前登陆者  `username` 
varchar(50default '',
同个用户同时只能登陆一个, 后登陆者踢掉前登陆者  `time` 
varchar(14default '',
同个用户同时只能登陆一个, 后登陆者踢掉前登陆者  `session_id` 
varchar(200NOT NULL default '0',
同个用户同时只能登陆一个, 后登陆者踢掉前登陆者  `userid` 
int(11default '0',
同个用户同时只能登陆一个, 后登陆者踢掉前登陆者  
PRIMARY KEY  (`session_id`)
同个用户同时只能登陆一个, 后登陆者踢掉前登陆者) ENGINE
=MyISAM DEFAULT CHARSET=utf8;
同个用户同时只能登陆一个, 后登陆者踢掉前登陆者
同个用户同时只能登陆一个, 后登陆者踢掉前登陆者
CREATE TABLE IF NOT EXISTS `users` (
同个用户同时只能登陆一个, 后登陆者踢掉前登陆者  `userid` 
int(11NOT NULL auto_increment,
同个用户同时只能登陆一个, 后登陆者踢掉前登陆者  `username` 
varchar(255NOT NULL,
同个用户同时只能登陆一个, 后登陆者踢掉前登陆者  `password` 
varchar(255NOT NULL,
同个用户同时只能登陆一个, 后登陆者踢掉前登陆者  
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 = '';
同个用户同时只能登陆一个, 后登陆者踢掉前登陆者    
$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;
同个用户同时只能登陆一个, 后登陆者踢掉前登陆者}
同个用户同时只能登陆一个, 后登陆者踢掉前登陆者
?>

 

2. index.php 登陆页面

 

同个用户同时只能登陆一个, 后登陆者踢掉前登陆者<?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`="' .md5trim$_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_namemd5$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
同个用户同时只能登陆一个, 后登陆者踢掉前登陆者}
同个用户同时只能登陆一个, 后登陆者踢掉前登陆者
?>

 

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

 

同个用户同时只能登陆一个, 后登陆者踢掉前登陆者<?php
同个用户同时只能登陆一个, 后登陆者踢掉前登陆者
require_once('config.php');
同个用户同时只能登陆一个, 后登陆者踢掉前登陆者
$db = getConnect();
同个用户同时只能登陆一个, 后登陆者踢掉前登陆者
session_namemd5$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();
同个用户同时只能登陆一个, 后登陆者踢掉前登陆者}
同个用户同时只能登陆一个, 后登陆者踢掉前登陆者
?>

 

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

 

同个用户同时只能登陆一个, 后登陆者踢掉前登陆者<?php
同个用户同时只能登陆一个, 后登陆者踢掉前登陆者
require_once('config.php');
同个用户同时只能登陆一个, 后登陆者踢掉前登陆者
$db = getConnect();
同个用户同时只能登陆一个, 后登陆者踢掉前登陆者
session_namemd5$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();
同个用户同时只能登陆一个, 后登陆者踢掉前登陆者
?>

 

 

 

 

相关文章: