1. 程式人生 > >php同個使用者同時只能登陸一個, 後登陸者踢掉前登陸者

php同個使用者同時只能登陸一個, 後登陸者踢掉前登陸者

通常使用者登陸,如果沒有特別的限定, 同一個使用者可以同時登陸, 今天搞了一個東西限定一個使用者不能同時登陸到一個系統上, 後登陸者會把前面登陸的踢出來.(有點像QQ,同個帳號不能在多個地方同時線上, 後面登陸成功後就把前面登陸的掉線)

SQL : 兩張表,一張是使用者資訊,另一張用來儲存session 1. 2.-- 3.-- 資料庫: `single_user` 4.-- 5.CREATE TABLE IF NOT EXISTS `session` ( 6.  `username` varchar(50) default '', 7.  `time` varchar(14) default '', 8.  `session_id` varchar(200) NOT NULL default '0', 9.  `userid` int(11) default '0', 10.  PRIMARY KEY  (`session_id`) 11.) ENGINE=MyISAM DEFAULT CHARSET=utf8; 12. 13.CREATE TABLE IF NOT EXISTS `users` ( 14.  `userid` int(11) NOT NULL auto_increment, 15.  `username` varchar(255) NOT NULL, 16.  `password` varchar(255) NOT NULL, 17.  PRIMARY KEY  (`userid`) 18.) 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 一些簡單的配置,包括資料庫的連線 1.<?php 2.$live_site = 'testing'; 3.$session_life = 600; 4.function getConnect() 5.{ 6.$db_local = 'localhost'; 7.$db_user = 'root'; 8.$db_pwd = ''; 9.$db_name = 'single_user'; 10. 11.$db_link = mysql_connect($db_local, $db_user, $db_pwd); 12.$rs = mysql_select_db($db_name, $db_link); 13.if ($rs) 14.{ 15.return $db_link; 16.} 17.return false; 18.} 19.?> 2. index.php 登陸頁面 1. 2.<?php 3.require_once('config.php'); 4.$db = getConnect(); 5.if (isset($_POST['username']) && isset($_POST['password'])) 6.{ 7.    //處理使用者登陸後的資料驗證 8.    $query = 'SELECT * FROM `users` WHERE `username`="' . trim($_POST['username']) . '" AND `password`="' .md5( trim( $_POST['password'] ) ) . '"'; 9.    $result = mysql_query($query, $db); 10.    $rs_num = mysql_num_rows($result); 11.    if ($rs_num > 0 ) 12.    { 13.        //該使用者存在 14.        $row = mysql_fetch_assoc($result); 15.        $userid = $row['userid']; 16.        $username = $row['username']; 17.        $logintime = time(); 18.     19.        //建立session_id值     20.        $session_id = md5( $userid . $username . $logintime ); 21.         22.        //登陸成功後要插入一條記錄到session表中 23.        $sql = 'INSERT INTO session SET `time`="'.$logintime.'", `session_id`="'.$session_id.'", `userid`='.$userid.', `username`="'.$username.'"'; 24.        mysql_query($sql, $db); 25.         26.        //並且要把session表裡舊的session_id刪除掉 27.        $query = 'DELETE FROM `session` WHERE `userid`=' . $userid . ' AND `username`="' . $username . '" AND `session_id`!="' . $session_id . '"'; 28.        $old_session = mysql_query($query); 29. 30.        //開啟session, 把新登陸的使用者資訊進入$_SESSION中 31.        session_name( md5( $live_site ) ); 32.    session_id( $session_id ); 33.    session_start(); 34. 35.        $_SESSION['session_id'] = $session_id; 36.        $_SESSION['userid'] = $row['userid']; 37.        $_SESSION['username'] = $row['username']; 38.        $_SESSION['logintime'] = $logintime; 39.        session_write_close(); 40.        echo '<script type="text/javascript">window.location.href="index2.php"</script>'; 41.    } else { 42.        echo '<script type="text/javascript">window.location.href="index.php?mosmsg=Username Error"</script>'; 43.    } 44.} else { 45.    //使用者登陸框 46.    ?> 47.    <form method="post" name="user_login" id="user_login" action="index.php"> 48.    Username:<input type="text" name="username" id="username" value=""/> 49.    <br /> 50.    password:<input type="password" name="password" id="password" value=""/> 51.    <br /> 52.    <input type="submit" name="submit" id="submit" value="Submit"/> 53.    </form> 54.<?php 55.} 56.?> 3. index2.php 使用者成功登陸後需要處理原來上一次該使用者的session資訊, 如果上一次此使用者的登陸資訊還有效,需要將其刪除 1. 2.<?php 3.require_once('config.php'); 4.$db = getConnect(); 5.session_name( md5( $live_site ) ); 6.session_start(); 7. 8.$userid = $_SESSION['userid']; 9.$username = $_SESSION['username']; 10.$logintime = $_SESSION['logintime']; 11.$session_id = $_SESSION['session_id']; 12. 13.//判斷使用者是否有登陸 14.if ($session_id != session_id()) { 15.    echo "<script>document.location.href='index.php?mosmsg=Invalid Session'</script>\n"; 16.    exit(); 17.} 18.if ($session_id == md5( $userid . $username . $logintime )) { 19.    $past = time() - $session_life; 20.     21.    //刪除已經超時但是記錄還存在的記錄 22.    $query = "DELETE FROM session" 23.        . "\n WHERE time < '" . (int) $past . "'" 24.        . "\n AND userid <> 0" 25.        ; 26.    mysql_query($query); 27.    $current_time    = time(); 28.    // update session timestamp 更新登陸使用者的時間戳 29.    $query = 'UPDATE #__session' 30.        . '\n SET time="' .  $current_time . '"' 31.            . '\n WHERE session_id = "' . $session_id . '"'; 32.     33.    //以當前使用者登陸後產生的$session_id 來查詢 session表裡的記錄是否存在 34.    //如果不存在那麼就跳到登陸頁面 35.    $query = "SELECT COUNT( session_id )" 36.            . "\n FROM session" 37.            . "\n WHERE session_id = '" .  $session_id . "'" 38.            . "\n AND username = '". $username . "'" 39.            . "\n AND userid = ". $userid; 40.    $session_rs = mysql_query($query); 41.    $session_row = mysql_fetch_row($session_rs); 42.    $session_num = $session_row[0]; 43.    if ($session_num > 0 ) 44.    { 45.        echo 'WELCOME<br / ><a href="logout.php">Logout</a>'; 46.    } else { 47.        echo "<script>document.location.href='index.php?mosmsg=Admin Session Expired'</script>\n"; 48.    } 49.} else { 50.    // session id does not correspond to required session format 51.    echo "<script>document.location.href='index.php?mosmsg=Invalid Session'</script>\n"; 52.    exit(); 53.} 54.?> 4. logout.php 退出使用者,並且刪除 SESSION 1. 2.<?php 3.require_once('config.php'); 4.$db = getConnect(); 5.session_name( md5( $live_site ) ); 6.session_start(); 7. 8.$userid = $_SESSION['userid']; 9.$username = $_SESSION['username']; 10.$logintime = $_SESSION['logintime']; 11.$session_id = $_SESSION['session_id']; 12. 13.$sql = 'DELETE FROM session WHERE userid='.$userid.' AND username="'.$username.'" AND session_id = "'.$session_id.'"'; 14.mysql_query($sql); 15.session_destroy(); 16.echo "<script>document.location.href='index.php'</script>\n"; 17.exit(); 18.?>