PHP如何制作登录系统:从基础到实践的完整指南
登录系统是Web应用中最基础也最核心的功能之一,它不仅关系到用户身份的识别,更直接影响数据安全,本文将以PHP为核心,从环境准备、数据库设计到前端交互、安全防护,手把手教你搭建一个功能完善、安全可靠的登录系统。
环境准备:搭建PHP开发环境
在开始之前,确保你的开发环境满足以下条件:
- Web服务器:推荐使用Apache(集成于XAMPP、WAMP等环境)或Nginx。
- PHP环境:建议使用PHP 7.4或更高版本(支持更安全的密码哈希算法)。
- 数据库:MySQL 5.7+或MariaDB(用于存储用户信息)。
- 开发工具:VS Code、Sublime Text等代码编辑器,或phpMyAdmin管理数据库。
初学者推荐使用XAMPP(Windows/Mac/Linux)或LAMP(Linux)一键集成环境,安装后启动Apache和MySQL服务即可。
数据库设计:创建用户表
登录系统的核心是存储用户信息,我们需要设计一个users表来保存用户名和密码(及其他扩展信息),通过phpMyAdmin或命令行创建数据库和表:
CREATE DATABASE `user_db` DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; USE `user_db`; CREATE TABLE `users` ( `id` int(11) NOT NULL AUTO_INCREMENT, `username` varchar(50) NOT NULL COMMENT '用户名', `password` varchar(255) NOT NULL COMMENT '密码(哈希存储)', `email` varchar(100) DEFAULT NULL COMMENT '邮箱', `created_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', `updated_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', PRIMARY KEY (`id`), UNIQUE KEY `username` (`username`), UNIQUE KEY `email` (`email`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='用户表';
关键设计说明:
password字段长度设为255(因为PHP的password_hash()生成的哈希值较长);- 用户名和邮箱设置唯一索引,避免重复注册;
- 时间戳字段记录用户创建和更新时间,便于后续管理。
用户注册功能实现
用户注册是登录系统的前置功能,核心是将用户提交的信息(用户名、密码、邮箱等)存入数据库,密码必须加密存储(绝不能明文存储!)。
注册页面(register.php)
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">用户注册</title>
<style>
body { font-family: Arial, sans-serif; max-width: 400px; margin: 50px auto; }
input, button { width: 100%; padding: 10px; margin: 5px 0; border: 1px solid #ddd; border-radius: 4px; }
button { background: #007bff; color: white; border: none; cursor: pointer; }
.error { color: red; font-size: 14px; margin-top: 5px; }
</style>
</head>
<body>
<h2>用户注册</h2>
<form action="register_process.php" method="POST">
<input type="text" name="username" placeholder="用户名" required>
<input type="email" name="email" placeholder="邮箱" required>
<input type="password" name="password" placeholder="密码" required minlength="6">
<input type="password" name="confirm_password" placeholder="确认密码" required minlength="6">
<button type="submit">注册</button>
</form>
</body>
</html>
注册处理逻辑(register_process.php)
<?php
// 1. 连接数据库
$host = 'localhost';
$dbname = 'user_db';
$username = 'root'; // 数据库用户名
$password = ''; // 数据库密码
try {
$pdo = new PDO("mysql:host=$host;dbname=$dbname;charset=utf8mb4", $username, $password);
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
} catch (PDOException $e) {
die("数据库连接失败: " . $e->getMessage());
}
// 2. 获取表单数据
$username = $_POST['username'] ?? '';
$email = $_POST['email'] ?? '';
$password = $_POST['password'] ?? '';
$confirm_password = $_POST['confirm_password'] ?? '';
// 3. 数据验证
if (empty($username) || empty($email) || empty($password)) {
die("所有字段均为必填项!");
}
if ($password !== $confirm_password) {
die("两次输入的密码不一致!");
}
if (strlen($password) < 6) {
die("密码长度至少为6位!");
}
// 4. 检查用户名/邮箱是否已存在
$stmt = $pdo->prepare("SELECT id FROM users WHERE username = ? OR email = ?");
$stmt->execute([$username, $email]);
if ($stmt->fetch()) {
die("用户名或邮箱已存在!");
}
// 5. 密码哈希加密(使用PHP内置的password_hash)
$hashed_password = password_hash($password, PASSWORD_DEFAULT);
// 6. 插入数据库
$stmt = $pdo->prepare("INSERT INTO users (username, email, password) VALUES (?, ?, ?)");
$stmt->execute([$username, $email, $hashed_password]);
echo "注册成功!<a href='login.php'>前往登录</a>";
?>
关键安全点:
- 使用
PDO预处理语句防止SQL注入; - 密码通过
password_hash()加密(推荐PASSWORD_DEFAULT算法,自动适应PHP版本升级); - 前端和后端均需验证数据(前端体验优化,后端安全兜底)。
用户登录功能实现
登录功能的核心是验证用户提交的用户名和密码是否与数据库中的记录匹配,成功后通过会话(Session)保持用户登录状态。
登录页面(login.php)
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">用户登录</title>
<style>
body { font-family: Arial, sans-serif; max-width: 400px; margin: 50px auto; }
input, button { width: 100%; padding: 10px; margin: 5px 0; border: 1px solid #ddd; border-radius: 4px; }
button { background: #28a745; color: white; border: none; cursor: pointer; }
.error { color: red; font-size: 14px; margin-top: 5px; }
</style>
</head>
<body>
<h2>用户登录</h2>
<form action="login_process.php" method="POST">
<input type="text" name="username" placeholder="用户名" required>
<input type="password" name="password" placeholder="密码" required>
<button type="submit">登录</button>
</form>
<p>还没有账号?<a href="register.php">立即注册</a></p>
</body>
</html>
登录处理逻辑(login_process.php)
<?php
// 开启会话(必须在任何输出之前调用)
session_start();
// 1. 连接数据库(同register_process.php)
$host = 'localhost';
$dbname = 'user_db';
$username = 'root';
$password = '';
try {
$pdo = new PDO("mysql:host=$host;dbname=$dbname;charset=utf8mb4", $username, $password);
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
} catch (PDOException $e) {
die("数据库连接失败: " . $e->getMessage());
}
// 2. 获取表单数据
$username = $_POST['username'] ?? '';
$password = $_POST['password'] ?? '';
// 3. 数据验证
if (empty($username) || empty($password)) {
die("用户名和密码不能为空!");
}
// 4. 查询用户(使用预处理语句防止SQL注入)
$stmt = $pdo->prepare("SELECT id, username, password FROM users WHERE username = ?");
$stmt->execute([$username]);
$user = $stmt->fetch();
// 5. 验证用户是否存在及密码是否正确
if (!$user || !password_verify($password, $user['password'])) {
die("用户名或密码错误!");
}
// 6. 登录成功,保存会话信息
$_SESSION['user_id'] = $user['id'];
$_SESSION['username'] = $user['username'];
$_SESSION['login_time'] = time(); // 记录登录时间,可用于“记住我”功能
// 7. 跳转到


还没有评论,来说两句吧...