php 实现账号不能同时登陆的方法分析【当其它地方登陆时,当前账号失效】

吾爱主题 阅读:159 2021-10-06 13:25:00 评论:0

本文实例讲述了php 实现账号不能同时登陆的方法。分享给大家供大家参考,具体如下:

解决的思路是每当用户登陆时我们必需记录当前的用户id和session_id,如果有人在其它地方用此账号登陆时,我们把此用户id对应的session_id的session文件删除,并重新记录当前的session_id。那么之前的用户就失效了。

login.php代码如下:

?
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 <?php session_start();   require 'db.php' ;   if (! empty ( $_POST [ 'submit' ])) {    $uname = ! empty ( $_POST [ 'uname' ]) ? trim( $_POST [ 'uname' ]) : '' ;    $upwd = ! empty ( $_POST [ 'upwd' ]) ? trim( $_POST [ 'upwd' ]) : '' ;      //这里只是演示,实际情况是在数据库里查询并判断    if ( $uname == 'test' && $upwd == 'test' ) {      //这里假设test用户id为1      $uid = 1;      $session_id = session_id();            //判断是否已有用户登陆过      $res = mysql_query( "SELECT session_id FROM tb_login_state WHERE uid={$uid}" );      $data = mysql_fetch_assoc( $res );      if (! empty ( $data )) {        $sessionId = $data [ 'session_id' ];        $sessionFilePath = session_save_path() . DIRECTORY_SEPARATOR . 'sess_' . $sessionId ;          //删除上次用户登陆的session文件        if ( file_exists ( $sessionFilePath ) && is_writable ( $sessionFilePath )) {          @unlink( $sessionFilePath );        }        //删除用户登陆信息        mysql_query( "DELETE FROM tb_login_state WHERE uid={$uid}" );      }      //添加新的用户登陆信息      mysql_query( "INSERT INTO tb_login_state VALUES({$uid}, '{$session_id}')" );        $_SESSION [ 'userInfo' ] = array (        'name' => $uname      );      echo '<script type="text/javascript">alert("您已成功登陆,跳转首页");</script>' ;      echo '<script type="text/javascript">location.href="index.php" rel="external nofollow" ;</script>' ;    } } ?> <!DOCTYPE HTML> <html lang= "zh-CN" > <head>    <meta charset= "UTF-8" >    <title>用户登陆页面</title> </head> <body>    <form action= "" method= "post" >      用户名:<input type= "text" name= "uname" value= "" />      密码:<input type= "password" name= "upwd" value= "" />      <input type= "submit" name= "submit" value= "登陆" />    </form> </body> </html>

index.php代码如下:

?
1 2 3 4 5 6 7 8 9 <?php header( 'Content-Type:text/html;charset=utf-8' ); session_start();   if (! empty ( $_SESSION [ 'userInfo' ])) {    echo '您好:' , $_SESSION [ 'userInfo' ][ 'name' ]; } else {    header( 'Location:login.php' ); }

db.php代码如下:

?
1 2 3 4 <?php $db = mysql_connect( '127.0.0.1' , 'root' , '' ) or die ( 'connect error' ); mysql_select_db( 'test' ) or die ( 'select db error' ); mysql_query( 'set names utf8' ) or die ( 'set names error' );

tb_login_state表结构如下:

?
1 2 3 4 CREATE TABLE `tb_login_state` ( `uid` int (11) unsigned NOT NULL COMMENT '用户ID' , `session_id` varchar (32) NOT NULL DEFAULT '' COMMENT '存储用户的session_id' ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT= '用户登陆状态表' ;

如果是session存储方式不是文件,而是存在mysql,memcache,redis中,思路其实是一样的,都是把前一次的session_id保存。判断用户是否登陆过,如果登陆过就让上一次的session失效(删除session数据)。

(*通过设置session的过期时间和cookie的过期时间来让session失效是不严格的,最直接的方法是直接把session文件删除。)

推荐阅读:

http://www.laruence.com/2012/01/10/2469.html

希望本文所述对大家PHP程序设计有所帮助。

原文链接:https://www.cnblogs.com/jkko123/p/6294608.html

可以去百度分享获取分享代码输入这里。
声明

1.本站遵循行业规范,任何转载的稿件都会明确标注作者和来源;2.本站的原创文章,请转载时务必注明文章作者和来源,不尊重原创的行为我们将追究责任;3.作者投稿可能会经我们编辑修改或补充。

【腾讯云】云服务器产品特惠热卖中
搜索
标签列表
    关注我们

    了解等多精彩内容