yii2 获取同一个账号登录的所有session_php实现单点登陆,一个账号不能同时多处在线...

简单方法实现单点登陆

要求不能一个账号多人登陆在线,后面登陆的人要把前面的人顶掉,类似于王者荣耀之类的。一开始准备用框架,但是框架有些复杂,用在这个项目是感觉没有必要,所以采用一个简便的方法。

思路如下:在数据库中加入一个状态属性,这个状态是随机产生的六位数值。把这个数值储存到数据库,之后定义一个全局常量,把这个随机产生的六位数值赋值给这个常量。然后在每个网页加入常量与数据库中状态属性值的比较,如果不同就跳转到登陆界面。在其他地方登陆会产生新的六位数值,这样就和常量不一样,那前面登陆的也就被挤下去了。

1. 创建数据库

我用的是MySQL数据库,创建一个如下的表。

2. 连接数据库

这里我只是实现简单连接,功能逻辑不完善。

<?php
#数据库连接工具
$conn = new mysqli("localhost", "root", "root", "hrsystemdb");
?>

3. 简单搭一个登陆界面和主页

//登陆界面
<html>
<head>
    <meta charset="utf-8">
    <title>登陆</title>
</head>
<body>
    <form action="userLoginAction.php" method="POST">
        <table>
            <tr>
                <td>用户名</td>
                <td><input type="text" name="username"></td>
            </tr>
            <tr>
                <td>密 码</td>
                <td><input type="password" name="password"></td>
            </tr>
            <tr>
                <td colspan="2"><input type="submit" value="登陆"></td>
            </tr>
        </table>
    </form>
</body>
</html>

----------------------------------------------------------------------------------------
//主页
<?php
#链接数据库
include 'MySqlConnect.php';
//开启回话:登陆验证
include 'stateAction.php';
//include 'stateAction.php';
if (!isset($username)) {
    //没有用户要返回登陆界面
    header("location:userLogin.php");
}
//$sql1 = "select Astate from tb_admin where Aname='$username' ";
//$result1 = $conn->query($sql1);
//$nums = mysqli_fetch_array($result1);
//if($nums[0]!=$zhuangtai) {
//    header("location:userLogin.php");
//}
$sql = "select * from tb_emp,tb_dept where tb_emp.Edeptno=tb_dept.Dno";
$result = $conn->query($sql);

echo "<table border='1' width='600' align='center'>";
echo "<caption>欢迎来到员工管理系统V1.0</caption>";
echo "<tr><th>工号</th><th>姓名</th><th>年龄</th><th>部门</th><th>操作1</th><th>操作2</th></tr>";
while ($row = mysqli_fetch_array($result)) {
    echo "<tr>";
    echo "<th>" . $row['Eno'] . "</td>";
    echo "<th>" . $row['Ename'] . "</td>";
    echo "<th>" . $row['Eage'] . "</td>";
    echo "<th>" . $row['Dname']. "</td>";
    echo "<td><a href='empModify.php?empNo=$row[Eno]'>修改</td>";
    echo "<td><a href='empDelAction.php?empNo=$row[Eno]'>删除</td>";
    echo "</tr>";
}
echo "<tr><td clospan='6'><a href='empAdd.php'>添加</a></td></tr>";
echo "</table>";
echo "<a href='userLoginOutAction.php'>退出</a>";
mysqli_free_result($result);
?>

4. 登陆功能实现

<?php
include 'MySqlConnect.php';
#登陆处理页面  获取用户名和密码
#   1-获取数据
$username = $_POST["username"];
$password = $_POST["password"];
# 开启session_start
session_start();
# 链接数据库
#$conn=new mysqli("localhost","root","root","hrsystemdb");
$sql = "select * from tb_admin where Aname='$username' and Apassword='$password' ";
$result = $conn->query($sql);
#返回结果集的数量。当返回数量>=1时,表明数据库数据至少有一条满足要求
$nums = mysqli_num_rows($result);
#   2-数据判断
if ($nums > 0) {
    $randStr=str_shuffle('ABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890');
    $rand=substr($randStr,0,6);
//    echo $rand;
    $sql2 = "update tb_admin set Astate='$rand' where Aname='$username' and Apassword='$password' ";
    $result2 = $conn->query($sql2);

//    echo ZHUANGTAI;
    header("location:empList.php?zhuangtai=$rand");
    $_SESSION["username"] = $username;
} else {
    header("location:userLogin.php");
}

#关闭数据库连接
mysqli_free_result($result);
?>

5. 单点功能实现

要是有其他页面,只要直接引入这个文件名就可以。

<?php
session_start();
$username = $_SESSION["username"];
$zhuangtai=$_GET["zhuangtai"];
$sql1 = "select Astate from tb_admin where Aname='$username' ";
$result1 = $conn->query($sql1);
$nums = mysqli_fetch_array($result1);
if($nums[0]!=$zhuangtai) {
    header("location:userLogin.php");
}
?>

6. 测试
在IE上登陆

a24c5329cdf5f0aad488321ae52271c5.png


进入主页

b8ba23481a6381c66bdd545db552eb47.png


在谷歌上登陆后,进入主页

521d9f20e3afe53996519cc553cef650.png


刷新IE浏览器后

cef93301a1edb905b1c45f6c6faad1ae.png


被挤了下来。以上就简单的实现了单点登陆的功能。

以上内容希望帮助到大家,很多PHPer在进阶的时候总会遇到一些问题和瓶颈,业务代码写多了没有方向感,不知道该从那里入手去提升,对此我整理了一些资料,包括但不限于:分布式架构、高可扩展、高性能、高并发、服务器性能调优、TP6,laravel,YII2,Redis,Swoole、Swoft、Kafka、Mysql优化、shell脚本、Docker、微服务、Nginx等多个知识点高级进阶干货需要的可以免费分享给大家,需要戳这里PHP进阶架构师>>>视频、面试文档免费获取

或 者关注我每天分享技术文章

PHP进阶编程​www.zhihu.com
e0780241bfc9df19f0115bfea7da9fae.png
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值