从零搭建一个 PHP 登录注册系统(含完整源码)
一、前言
在现代 Web 开发中,用户登录注册系统 几乎是每一个网站的基础功能。
无论是论坛、博客、商城还是后台管理系统,都离不开登录注册模块。
本篇文章将带你一步步使用 原生 PHP + MySQL 从零搭建一个完整的登录注册系统。
我们将实现以下功能:
✅ 用户注册
✅ 用户登录
✅ 登录验证与错误提示
✅ Session 保存登录状态
✅ 退出登录
✅ 基础安全防护(密码加密、SQL 注入防御)
二、开发环境与准备
工具
版本或说明
PHP
8.0+
MySQL
5.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)
复制代码
$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)
复制代码
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 = "注册失败,请重试!";
}
}
}
?>
注册新账号
$error
"; ?>已有账号?去登录
七、用户登录页面(login.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 = "用户不存在。";
}
}
?>
登录
$error
"; ?>没有账号?立即注册
八、欢迎页面(welcome.php)
复制代码
session_start();
if (!isset($_SESSION["username"])) {
header("Location: login.php");
exit;
}
?>
欢迎你,!
九、退出登录页面(logout.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 提升体验