当前位置: 首页 > article >正文

基于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.kler.cn/a/568286.html

相关文章:

  • NAT 技术:网络中的 “地址魔术师”
  • Week2 Using the Java Collection Libraries Lecture 2
  • 网络协议 HTTP、HTTPS、HTTP/1.1、HTTP/2 对比分析
  • 哪些方法可以查看drupal版本
  • Python 绘制迷宫游戏,自带最优解路线
  • (学习总结26)Linux工具:make/Makefile 自动化构建、Git 版本控制器 和 gdb/cgdb 调试器
  • 机器学习中的数据预处理
  • Python Web 开发中的 FastAPI 性能瓶颈分析与优化策略
  • DeepSeek开源周 Day04:从DualPipe聊聊大模型分布式训练的并行策略
  • SQL Server查询计划操作符(7.3)——查询计划相关操作符(7)
  • 单点登录原理和JWT实现
  • C++蓝桥杯基础篇(六)
  • vim:基础配置
  • Linux--输入输出重定向、父进程与子进程的继承关系
  • 如何管理路由器
  • 金融赋能绍兴纺织 民生银行助力外贸中小微企业“走出去”
  • 新一代跨境电商ERP系统:从订单到发货的全流程自动化管理
  • windows下适用msvc编译ffmpeg 适用于ffmpeg-7.1
  • php 的 composer.phar 是干什么用的?
  • Vue3实现文件上传、下载及预览全流程详解(含完整接口调用)