从零搭建一个 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)
<?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 提升体验
