基于PHP和MySQL的用户登录注册系统实现

 

系统架构

系统采用前后端分离的架构,使用PHP作为后端语言,MySQL作为数据库。以下是系统的整体架构图:

这个架构图展示了系统的三个主要层次:

  1. 前端界面层:包含用户交互的三个页面(注册、登录和欢迎页面)
  2. 后端服务层:处理用户请求的PHP处理器和管理用户会话的组件
  3. 数据库层:使用MySQL存储用户信息

当用户进行注册或登录操作时,数据会从前端界面传递到PHP处理器,经过验证后存储到MySQL数据库中。会话管理确保用户登录状态的维护,成功登录后显示欢迎页面。

数据库设计

首先,我们需要创建一个存储用户信息的数据库表。以下是表结构:

CREATE TABLE users (id INT PRIMARY KEY AUTO_INCREMENT,username VARCHAR(50) NOT NULL,email VARCHAR(100) NOT NULL,password VARCHAR(255) NOT NULL,UNIQUE KEY (email)
);

后端实现

  1. 数据库连接文件(db.php):
<?php
$servername = "localhost";
$username = "root";
$password = "";
$dbname = "user_system";// 创建连接
$conn = new mysqli($servername, $username, $password, $dbname);// 检查连接
if ($conn->connect_error) {die("连接失败: " . $conn->connect_error);
}
?>
  1. 注册页面(register.php):
<?php
session_start();
include 'db.php';if ($_SERVER["REQUEST_METHOD"] == "POST") {$username = $_POST['username'];$email = $_POST['email'];$password = $_POST['password'];// 检查邮箱是否已存在$stmt = $conn->prepare("SELECT email FROM users WHERE email = ?");$stmt->bind_param("s", $email);$stmt->execute();$stmt->store_result();if ($stmt->num_rows > 0) {$error = "该邮箱已被使用";} else {// 插入新用户$stmt = $conn->prepare("INSERT INTO users (username, email, password) VALUES (?, ?, ?)");$stmt->bind_param("sss", $username, $email, $password);if ($stmt->execute()) {header("Location: login.php");exit();} else {$error = "注册失败,请重试";}}$stmt->close();
}
?>
  1. 登录页面(login.php):
<?php
session_start();
include 'db.php';if ($_SERVER["REQUEST_METHOD"] == "POST") {$email = $_POST['email'];$password = $_POST['password'];$stmt = $conn->prepare("SELECT id, username FROM users WHERE email = ? AND password = ?");$stmt->bind_param("ss", $email, $password);$stmt->execute();$result = $stmt->get_result();if ($result->num_rows == 1) {$user = $result->fetch_assoc();$_SESSION['user_id'] = $user['id'];$_SESSION['username'] = $user['username'];header("Location: welcome.php");exit();} else {$error = "邮箱或密码错误";}$stmt->close();
}
?>
  1. 欢迎页面(welcome.php):
<?php
session_start();
include 'db.php';if (!isset($_SESSION['user_id'])) {header("Location: login.php");exit();
}$username = $_SESSION['username'];
?>

HTML界面

  1. 注册页面HTML:
<!DOCTYPE html>
<html>
<head><title>用户注册</title><style>.container {width: 300px;margin: 50px auto;padding: 20px;border: 1px solid #ccc;}.error {color: red;margin-bottom: 10px;}</style>
</head>
<body><div class="container"><h2>用户注册</h2><?php if(isset($error)): ?><div class="error"><?php echo $error; ?></div><?php endif; ?><form action="" method="post"><div><label>用户名:</label><input type="text" name="username" required></div><div><label>邮箱:</label><input type="email" name="email" required></div><div><label>密码:</label><input type="password" name="password" required></div><button type="submit">注册</button></form><p>已有账号?<a href="login.php">登录</a></p></div>
</body>
</html>
  1. 登录页面HTML:
<!DOCTYPE html>
<html>
<head><title>用户登录</title><style>.container {width: 300px;margin: 50px auto;padding: 20px;border: 1px solid #ccc;}.error {color: red;margin-bottom: 10px;}</style>
</head>
<body><div class="container"><h2>用户登录</h2><?php if(isset($error)): ?><div class="error"><?php echo $error; ?></div><?php endif; ?><form action="" method="post"><div><label>邮箱:</label><input type="email" name="email" required></div><div><label>密码:</label><input type="password" name="password" required></div><button type="submit">登录</button></form><p>没有账号?<a href="register.php">注册</a></p></div>
</body>
</html>
  1. 欢迎页面HTML:
<!DOCTYPE html>
<html>
<head><title>欢迎页面</title>
</head>
<body><div style="text-align: center; margin-top: 50px;"><h2>欢迎您,<?php echo htmlspecialchars($username); ?>!</h2><p><a href="logout.php">退出登录</a></p></div>
</body>
</html>

安全考虑

1.密码安全:

  • 在生产环境中,应该使用password_hash()password_verify()处理密码
  • 永远不要以明文存储密码

2.SQL注入防护:

  • 使用预备语句(prepared statements)防止SQL注入
  • 所有用户输入都要经过验证和过滤

3.会话安全:

  • 使用session_regenerate_id()防止会话固定攻击
  • 设置适当的会话超时时间

4.XSS防护:

  • 使用htmlspecialchars()输出用户数据
  • 设置适当的Content-Security-Policy

部署步骤

  1. 安装MySQL数据库
  2. 创建数据库和表结构
  3. 配置PHP环境
  4. 上传所有PHP文件到服务器
  5. 修改db.php中的数据库连接配置
  6. 测试所有功能

 

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

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

相关文章

脚本无法获取响应主体(原因:CORS Missing Allow Credentials)

背景&#xff1a; 前端的端口号8080&#xff0c;后端8000。需在前端向后端传一个参数&#xff0c;让后端访问数据库去检测此参数是否出现过。涉及跨域请求&#xff0c;一直有这个bug是404文件找不到。 在修改过程当中不小心删除了一段代码&#xff0c;出现了这个bug&#xff0…

【计网】计算机网络概述

第一章 计算机网络概述 1.2 因特网概述1.2.1 网络、互联网和因特网1.2.2 因特网发展的三个阶段1.2.3 因特网的标准化工作1.2.4 因特网的组成 1.3 三种交换方式1.3.1 电路交换1.3.2 分组交换1.3.3 报文交换1.3.4 三种交换的对比 1.4 计网的定义与分类1.4.1 定义1.4.2 分类 1.5 计…

前端依赖nrm镜像管理工具

npm 默认镜像 &#xff1a;https://registry.npmjs.org/ 1、安装 nrm npm install nrm --global2、查看镜像源列表 nrm ls3、测试当前环境下&#xff0c;哪个镜像源速度最快。 nrm test4、 切换镜像源 npm config get registry # 查看当前镜像源 nrm use taobao # 等价于 npm…

LinkedList与链表

目录 1、链表 2、实现自己的链表 (不带头结点) 2.1、遍历链表 2.2、求链表长度 2.3、判断链表是否包含关键字 2.4、插入节点 2.5、任意位置插入一个节点 2.6、删除一个节点 2.7、删除所有值为key的节点 2.8、清空所有节点 1、链表 链表是一种物理结构上不连续的存储结…

StableDiffusion打包 项目迁移 项目分发 1

文章目录 SD项目迁移前置知识webui-user.batwebui.batlaunch_utils.py 下一篇开始实践 SD项目迁移 显卡驱动更新&#xff1a;https://www.nvidia.cn/geforce/drivers/ 下载安装三个程序&#xff1a; python3.10.6: https://www.python.org/downloads/release/python-3106/gi…

架构案例:从初创互联网公司到分布式存储与反应式编程框架的架构设计

文章目录 引言一、初创互联网公司架构演化案例1. 万级日订单级别架构2. 十万级日订单级别架构3. 百万级日订单级别架构 二、分布式存储系统 Doris 架构案例三、反应式编程框架架构案例总结 引言 分布式架构 今天我们将探讨三种不同类型的架构案例&#xff0c;分别探讨 一个初…

Xshell客户端免费版无需注册Linux连接客户端8.0详细安装教程(2025年最全最详细的图文教程)附安装包

目录 关联链接 前言 一、下载安装程序 二、安装Xshell客户端 1.启动安装 2.下一步 3.许可协议 4.安装目录 5.开始安装 6.安装完成 7.免费许可 8.大功告成&#xff01; 关联链接 Xftp免费客户端安装教程&#xff1a;https://blog.csdn.net/xiaoguo1001/article/detai…

electron多进程通信

进程间通信 | Electron 进程间通信 (IPC) 是在 Electron 中构建功能丰富的桌面应用程序的关键部分之一。 由于主进程和渲染器进程在 Electron 的进程模型具有不同的职责&#xff0c;因此 IPC 是执行许多常见任务的唯一方法&#xff0c;例如从 UI 调用原生 API 或从原生菜单触发…

登录日志管理:通用分页和排序封装、 查询登录日志列表、删除登录日志、清空登录日志、解锁用户登录状态(解锁密码错误次数超限)

文章目录 引言I 登录日志管理接口列表II 通用分页和排序封装Java 分页和排序封装vue前端排序页面III 工具类字段名转换 : 驼峰转下划线命名引言 I 登录日志管理 接口列表 import request from @/utils/request// 查询登录日志列表 export function list(query) {return

基于MATLAB红外弱小目标检测MPCM算法复现

摘要&#xff1a;本文详细介绍了一种基于人类视觉系统特性的红外弱小目标检测算法——Multiscale patch-based contrast measure (MPCM)。该算法通过增强目标与背景的对比度&#xff0c;有效检测红外图像中的弱小目标&#xff0c;并在MATLAB环境中进行了复现与实验验证。 关键…

Flutter系列教程之(8)——CheckBox多选框及动态更改多选框

目录 1.星级组件使用 2.多选框使用及数据更改 3.完整源码 最近项目需求需要调整页面,记录一下实现过程 这次主要是要实现个评价页面,选择不同的星级显示不同的多选框数据,加上之前也没有使用过CheckBox,今天便是一起讲吧 1.星级组件使用 首先,我们有使用到星级评分组件 在p…

神经网络|(十一)|神经元和神经网络

【1】引言 前序已经了解了基本的神经元知识&#xff0c;相关文章链接为&#xff1a; 神经网络|(一)加权平均法&#xff0c;感知机和神经元-CSDN博客 神经网络|(二)sigmoid神经元函数_sigmoid函数绘制-CSDN博客 神经网络|(三)线性回归基础知识-CSDN博客 把不同的神经元通过…

微软Office 2016-2024 x86直装版 v16.0.18324 32位

微软 Office 是一款由微软公司开发的办公软件套装&#xff0c;能满足各种办公需求。包含 Word、Excel、PowerPoint、Outlook 和 OneNote 等软件。Word 有强大文档编辑功能和多人协作&#xff1b;Excel 可处理分析大量数据及支持宏编程&#xff1b;PowerPoint 用于制作演示文稿且…

Python从0到100(八十九):Resnet、LSTM、Shufflenet、CNN四种网络分析及对比

前言&#xff1a; 零基础学Python&#xff1a;Python从0到100最新最全教程。 想做这件事情很久了&#xff0c;这次我更新了自己所写过的所有博客&#xff0c;汇集成了Python从0到100&#xff0c;共一百节课&#xff0c;帮助大家一个月时间里从零基础到学习Python基础语法、Pyth…

TinyEngine v2.2版本发布:支持页面嵌套路由,提升多层级路由管理能力开发分支调整

2025年春节假期已过&#xff0c;大家都带着慢慢的活力回到了工作岗位。为了让大家在新的一年继续感受到 Tiny Engine 的成长与变化&#xff0c;我们很高兴地宣布&#xff1a;TinyEngine v2.2版本正式发布&#xff01;本次更新带来了重要的功能增强------页面支持嵌套路由&#…

线程(Thread)

一、概念 线程&#xff1a;线程是一个轻量级的进程 二、线程的创建 1、线程的空间 &#xff08;1&#xff09;进程的空间包括&#xff1a;系统数据段、数据段、文本段 &#xff08;2&#xff09; 线程位于进程空间内部 &#xff08;3&#xff09; 栈区独享、与进程共享文本段、…

【含文档+PPT+源码】基于微信小程序的校园志愿者管理系统的设计与实现

项目介绍 本课程演示的是一款 基于微信小程序的校园志愿者管理系统的设计与实现&#xff0c;主要针对计算机相关专业的正在做毕设的学生与需要项目实战练习的 Java 学习者。 1.包含&#xff1a;项目源码、项目文档、数据库脚本、软件工具等所有资料 2.带你从零开始部署运行本…

yolov8,yolo11,yolo12 服务器训练到部署全流程 笔记

正在进行中&#xff0c;随时更新 一. Anaconda配置 1.安装anaconda (1)下载.sh文件 Index of /anaconda/archive/ | 清华大学开源软件镜像站 | Tsinghua Open Source Mirror (2)scp到服务器后&#xff0c;运行安装包 bash Anaconda3-2020.07-Linux-x86_64.sh (3)安装anacond…

CentOS vs Ubuntu - 常用命令深度对比及最佳实践指南20250302

CentOS vs Ubuntu - 常用命令深度对比及最佳实践指南 引言 在 Linux 服务器操作系统领域&#xff0c;CentOS 和 Ubuntu 是广泛采用的发行版。它们在命令集、默认工具链及生态系统方面各有特点。本文深入剖析 CentOS 与 Ubuntu 在常用命令层面的异同&#xff0c;并结合实践案例…

Java并发编程之可见性、原子性和有序性

引言 CPU缓存与内存产生的一致性问题(可见性) CPU时间片切换产生的原子性问题 CPU指令编译优化产生的有序性问题 并发编程问题的根源 CPU、内存、I/O设备三者速度差异一直是 核心矛盾 三者速度差异可形象描述为:天上一天(CPU),地上一年(内存),地下十年(I/O) 根据木桶理…