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

从零搭建一个 PHP 登录注册系统(含完整源码)

一、前言

在现代 Web 开发中,用户登录注册系统几乎是每一个网站的基础功能。
无论是论坛、博客、商城还是后台管理系统,都离不开登录注册模块。

本篇文章将带你一步步使用 原生 PHP + MySQL 从零搭建一个完整的登录注册系统。
我们将实现以下功能:

✅ 用户注册
✅ 用户登录
✅ 登录验证与错误提示
✅ Session 保存登录状态
✅ 退出登录
✅ 基础安全防护(密码加密、SQL 注入防御)


二、开发环境与准备

工具版本或说明
PHP8.0+
MySQL5.7+
Web 服务器Apache 或 Nginx
开发工具VS Code / PhpStorm / XAMPP / WAMP

如果你使用 XAMPP,只需启动 Apache 与 MySQL 服务,然后将项目放到:

C:\xampp\htdocs\login_system\

通过浏览器访问:

http://localhost/login_system/

三、数据库设计

我们需要一个用户表 users,存储用户名、邮箱、密码等信息。

SQL 建表语句

CREATE DATABASE login_demo CHARACTER SET utf8mb4;USE login_demo;CREATE TABLE users (id INT AUTO_INCREMENT PRIMARY KEY,username VARCHAR(50) NOT NULL UNIQUE,email VARCHAR(100) NOT NULL,password VARCHAR(255) NOT NULL,created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);

四、项目结构目录

login_system/
│
├─ db.php           # 数据库连接
├─ register.php     # 注册页面
├─ login.php        # 登录页面
├─ welcome.php      # 登录成功页面
├─ logout.php       # 注销登录
└─ style.css        # 页面样式

五、数据库连接文件(db.php)

<?php
$servername = "localhost";
$username = "root";
$password = "";
$dbname = "login_demo";$conn = new mysqli($servername, $username, $password, $dbname);if ($conn->connect_error) {die("数据库连接失败: " . $conn->connect_error);
}
?>

六、用户注册页面(register.php)

<?php
session_start();
include("db.php");if ($_SERVER["REQUEST_METHOD"] == "POST") {$username = trim($_POST["username"]);$email = trim($_POST["email"]);$password = password_hash($_POST["password"], PASSWORD_DEFAULT);// 检查用户名是否重复$check = $conn->prepare("SELECT id FROM users WHERE username = ?");$check->bind_param("s", $username);$check->execute();$check->store_result();if ($check->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()) {$_SESSION["username"] = $username;header("Location: welcome.php");} else {$error = "注册失败,请重试!";}}
}
?><!DOCTYPE html>
<html lang="zh">
<head><meta charset="UTF-8"><title>用户注册</title><link rel="stylesheet" href="style.css">
</head>
<body><h2>注册新账号</h2><?php if (!empty($error)) echo "<p class='error'>$error</p>"; ?><form method="post">用户名:<input type="text" name="username" required><br>邮箱:<input type="email" name="email" required><br>密码:<input type="password" name="password" required><br><button type="submit">注册</button></form><p>已有账号?<a href="login.php">去登录</a></p>
</body>
</html>

七、用户登录页面(login.php)

<?php
session_start();
include("db.php");if ($_SERVER["REQUEST_METHOD"] == "POST") {$username = trim($_POST["username"]);$password = $_POST["password"];$stmt = $conn->prepare("SELECT id, password FROM users WHERE username = ?");$stmt->bind_param("s", $username);$stmt->execute();$stmt->store_result();if ($stmt->num_rows > 0) {$stmt->bind_result($id, $hashed_password);$stmt->fetch();if (password_verify($password, $hashed_password)) {$_SESSION["username"] = $username;header("Location: welcome.php");exit;} else {$error = "密码错误,请重试。";}} else {$error = "用户不存在。";}
}
?><!DOCTYPE html>
<html lang="zh">
<head><meta charset="UTF-8"><title>用户登录</title><link rel="stylesheet" href="style.css">
</head>
<body><h2>登录</h2><?php if (!empty($error)) echo "<p class='error'>$error</p>"; ?><form method="post">用户名:<input type="text" name="username" required><br>密码:<input type="password" name="password" required><br><button type="submit">登录</button></form><p>没有账号?<a href="register.php">立即注册</a></p>
</body>
</html>

