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

这篇博客介绍了如何限制MySQL数据库中的用户在同一时间只能在一个系统上登录。通过创建session表并结合用户信息,每次用户登录时会检查并删除旧的session记录,确保登录的唯一性。当用户再次登录时,如果发现已有session,则会踢掉之前登录的用户。详细步骤包括创建session表、验证登录、更新和清理session记录以及登出功能的实现。
摘要由CSDN通过智能技术生成

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

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

731655954c7be9d8835ece551b5385f8.png--

731655954c7be9d8835ece551b5385f8.png--数据库: `single_user`731655954c7be9d8835ece551b5385f8.png--

731655954c7be9d8835ece551b5385f8.pngCREATETABLEIFNOTEXISTS`session` (

731655954c7be9d8835ece551b5385f8.png  `username`varchar(50)default'',

731655954c7be9d8835ece551b5385f8.png  `time`varchar(14)default'',

731655954c7be9d8835ece551b5385f8.png  `session_id`varchar(200)NOTNULLdefault'0',

731655954c7be9d8835ece551b5385f8.png  `userid`int(11)default'0',

731655954c7be9d8835ece551b5385f8.pngPRIMARYKEY(`session_id`)

731655954c7be9d8835ece551b5385f8.png) ENGINE=MyISAMDEFAULTCHARSET=utf8;

731655954c7be9d8835ece551b5385f8.png

731655954c7be9d8835ece551b5385f8.pngCREATETABLEIFNOTEXISTS`users` (

731655954c7be9d8835ece551b5385f8.png  `userid`int(11)NOTNULLauto_increment,

731655954c7be9d8835ece551b5385f8.png  `username`varchar(255)NOTNULL,

731655954c7be9d8835ece551b5385f8.png  `password`varchar(255)NOTNULL,

731655954c7be9d8835ece551b5385f8.pngPRIMARYKEY(`userid`)

731655954c7be9d8835ece551b5385f8.png) ENGINE=MyISAMDEFAULTCHARSET=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 一些简单的配置,包括数据库的连接

731655954c7be9d8835ece551b5385f8.png<?php

731655954c7be9d8835ece551b5385f8.png$live_site='testing';

731655954c7be9d8835ece551b5385f8.png$session_life=600;

731655954c7be9d8835ece551b5385f8.pngfunctiongetConnect()

731655954c7be9d8835ece551b5385f8.png{

731655954c7be9d8835ece551b5385f8.png$db_local='localhost';

731655954c7be9d8835ece551b5385f8.png$db_user='root';

731655954c7be9d8835ece551b5385f8.png$db_pwd='';

731655954c7be9d8835ece551b5385f8.png$db_name='single_user';

731655954c7be9d8835ece551b5385f8.png

731655954c7be9d8835ece551b5385f8.png$db_link=mysql_connect($db_local,$db_user,$db_pwd);

731655954c7be9d8835ece551b5385f8.png$rs=mysql_select_db($db_name,$db_link);

731655954c7be9d8835ece551b5385f8.pngif($rs)

731655954c7be9d8835ece551b5385f8.png    {

731655954c7be9d8835ece551b5385f8.pngreturn$db_link;

731655954c7be9d8835ece551b5385f8.png    }

731655954c7be9d8835ece551b5385f8.pngreturnfalse;

731655954c7be9d8835ece551b5385f8.png}

731655954c7be9d8835ece551b5385f8.png?>

2. index.php 登陆页面

731655954c7be9d8835ece551b5385f8.png<?php

731655954c7be9d8835ece551b5385f8.pngrequire_once('config.php');

731655954c7be9d8835ece551b5385f8.png$db=getConnect();

731655954c7be9d8835ece551b5385f8.pngif(isset($_POST['username'])&&isset($_POST['password']))

