本文目录导读:

- 数据库设计
- 注册页面 (register.php)
- 注册处理 (register_process.php)
- 使用密码哈希(改进版)
- 完整的数据库连接类 (Database.php)
- 安全建议
- 配置文件 (config.php)
- 使用说明
我来详细介绍PHP实现用户注册功能的完整步骤:
数据库设计
首先创建用户表:
CREATE TABLE users (
id INT PRIMARY KEY AUTO_INCREMENT,
username VARCHAR(50) UNIQUE NOT NULL,
email VARCHAR(100) UNIQUE NOT NULL,
password VARCHAR(255) NOT NULL,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
);
注册页面 (register.php)
<!DOCTYPE html>
<html>
<head>用户注册</title>
<style>
.error { color: red; }
.success { color: green; }
</style>
</head>
<body>
<h2>用户注册</h2>
<?php if (isset($_GET['error'])): ?>
<div class="error"><?php echo htmlspecialchars($_GET['error']); ?></div>
<?php endif; ?>
<?php if (isset($_GET['success'])): ?>
<div class="success">注册成功!请登录。</div>
<?php endif; ?>
<form action="register_process.php" method="POST">
<div>
<label>用户名:</label>
<input type="text" name="username" required
minlength="3" maxlength="50">
</div>
<div>
<label>邮箱:</label>
<input type="email" name="email" required>
</div>
<div>
<label>密码:</label>
<input type="password" name="password" required
minlength="6">
</div>
<div>
<label>确认密码:</label>
<input type="password" name="confirm_password" required>
</div>
<button type="submit">注册</button>
</form>
<p>已有账号?<a href="login.php">登录</a></p>
</body>
</html>
注册处理 (register_process.php)
<?php
session_start();
// 数据库配置
$host = 'localhost';
$dbname = 'your_database';
$username = 'your_username';
$password = 'your_password';
try {
$pdo = new PDO("mysql:host=$host;dbname=$dbname;charset=utf8",
$username, $password);
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
} catch(PDOException $e) {
die("数据库连接失败: " . $e->getMessage());
}
// 检查是否是POST请求
if ($_SERVER["REQUEST_METHOD"] != "POST") {
header("Location: register.php");
exit();
}
// 获取并验证输入
$username = trim($_POST['username'] ?? '');
$email = trim($_POST['email'] ?? '');
$password = $_POST['password'] ?? '';
$confirm_password = $_POST['confirm_password'] ?? '';
// 输入验证
$errors = [];
// 验证用户名
if (empty($username)) {
$errors[] = "用户名不能为空";
} elseif (strlen($username) < 3 || strlen($username) > 50) {
$errors[] = "用户名长度应在3-50个字符之间";
} elseif (!preg_match('/^[a-zA-Z0-9_]+$/', $username)) {
$errors[] = "用户名只能包含字母、数字和下划线";
}
// 验证邮箱
if (empty($email)) {
$errors[] = "邮箱不能为空";
} elseif (!filter_var($email, FILTER_VALIDATE_EMAIL)) {
$errors[] = "邮箱格式不正确";
}
// 验证密码
if (empty($password)) {
$errors[] = "密码不能为空";
} elseif (strlen($password) < 6) {
$errors[] = "密码长度至少6位";
}
// 确认密码
if ($password !== $confirm_password) {
$errors[] = "两次输入的密码不一致";
}
// 如果有错误,返回注册页面
if (!empty($errors)) {
$error_message = implode("<br>", $errors);
header("Location: register.php?error=" . urlencode($error_message));
exit();
}
try {
// 检查用户名是否已存在
$stmt = $pdo->prepare("SELECT id FROM users WHERE username = ?");
$stmt->execute([$username]);
if ($stmt->fetch()) {
header("Location: register.php?error=" . urlencode("用户名已存在"));
exit();
}
// 检查邮箱是否已存在
$stmt = $pdo->prepare("SELECT id FROM users WHERE email = ?");
$stmt->execute([$email]);
if ($stmt->fetch()) {
header("Location: register.php?error=" . urlencode("邮箱已被注册"));
exit();
}
// 密码加密
$hashed_password = password_hash($password, PASSWORD_DEFAULT);
// 插入用户数据
$stmt = $pdo->prepare("INSERT INTO users (username, email, password) VALUES (?, ?, ?)");
$stmt->execute([$username, $email, $hashed_password]);
// 注册成功
header("Location: register.php?success=1");
exit();
} catch(PDOException $e) {
header("Location: register.php?error=" . urlencode("注册失败,请稍后重试"));
exit();
}
?>
使用密码哈希(改进版)
<?php
// 密码哈希函数(PHP 5.5+ 自带)
function hashPassword($password) {
// PASSWORD_DEFAULT 使用 bcrypt 算法
return password_hash($password, PASSWORD_DEFAULT, [
'cost' => 12 // 计算复杂度,默认10,建议10-12
]);
}
// 验证密码
function verifyPassword($password, $hash) {
return password_verify($password, $hash);
}
// 使用示例
$hashed = hashPassword('user_password');
if (verifyPassword('user_password', $hashed)) {
echo "密码正确";
}
?>
完整的数据库连接类 (Database.php)
<?php
class Database {
private static $instance = null;
private $pdo;
private function __construct() {
$host = 'localhost';
$dbname = 'your_database';
$username = 'your_username';
$password = 'your_password';
try {
$this->pdo = new PDO(
"mysql:host=$host;dbname=$dbname;charset=utf8mb4",
$username,
$password,
[
PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC,
PDO::ATTR_EMULATE_PREPARES => false
]
);
} catch(PDOException $e) {
die("数据库连接失败: " . $e->getMessage());
}
}
public static function getInstance() {
if (self::$instance === null) {
self::$instance = new self();
}
return self::$instance;
}
public function getConnection() {
return $this->pdo;
}
}
安全建议
<?php
// 1. 使用CSRF令牌防止跨站请求伪造
session_start();
if (empty($_SESSION['csrf_token'])) {
$_SESSION['csrf_token'] = bin2hex(random_bytes(32));
}
// 在表单中添加
echo '<input type="hidden" name="csrf_token" value="' .
$_SESSION['csrf_token'] . '">';
// 验证时
if (!hash_equals($_SESSION['csrf_token'], $_POST['csrf_token'])) {
die("CSRF token验证失败");
}
// 2. 防止SQL注入(已使用预处理语句)
// 3. XSS防护(使用htmlspecialchars输出)
// 4. 密码策略
function validatePassword($password) {
$errors = [];
if (strlen($password) < 8) {
$errors[] = "密码至少8位";
}
if (!preg_match('/[A-Z]/', $password)) {
$errors[] = "需要一个大写字母";
}
if (!preg_match('/[a-z]/', $password)) {
$errors[] = "需要一个小写字母";
}
if (!preg_match('/[0-9]/', $password)) {
$errors[] = "需要一个数字";
}
if (!preg_match('/[!@#$%^&*()\-_=+{};:,<.>]/', $password)) {
$errors[] = "需要一个特殊字符";
}
return $errors;
}
?>
配置文件 (config.php)
<?php
// config.php - 集中管理配置
define('DB_HOST', 'localhost');
define('DB_NAME', 'your_database');
define('DB_USER', 'your_username');
define('DB_PASS', 'your_password');
define('SITE_URL', 'http://localhost/your-project');
define('SITE_NAME', '我的网站');
// 密码设置
define('MIN_PASSWORD_LENGTH', 8);
define('PASSWORD_ALGO', PASSWORD_DEFAULT);
define('PASSWORD_COST', 12);
// 会话设置
ini_set('session.cookie_httponly', 1);
ini_set('session.use_only_cookies', 1);
ini_set('session.cookie_secure', 1); // 如果使用HTTPS
?>
使用说明
- 配置数据库:修改数据库连接参数
- 创建数据库表:执行SQL语句创建users表
- 放置文件:将PHP文件放在网站根目录
- 测试注册:访问register.php进行测试
这个实现包含了:
- 输入验证和清洗
- 密码哈希存储
- SQL注入防护(预处理语句)
- XSS防护
- 错误处理和用户反馈
可以根据具体需求调整验证规则和功能。