八、欢迎页面(welcome.php)

<?php
session_start();
if (!isset($_SESSION["username"])) {header("Location: login.php");exit;
}
?><!DOCTYPE html>
<html lang="zh">
<head><meta charset="UTF-8"><title>欢迎</title><link rel="stylesheet" href="style.css">
</head>
<body><h2>欢迎你,<?php echo htmlspecialchars($_SESSION["username"]); ?>!</h2><a href="logout.php">退出登录</a>
</body>
</html>

九、退出登录页面(logout.php)

<?php
session_start();
session_unset();
session_destroy();
header("Location: login.php");
exit;
?>

十、简单样式文件(style.css)

body {font-family: Arial, sans-serif;background-color: #f8f8f8;text-align: center;margin-top: 100px;
}
form {display: inline-block;padding: 20px;background: white;border-radius: 10px;box-shadow: 0 0 10px #ccc;
}
input {display: block;margin: 10px auto;padding: 8px;width: 200px;
}
button {padding: 8px 16px;background-color: #007BFF;border: none;color: white;border-radius: 5px;cursor: pointer;
}
.error {color: red;
}

十一、安全优化建议

问题解决方案
明文密码存储使用 password_hash() + password_verify()
SQL 注入风险使用 prepare() 预处理语句
XSS 攻击输出使用 htmlspecialchars()
会话劫持设置 session_regenerate_id()
HTTPS部署时务必启用 HTTPS 加密传输

十二、总结

通过本篇文章,你已经掌握了:

✅ PHP 与 MySQL 的基本连接
✅ 用户注册与登录的完整逻辑
✅ 使用 Session 实现登录状态管理
✅ 密码加密与表单验证的安全措施

这只是一个基础版本,但已经能在任何小型网站中正常使用。
后续你可以进一步扩展:

  • 添加邮箱验证

  • 密码找回功能

  • 用户角色权限(admin/user)

  • 使用 Ajax 提升体验

http://www.dtcms.com/a/581248.html

相关文章:

  • Android 端离线语音控制设备管理系统:完整技术方案与实践
  • 网站流量一般多少合适asp网站实例
  • 想学网站建设与设计的书籍基于网站开发小程序
  • 【双指针类型】---LeetCode和牛客刷题记录
  • h5单页预览PDF文件模糊问题解决
  • LeetCode 每日一题 2025/11/3-2025/11/9
  • php网站开发干嘛的营销推广内容
  • STM32外设学习--TIM定时器--编码器接口
  • qiankun + Vue实现微前端服务
  • 日语学习-日语知识点小记-构建基础-JLPT-N3阶段-二阶段(15):階段の訓練
  • 学习Linux——文件管理
  • C# OpenCVSharp使用yolo11n人脸关键点检测模型进行人脸检测
  • 【ATL定时器深度解析:概念、功能与项目实战指南】
  • wp_head() wordpressseo优化软件有哪些
  • 个人网站如何制作教程电子商务网站建设重点
  • 机器学习实践项目(二)- 房价预测增强篇 - 特征工程四
  • C++20之三路比较运算符
  • 微网站方案用dw做的网站怎么上线
  • 微软解除 Win11 限制,“毛玻璃”效果将无处不在
  • 班级回忆录系统|基于SpringBoot和Vue的班级回忆录系统(源码+数据库+文档)
  • 让 ETL 更懂语义:DataWorks 支持数据集成 AI 辅助处理能力
  • 新能源汽车底盘紧固件的“防腐密码”:从技术革新到体系共创
  • 前端性能优化实战:从理论到实践的深度解析
  • 【C++:红黑树】深入理解红黑树的平衡之道:从原理、变色、旋转到完整实现代码
  • 网站怎么做翻页徐州专业网站seo
  • 《算法通关指南数据结构和算法篇(4)--- 队列和queue》
  • 云计算运维监控实战:生产环境与自建方案对比
  • 深入理解MySQL行锁,间隙锁和临键锁
  • 鸿安建设集团网站wordpress主题2019
  • 申请软著,怎么快速整理软件源代码