731655954c7be9d8835ece551b5385f8.png{

731655954c7be9d8835ece551b5385f8.png//处理用户登陆后的数据验证731655954c7be9d8835ece551b5385f8.png$query='SELECT * FROM `users` WHERE `username`="'.trim($_POST['username']).'" AND `password`="'.md5(trim($_POST['password'] ) ).'"';

731655954c7be9d8835ece551b5385f8.png$result=mysql_query($query,$db);

731655954c7be9d8835ece551b5385f8.png$rs_num=mysql_num_rows($result);

731655954c7be9d8835ece551b5385f8.pngif($rs_num>0)

731655954c7be9d8835ece551b5385f8.png    {

731655954c7be9d8835ece551b5385f8.png//该用户存在731655954c7be9d8835ece551b5385f8.png$row=mysql_fetch_assoc($result);

731655954c7be9d8835ece551b5385f8.png$userid=$row['userid'];

731655954c7be9d8835ece551b5385f8.png$username=$row['username'];

731655954c7be9d8835ece551b5385f8.png$logintime=time();

731655954c7be9d8835ece551b5385f8.png    

731655954c7be9d8835ece551b5385f8.png//创建session_id值731655954c7be9d8835ece551b5385f8.png$session_id=md5($userid.$username.$logintime);

731655954c7be9d8835ece551b5385f8.png        

731655954c7be9d8835ece551b5385f8.png//登陆成功后要插入一条记录到session表中731655954c7be9d8835ece551b5385f8.png$sql='INSERT INTO session SET `time`="'.$logintime.'", `session_id`="'.$session_id.'", `userid`='.$userid.', `username`="'.$username.'"';

731655954c7be9d8835ece551b5385f8.pngmysql_query($sql,$db);

731655954c7be9d8835ece551b5385f8.png        

731655954c7be9d8835ece551b5385f8.png//并且要把session表里旧的session_id删除掉731655954c7be9d8835ece551b5385f8.png$query='DELETE FROM `session` WHERE `userid`='.$userid.'AND `username`="'.$username.'" AND `session_id`!="'.$session_id.'"';

731655954c7be9d8835ece551b5385f8.png$old_session=mysql_query($query);

731655954c7be9d8835ece551b5385f8.png

731655954c7be9d8835ece551b5385f8.png//开启session, 把新登陆的用户信息进入$_SESSION中731655954c7be9d8835ece551b5385f8.pngsession_name(md5($live_site) );

731655954c7be9d8835ece551b5385f8.pngsession_id($session_id);

731655954c7be9d8835ece551b5385f8.pngsession_start();

731655954c7be9d8835ece551b5385f8.png

731655954c7be9d8835ece551b5385f8.png$_SESSION['session_id']=$session_id;

731655954c7be9d8835ece551b5385f8.png$_SESSION['userid']=$row['userid'];

731655954c7be9d8835ece551b5385f8.png$_SESSION['username']=$row['username'];

731655954c7be9d8835ece551b5385f8.png$_SESSION['logintime']=$logintime;

731655954c7be9d8835ece551b5385f8.pngsession_write_close();

731655954c7be9d8835ece551b5385f8.pngecho'';

731655954c7be9d8835ece551b5385f8.png    }else{

731655954c7be9d8835ece551b5385f8.pngecho'';

731655954c7be9d8835ece551b5385f8.png    }

731655954c7be9d8835ece551b5385f8.png}else{

731655954c7be9d8835ece551b5385f8.png//用户登陆框731655954c7be9d8835ece551b5385f8.png?>731655954c7be9d8835ece551b5385f8.png

731655954c7be9d8835ece551b5385f8.png    Username: 731655954c7be9d8835ece551b5385f8.png 731655954c7be9d8835ece551b5385f8.png    password: 731655954c7be9d8835ece551b5385f8.png 731655954c7be9d8835ece551b5385f8.png 731655954c7be9d8835ece551b5385f8.png 731655954c7be9d8835ece551b5385f8.png<?php

731655954c7be9d8835ece551b5385f8.png}

731655954c7be9d8835ece551b5385f8.png?>

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

731655954c7be9d8835ece551b5385f8.png<?php

731655954c7be9d8835ece551b5385f8.pngrequire_once('config.php');

731655954c7be9d8835ece551b5385f8.png$db=getConnect();

731655954c7be9d8835ece551b5385f8.pngsession_name(md5($live_site) );

731655954c7be9d8835ece551b5385f8.pngsession_start();

731655954c7be9d8835ece551b5385f8.png

731655954c7be9d8835ece551b5385f8.png$userid=$_SESSION['userid'];

731655954c7be9d8835ece551b5385f8.png$username=$_SESSION['username'];

731655954c7be9d8835ece551b5385f8.png$logintime=$_SESSION['logintime'];

731655954c7be9d8835ece551b5385f8.png$session_id=$_SESSION['session_id'];

731655954c7be9d8835ece551b5385f8.png

731655954c7be9d8835ece551b5385f8.png//判断用户是否有登陆731655954c7be9d8835ece551b5385f8.pngif($session_id!=session_id()) {

731655954c7be9d8835ece551b5385f8.pngecho"\n";

731655954c7be9d8835ece551b5385f8.pngexit();

731655954c7be9d8835ece551b5385f8.png}

