基于PHP和MySQL的用户登录注册系统实现
系统架构
系统采用前后端分离的架构,使用PHP作为后端语言,MySQL作为数据库。以下是系统的整体架构图:
这个架构图展示了系统的三个主要层次:
- 前端界面层:包含用户交互的三个页面(注册、登录和欢迎页面)
- 后端服务层:处理用户请求的PHP处理器和管理用户会话的组件
- 数据库层:使用MySQL存储用户信息
当用户进行注册或登录操作时,数据会从前端界面传递到PHP处理器,经过验证后存储到MySQL数据库中。会话管理确保用户登录状态的维护,成功登录后显示欢迎页面。
数据库设计
首先,我们需要创建一个存储用户信息的数据库表。以下是表结构:
CREATE TABLE users (
id INT PRIMARY KEY AUTO_INCREMENT,
username VARCHAR(50) NOT NULL,
email VARCHAR(100) NOT NULL,
password VARCHAR(255) NOT NULL,
UNIQUE KEY (email)
);
后端实现
- 数据库连接文件(
db.php
):
<?php
$servername = "localhost";
$username = "root";
$password = "";
$dbname = "user_system";
// 创建连接
$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 = $_POST['username'];
$email = $_POST['email'];
$password = $_POST['password'];
// 检查邮箱是否已存在
$stmt = $conn->prepare("SELECT email FROM users WHERE email = ?");
$stmt->bind_param("s", $email);
$stmt->execute();
$stmt->store_result();
if ($stmt->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()) {
header("Location: login.php");
exit();
} else {
$error = "注册失败,请重试";
}
}
$stmt->close();
}
?>
- 登录页面(
login.php
):
<?php
session_start();
include 'db.php';
if ($_SERVER["REQUEST_METHOD"] == "POST") {
$email = $_POST['email'];
$password = $_POST['password'];
$stmt = $conn->prepare("SELECT id, username FROM users WHERE email = ? AND password = ?");
$stmt->bind_param("ss", $email, $password);
$stmt->execute();
$result = $stmt->get_result();
if ($result->num_rows == 1) {
$user = $result->fetch_assoc();
$_SESSION['user_id'] = $user['id'];
$_SESSION['username'] = $user['username'];
header("Location: welcome.php");
exit();
} else {
$error = "邮箱或密码错误";
}
$stmt->close();
}
?>
- 欢迎页面(
welcome.php
):
<?php
session_start();
include 'db.php';
if (!isset($_SESSION['user_id'])) {
header("Location: login.php");
exit();
}
$username = $_SESSION['username'];
?>
HTML界面
- 注册页面HTML:
<!DOCTYPE html>
<html>
<head>
<title>用户注册</title>
<style>
.container {
width: 300px;
margin: 50px auto;
padding: 20px;
border: 1px solid #ccc;
}
.error {
color: red;
margin-bottom: 10px;
}
</style>
</head>
<body>
<div class="container">
<h2>用户注册</h2>
<?php if(isset($error)): ?>
<div class="error"><?php echo $error; ?></div>
<?php endif; ?>
<form action="" method="post">
<div>
<label>用户名:</label>
<input type="text" name="username" required>
</div>
<div>
<label>邮箱:</label>
<input type="email" name="email" required>
</div>
<div>
<label>密码:</label>
<input type="password" name="password" required>
</div>
<button type="submit">注册</button>
</form>
<p>已有账号?<a href="login.php">登录</a></p>
</div>
</body>
</html>
- 登录页面HTML:
<!DOCTYPE html>
<html>
<head>
<title>用户登录</title>
<style>
.container {
width: 300px;
margin: 50px auto;
padding: 20px;
border: 1px solid #ccc;
}
.error {
color: red;
margin-bottom: 10px;
}
</style>
</head>
<body>
<div class="container">
<h2>用户登录</h2>
<?php if(isset($error)): ?>
<div class="error"><?php echo $error; ?></div>
<?php endif; ?>
<form action="" method="post">
<div>
<label>邮箱:</label>
<input type="email" name="email" required>
</div>
<div>
<label>密码:</label>
<input type="password" name="password" required>
</div>
<button type="submit">登录</button>
</form>
<p>没有账号?<a href="register.php">注册</a></p>
</div>
</body>
</html>
- 欢迎页面HTML:
<!DOCTYPE html>
<html>
<head>
<title>欢迎页面</title>
</head>
<body>
<div style="text-align: center; margin-top: 50px;">
<h2>欢迎您,<?php echo htmlspecialchars($username); ?>!</h2>
<p><a href="logout.php">退出登录</a></p>
</div>
</body>
</html>
安全考虑
1.密码安全:
- 在生产环境中,应该使用
password_hash()
和password_verify()
处理密码 - 永远不要以明文存储密码
2.SQL注入防护:
- 使用预备语句(prepared statements)防止SQL注入
- 所有用户输入都要经过验证和过滤
3.会话安全:
- 使用
session_regenerate_id()
防止会话固定攻击 - 设置适当的会话超时时间
4.XSS防护:
- 使用
htmlspecialchars()
输出用户数据 - 设置适当的Content-Security-Policy
部署步骤
- 安装MySQL数据库
- 创建数据库和表结构
- 配置PHP环境
- 上传所有PHP文件到服务器
- 修改
db.php
中的数据库连接配置 - 测试所有功能