PHP后台登录功能单账号登录限制

PHP后台登录功能单账号登录限制

  • 单账号登陆是什么
    • 第一步创建数据表
    • 第二步创建登录页面test2.html
    • 第三步创建登录提交test2.php
    • 第四步访问后台首页
    • 第五步演示

单账号登陆是什么

一个用户只能登录一个账号通常被称为单账号登录限制或单用户单账号限制。这意味着每个用户只能使用一个账号进行登录,并且不允许同一用户同时使用多个账号登录系统

在这里插入图片描述

第一步创建数据表

CREATE TABLE `users` (`id` int(10) unsigned NOT NULL AUTO_INCREMENT,`username` varchar(30) DEFAULT NULL COMMENT '账号',`password` varchar(30) DEFAULT NULL COMMENT '密码',`last_login` varchar(30) DEFAULT NULL COMMENT '最后登录时间',PRIMARY KEY (`id`)
) ENGINE=MyISAM AUTO_INCREMENT=2 DEFAULT CHARSET=utf8;INSERT INTO `users` VALUES ('1', 'admin', 'admin', '2023-07-20 11:39:12');

第二步创建登录页面test2.html

<!DOCTYPE html>
<html>
<head><meta charset="UTF-8"><title>登录页面</title><style>body {font-family: Arial, sans-serif;text-align: center;}h2 {margin-top: 50px;}.container {margin-top: 50px;width: 300px;margin-left: auto;margin-right: auto;}input[type="text"], input[type="password"] {width: 100%;padding: 12px 20px;margin: 8px 0;display: inline-block;border: 1px solid #ccc;box-sizing: border-box;}button {background-color: #4CAF50;color: white;padding: 14px 20px;margin: 8px 0;border: none;cursor: pointer;width: 100%;}button:hover {opacity: 0.8;}</style><script src="https://code.jquery.com/jquery-3.1.1.min.js"></script><script>$(document).ready(function() {$("form").submit(function(event) {event.preventDefault(); // 阻止表单的默认提交行为var username = $("input[name='username']").val();var password = $("input[name='password']").val();// 发送AJAX请求$.ajax({url: "test2.php", // 替换为实际的登录处理文件路径type: "POST",data: {username: username,password: password},success: function(response) {// 处理服务器返回的响应数据if (response === "success") {alert("登录成功");window.location.href = "http://localhost/index.php";// 在此处可以进行页面跳转或其他操作} else {alert("登录失败,请检查用户名和密码");}}});});});</script>
</head>
<body>
<div class="container"><h2>登录</h2><form><input type="text" placeholder="用户名" name="username" required><br><input type="password" placeholder="密码" name="password" required><br><button type="submit">登录</button></form>
</div>
</body>
</html>

第三步创建登录提交test2.php

关键点:登录时更新登录时间

<?php
// 连接数据库
$servername = "localhost"; // 数据库主机名
$username = "root"; // 数据库用户名
$password = "root"; // 数据库密码
$dbname = "aaa"; // 数据库名
// 创建数据库连接
$conn = new mysqli($servername, $username, $password, $dbname);
// 检查连接是否成功
if ($conn->connect_error) {die("连接数据库失败: " . $conn->connect_error);
}
session_start();
// 获取POST请求中的用户名和密码
$username = $_POST['username'];
$password = $_POST['password'];
// 查询用户表验证用户名和密码
$sql = "SELECT * FROM users WHERE username='$username' AND password='$password'";
$result = $conn->query($sql);if ($result->num_rows > 0) {// 验证通过,更新用户登录时间$currentTime = date('Y-m-d H:i:s'); // 获取当前时间$updateSql = "UPDATE users SET last_login='$currentTime' WHERE username='$username'";if ($conn->query($updateSql) === TRUE) {// 更新成功$sql = "SELECT * FROM users WHERE username='$username' AND password='$password'";$result = $conn->query($sql);$user=mysqli_fetch_assoc($result);$_SESSION['userInfo']=$user;echo 'success';} else {// 更新失败echo 'fail';}
} else {// 验证失败,返回失败响应echo 'fail';
}
// 关闭数据库连接
$conn->close();

第四步访问后台首页

校验时间退出登录

<?php
// 连接数据库
$servername = "localhost"; // 数据库主机名
$username = "root"; // 数据库用户名
$password = "root"; // 数据库密码
$dbname = "aaa"; // 数据库名
// 创建数据库连接
$conn = new mysqli($servername, $username, $password, $dbname);
// 检查连接是否成功
if ($conn->connect_error) {die("连接数据库失败: " . $conn->connect_error);
}
session_start();
if($_SESSION&&isset($_SESSION['userInfo']['username'])){// 获取POST请求中的用户名和密码$username = $_SESSION['userInfo']['username'];$password =$_SESSION['userInfo']['password'];
// 查询用户表验证用户名和密码$sql = "SELECT * FROM users WHERE username='$username' AND password='$password'";$result = $conn->query($sql);$user=mysqli_fetch_assoc($result);if($_SESSION['userInfo']['last_login']!=$user['last_login']){echo("已经其它地方登录");exit;}else{echo("登录成功");exit;}
}
echo("登录已超时");exit;

第五步演示

准备两个浏览器 第一浏览运行下面,然后第二个也登录如下

在这里插入图片描述

再次访问第一个浏览器,成功返回
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/5851.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Linux 学习记录53(ARM篇)

Linux 学习记录53(ARM篇) 本文目录 Linux 学习记录53(ARM篇)一、内存读写指令1. 在C语言中读取内存2. 指令码及功能3. 格式4. 使用示例5. 寻址方式(1. 前索引方式(2. 后索引方式(3. 自动索引 6.批量寄存器操作指令(1. 操作码(2. 格式(3. 使用示例(4. 地址增长方式>1 ia后缀&…

========Java基础——小结1========

一、Java 两大版本 Java 主要分为两个版本: Java SE 和Java EE。 Java SE 全称Java Platform Standard Edition&#xff0c;是 Java 的标准版&#xff0c;主要用于桌面应用程序开发&#xff0c;它包含了 Java 语言基础、JDBC (Java 数据库连接)、I/O (输入/输出)、TCP/IP 网络…

股票基金入门知识

1.开盘价和收盘价如何产生 时间9:30-11:30 13:00-15:00 集合竞价时间段&#xff1a;9:15-9:25 以此产生开盘价 最后集中竞价时间段&#xff1a;深市14:57-15:00 &#xff0c;以此产生收盘价。 沪市则采用最后一分钟加权得出收盘价影响股价的因素 市场投资情绪&#xff0c;宏观…

Hadoop——DataGrip连接MySQL|Hive

1、下载 DataGrip下载&#xff1a;DataGrip: The Cross-Platform IDE for Databases & SQL by JetBrains 2、破解 破解链接&#xff1a;https://www.cnblogs.com/xiaohuhu/p/17218430.html 3、启动环境 启动Hadoop&#xff1a;到Hadoop的sbin目录下右键管理员身份运行…

【C++】list 模拟笔记

文章目录 list定义结点类&#xff08;list_node&#xff09;为什么封装迭代器为类 &#xff1f;库里面模板多参数的由来 &#xff1f;为什么普通迭代器不能隐式类型转换成const迭代器&#xff1f;迭代器位置指向及其返回值和整体代码 list list 和前面学习的 string 和 vector …

微信小程序使用ECharts的示例详解

目录 安装 ECharts 组件使用 ECharts 组件图表延迟加载 echarts-for-weixin 是 ECharts 官方维护的一个开源项目&#xff0c;提供了一个微信小程序组件&#xff08;Component&#xff09;&#xff0c;我们可以通过这个组件在微信小程序中使用 ECharts 绘制图表。 echarts-fo…

excel中单行换成多行

今天碰以下情况&#xff1a; 这在excel表中是在一个单元格&#xff0c;现在需要对其进行转换&#xff0c;将一个单元格换成多行 步骤&#xff1a; 1.删除换行符&#xff0c;添加一个逗号 2.选择数据-分列-分隔字符-逗号-确定 3.复制上述数据&#xff0c;选择性粘贴-转置 完…

2816. 判断子序列

题目链接&#xff1a; 自己的做法&#xff1a; #include <bits/stdc.h>using namespace std;const int N 1e5 10; int a[N], b[N]; int main() {int n, m;bool flag true;scanf("%d%d", &n, &m);for (int i 0; i < n; i) scanf("%d"…

哈希:探索快速的数据存储和搜索方法

哈希&#xff1a;探索快速的数据存储和搜索方法 哈希表作为一种高效的数据存储结构&#xff0c;可以使数据的存储位置与关键码之间建立一一映射的关系&#xff0c;从而加快元素的搜索速度。然而&#xff0c;哈希方法也面临着哈希冲突的问题&#xff0c;即不同的关键字通过相同…

dxf怎么转换成PDF格式?转换方法其实很简单

PDF文件是一种可靠的文件格式&#xff0c;可以在各种操作系统和软件上打开和查看。而dxf是CAD文件的一种格式&#xff0c;打开它一般都是需要相关的操作软件才能打开&#xff0c;不是特别方便&#xff0c;将dxf文件转换成PDF格式就可以很好的解决这一问题&#xff0c;下面教大家…

Kafka - Primie Number of Partitions Issue Consumer Group Rebalance

文章目录 生产者&#xff1a;将数据写入 Kafka 的客户端。 消费者&#xff1a;从 Kafka 中读取数据的客户端。 Topic&#xff1a;Kafka 中用于组织和存储数据的逻辑概念&#xff0c;类似于数据库表。 Record&#xff1a;发送到 Topic 的消息称为 Record。 Partition&#x…

List有值二次转换给其他对象报null

List<PlatformUsersData> listData platformUsersMapper.selectPlatformUserDataById(data); users.setPlatformUsersData(listData);为什么listData 有值&#xff0c;users.getPlatformUsersData&#xff08;&#xff09;仍然为空在这段代码中&#xff0c;我们假设listD…

NLP(六十)Baichuan-13B-Chat模型使用体验

2023年7月11日&#xff0c;百川智能正式发布参数量130亿的通用大语言模型Baichuan-13B-Base、对话模型Baichuan-13B-Chat及其INT4/INT8两个量化版本。   本文将介绍大模型BaiChuan-13B-Chat的使用体验&#xff0c;其HuggingFace网址为&#xff1a;https://huggingface.co/bai…

【团队协作开发】IDEA中Git新建自己的dev工作分支,合并到master主分支教程(极其简单,新手)

文章目录 一、创建新dev工作分支二、push到自己的远程dev工作分支三、工作分支合并到master主分支1、先切换到master主分支2、将远程工作dev分支的内容merge到当前master分支中3、将merge提交到远程master分支 一、创建新dev工作分支 创建完新dev分支以后将默认切换到新dev分支…

FFmpeg5.0源码阅读—— avcodec_send_frame avcodec_receive_packet

摘要&#xff1a;本文主要描述了FFmpeg中用于编码的接口的具体调用流程&#xff0c;详细描述了该接口被调用时所作的具体工作。   关键字&#xff1a;ffmpeg、avcodec_send_frame、avcodec_receive_packet   读者须知&#xff1a;读者需要了解FFmpeg的基本使用流程&#xf…

如何理解自动化

目录 1.如何定义自动化 2.自动化给人类带来的福利 3.如何学习自动化 4.自动化潜在的危害 1.如何定义自动化 自动化是指利用计算机、机械、电子技术和控制系统等现代科学技术手段&#xff0c;对各种工业、商业、农业和日常生活中的操作和过程进行自动控制和执行的过程。它旨在…

Vc - Qt - 自定义ComboBox

示例代码创建了一个名为ComboBoxWidget的自定义QWidget类&#xff0c;并在initUI方法中创建了一个垂直布局。然后将一个只读的QLineEdit和一个QPushButton添加到布局中。当按钮被点击时&#xff0c;会调用showMenu方法&#xff0c;该方法创建一个QMenu并添加选项。每个选项连接…

CodeForces:Madoka and Underground Competitions

经过观察&#xff0c;发现只要延小区域 右上-左下 的对角线填满X即可&#xff0c;那么就是可以总结为满足(i j) % k (r c) % k #include <bits/stdc.h> using namespace std; int t; void solve(){int n, k, r, c;cin >> n >> k >> r >> c…

什么是搜索引擎?2023 年搜索引擎如何运作?

目录 什么是搜索引擎&#xff1f;搜索引擎的原理什么是搜索引擎爬取&#xff1f;什么是搜索引擎索引&#xff1f;什么是搜索引擎检索?什么是搜索引擎排序&#xff1f; 搜索引擎的目的是什么&#xff1f;搜索引擎如何赚钱&#xff1f;搜索引擎如何建立索引?网页抓取文本处理建…

【C++基础(五)】类和对象(上)

&#x1f493;博主CSDN主页:杭电码农-NEO&#x1f493;   ⏩专栏分类:C初阶之路⏪   &#x1f69a;代码仓库:NEO的学习日记&#x1f69a;   &#x1f339;关注我&#x1faf5;带你学习C   &#x1f51d;&#x1f51d; 类和对象-上 1. 前言2. 类的引入3. 类的定义4. 类的…