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.?>