731655954c7be9d8835ece551b5385f8.pngif($session_id==md5($userid.$username.$logintime)) {

731655954c7be9d8835ece551b5385f8.png$past=time()-$session_life;

731655954c7be9d8835ece551b5385f8.png    

731655954c7be9d8835ece551b5385f8.png//删除已经超时但是记录还存在的记录731655954c7be9d8835ece551b5385f8.png$query="DELETE FROM session"731655954c7be9d8835ece551b5385f8.png."\n WHERE time ."\n AND userid <> 0"731655954c7be9d8835ece551b5385f8.png        ;

731655954c7be9d8835ece551b5385f8.pngmysql_query($query);

731655954c7be9d8835ece551b5385f8.png$current_time=time();

731655954c7be9d8835ece551b5385f8.png//update session timestamp 更新登陆用户的时间戳731655954c7be9d8835ece551b5385f8.png$query='UPDATE #__session'731655954c7be9d8835ece551b5385f8.png.'\n SET time="'.$current_time.'"'731655954c7be9d8835ece551b5385f8.png.'\n WHERE session_id = "'.$session_id.'"';

731655954c7be9d8835ece551b5385f8.png    

731655954c7be9d8835ece551b5385f8.png//以当前用户登陆后产生的$session_id 来查询 session表里的记录是否存在

731655954c7be9d8835ece551b5385f8.png    //如果不存在那么就跳到登陆页面731655954c7be9d8835ece551b5385f8.png$query="SELECT COUNT( session_id )"731655954c7be9d8835ece551b5385f8.png."\n FROM session"731655954c7be9d8835ece551b5385f8.png."\n WHERE session_id = '".$session_id."'"731655954c7be9d8835ece551b5385f8.png."\n AND username = '".$username."'"731655954c7be9d8835ece551b5385f8.png."\n AND userid =".$userid;

731655954c7be9d8835ece551b5385f8.png$session_rs=mysql_query($query);

731655954c7be9d8835ece551b5385f8.png$session_row=mysql_fetch_row($session_rs);

731655954c7be9d8835ece551b5385f8.png$session_num=$session_row[0];

731655954c7be9d8835ece551b5385f8.pngif($session_num>0)

731655954c7be9d8835ece551b5385f8.png    {

731655954c7be9d8835ece551b5385f8.pngecho'WELCOMELogout';

731655954c7be9d8835ece551b5385f8.png    }else{

731655954c7be9d8835ece551b5385f8.pngecho"\n";

731655954c7be9d8835ece551b5385f8.png    }

731655954c7be9d8835ece551b5385f8.png}else{

731655954c7be9d8835ece551b5385f8.png//session id does not correspond to required session format731655954c7be9d8835ece551b5385f8.pngecho"\n";

731655954c7be9d8835ece551b5385f8.pngexit();

731655954c7be9d8835ece551b5385f8.png}

731655954c7be9d8835ece551b5385f8.png?>

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

731655954c7be9d8835ece551b5385f8.png<?php

731655954c7be9d8835ece551b5385f8.pngrequire_once('config.php');

731655954c7be9d8835ece551b5385f8.png$db=getConnect();

731655954c7be9d8835ece551b5385f8.pngsession_name(md5($live_site) );

731655954c7be9d8835ece551b5385f8.pngsession_start();

731655954c7be9d8835ece551b5385f8.png

731655954c7be9d8835ece551b5385f8.png$userid=$_SESSION['userid'];

731655954c7be9d8835ece551b5385f8.png$username=$_SESSION['username'];

731655954c7be9d8835ece551b5385f8.png$logintime=$_SESSION['logintime'];

731655954c7be9d8835ece551b5385f8.png$session_id=$_SESSION['session_id'];

731655954c7be9d8835ece551b5385f8.png

731655954c7be9d8835ece551b5385f8.png$sql='DELETE FROM session WHERE userid='.$userid.'AND username="'.$username.'" AND session_id = "'.$session_id.'"';

731655954c7be9d8835ece551b5385f8.pngmysql_query($sql);

731655954c7be9d8835ece551b5385f8.pngsession_destroy();

731655954c7be9d8835ece551b5385f8.pngecho"\n";

731655954c7be9d8835ece551b5385f8.pngexit();

731655954c7be9d8835ece551b5385f8.png?>

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要搭建一个能够记录登陆者信息的 web 应用,可以使用 Python 的 web 框架 Flask。下面是一个简单的示例: 1. 首先安装 Flask: ```python pip install flask ``` 2. 在项目根目录下创建一个 `app.py` 文件,编写以下代码: ```python from flask import Flask, request app = Flask(__name__) @app.route('/', methods=['GET', 'POST']) def index(): if request.method == 'POST': username = request.form['username'] password = request.form['password'] # 在这里将用户名和密码保存到数据库或文件中 return 'Hello, {}!'.format(username) return ''' <form method="post"> <label>Username:</label> <input type="text" name="username"><br> <label>Password:</label> <input type="password" name="password"><br> <button type="submit">Log in</button> </form> ''' if __name__ == '__main__': app.run() ``` 这个应用会在主页上显示一个登录表单,当用户输入用户名和密码并提交表单时,会将用户名作为参数传递到 `/` 路由函数中,你可以在这个函数中将用户名和其他信息保存到数据库或文件中。在这个例子中,我们只是简单地返回一个欢迎消息,包含用户用户名。 3. 在终端中运行 `python app.py` 命令启动应用,然后在浏览器中访问 `http://127.0.0.1:5000`,就可以看到登录表单了。 当用户提交表单后,你就可以在服务器端获取到用户的信息并进行处理了。为了保护用户的密码安全,你应该使用加密算法对密码进行加密,而不是直接保存在数据库中。另外,为了更好地管理用户的信息,你也可以考虑使用用户认证和授权库,例如 Flask-Login 和 Flask-Security 等。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值