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

相关推荐
rchmin几秒前
Java内存模型(JMM)详解
java·开发语言
studytosky1 分钟前
Linux系统编程:深度解析 Linux 进程,从底层架构到内存模型
linux·运维·服务器·开发语言·架构·vim
陳10301 分钟前
C++:string(3)
开发语言·c++
Wpa.wk8 分钟前
Tomcat的安装与部署使用 - 说明版
java·开发语言·经验分享·笔记·tomcat
吧啦蹦吧13 分钟前
java.lang.Class#isAssignableFrom(Class<?> cls)
java·开发语言
都是蠢货20 分钟前
drop delete和truncate的区别?
java·开发语言
雨声不在23 分钟前
gradle编译missing_rules报错处理
android·gradle·agp8
搬砖的kk32 分钟前
Lycium++ - OpenHarmony PC C/C++ 增强编译框架
c语言·开发语言·c++
再__努力1点1 小时前
【77】积分图像:快速计算矩形区域和核心逻辑
开发语言·图像处理·人工智能·python·算法·计算机视觉
Evand J1 小时前
【2026课题推荐】基于小波/互相关/FFT的卡尔曼滤波的轨迹估计,及MATLAB例程的运行结果
开发语言·matlab·目标跟踪·轨迹跟踪