基于PHP的图书管理系统:从数据库到用户认证的全流程实现

作者:渣渣辉2025.11.04 20:01浏览量:0

简介:本文详细介绍了基于PHP的简单图书管理系统的开发过程,涵盖用户认证(登录、注册、退出)、MySQL数据库操作(增删改查)及Session管理,适合初学者和开发者参考。

系统架构与开发准备

1. 环境搭建与工具选择

开发基于PHP的图书管理系统需准备以下环境:

  • Web服务器:Apache或Nginx(推荐XAMPP/WAMP集成环境)
  • PHP版本:7.4+(支持现代语法与安全特性)
  • 数据库:MySQL 5.7+(社区版免费且稳定)
  • 开发工具:VS Code(代码编辑)、Postman(API测试)、MySQL Workbench(数据库设计)

2. 数据库设计(MySQL)

系统核心表结构如下:

  1. -- 用户表
  2. CREATE TABLE users (
  3. id INT AUTO_INCREMENT PRIMARY KEY,
  4. username VARCHAR(50) NOT NULL UNIQUE,
  5. password VARCHAR(255) NOT NULL, -- 存储加密后的密码
  6. created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
  7. );
  8. -- 图书表
  9. CREATE TABLE books (
  10. id INT AUTO_INCREMENT PRIMARY KEY,
  11. title VARCHAR(100) NOT NULL,
  12. author VARCHAR(50) NOT NULL,
  13. isbn VARCHAR(20) UNIQUE,
  14. status TINYINT DEFAULT 1 -- 1:可借 0:已借出
  15. );

设计要点

  • 使用UNIQUE约束避免重复数据
  • 密码字段存储加密值(如password_hash()结果)
  • 添加时间戳字段便于审计

用户认证模块实现

1. 注册功能

  1. // register.php
  2. if ($_SERVER['REQUEST_METHOD'] === 'POST') {
  3. $username = trim($_POST['username']);
  4. $password = $_POST['password'];
  5. // 验证输入
  6. if (empty($username) || empty($password)) {
  7. die("用户名和密码不能为空");
  8. }
  9. // 密码加密(推荐使用password_hash)
  10. $hashedPassword = password_hash($password, PASSWORD_DEFAULT);
  11. try {
  12. $pdo = new PDO("mysql:host=localhost;dbname=library", "root", "");
  13. $stmt = $pdo->prepare("INSERT INTO users (username, password) VALUES (?, ?)");
  14. $stmt->execute([$username, $hashedPassword]);
  15. header("Location: login.php?register=success");
  16. } catch (PDOException $e) {
  17. if ($e->getCode() == 23000) { // 唯一约束冲突
  18. die("用户名已存在");
  19. }
  20. die("数据库错误: " . $e->getMessage());
  21. }
  22. }

安全建议

  • 使用预处理语句防止SQL注入
  • 密码哈希必须使用password_hash()
  • 添加CSRF令牌保护

2. 登录与Session管理

  1. // login.php
  2. session_start();
  3. if ($_SERVER['REQUEST_METHOD'] === 'POST') {
  4. $username = trim($_POST['username']);
  5. $inputPassword = $_POST['password'];
  6. $pdo = new PDO("mysql:host=localhost;dbname=library", "root", "");
  7. $stmt = $pdo->prepare("SELECT * FROM users WHERE username = ?");
  8. $stmt->execute([$username]);
  9. $user = $stmt->fetch();
  10. if ($user && password_verify($inputPassword, $user['password'])) {
  11. $_SESSION['user_id'] = $user['id'];
  12. $_SESSION['username'] = $user['username'];
  13. header("Location: dashboard.php");
  14. } else {
  15. die("用户名或密码错误");
  16. }
  17. }

Session管理要点

  • 必须先调用session_start()
  • 敏感信息不要直接存储在Session中
  • 登录后设置session_regenerate_id(true)防止会话固定攻击

3. 退出登录实现

  1. // logout.php
  2. session_start();
  3. // 清除所有Session变量
  4. $_SESSION = array();
  5. // 销毁Session
  6. if (ini_get("session.use_cookies")) {
  7. $params = session_get_cookie_params();
  8. setcookie(session_name(), '', time() - 42000,
  9. $params["path"], $params["domain"],
  10. $params["secure"], $params["httponly"]
  11. );
  12. }
  13. session_destroy();
  14. header("Location: login.php");

图书管理功能实现

1. 数据库增删改查操作

添加图书

  1. // add_book.php
  2. if ($_SERVER['REQUEST_METHOD'] === 'POST') {
  3. $title = trim($_POST['title']);
  4. $author = trim($_POST['author']);
  5. $isbn = trim($_POST['isbn']);
  6. try {
  7. $pdo = new PDO("mysql:host=localhost;dbname=library", "root", "");
  8. $stmt = $pdo->prepare("INSERT INTO books (title, author, isbn) VALUES (?, ?, ?)");
  9. $stmt->execute([$title, $author, $isbn]);
  10. echo "图书添加成功";
  11. } catch (PDOException $e) {
  12. die("添加失败: " . $e->getMessage());
  13. }
  14. }

查询图书

  1. // search_books.php
  2. $searchTerm = isset($_GET['q']) ? $_GET['q'] : '';
  3. $pdo = new PDO("mysql:host=localhost;dbname=library", "root", "");
  4. $sql = "SELECT * FROM books WHERE title LIKE ? OR author LIKE ?";
  5. $params = ["%$searchTerm%", "%$searchTerm%"];
  6. $stmt = $pdo->prepare($sql);
  7. $stmt->execute($params);
  8. $books = $stmt->fetchAll(PDO::FETCH_ASSOC);
  9. // 显示结果
  10. foreach ($books as $book) {
  11. echo "<div>{$book['title']} - {$book['author']}</div>";
  12. }

更新与删除

  1. // update_book.php
  2. if ($_SERVER['REQUEST_METHOD'] === 'POST') {
  3. $id = (int)$_POST['id'];
  4. $status = (int)$_POST['status'];
  5. $pdo = new PDO("mysql:host=localhost;dbname=library", "root", "");
  6. $stmt = $pdo->prepare("UPDATE books SET status = ? WHERE id = ?");
  7. $stmt->execute([$status, $id]);
  8. echo "状态更新成功";
  9. }
  10. // delete_book.php
  11. $id = (int)$_GET['id'];
  12. $pdo = new PDO("mysql:host=localhost;dbname=library", "root", "");
  13. $stmt = $pdo->prepare("DELETE FROM books WHERE id = ?");
  14. $stmt->execute([$id]);

2. 权限控制实现

  1. // auth_check.php
  2. function checkLogin() {
  3. session_start();
  4. if (!isset($_SESSION['user_id'])) {
  5. header("Location: login.php");
  6. exit;
  7. }
  8. }
  9. // 在需要认证的页面顶部调用
  10. checkLogin();

系统优化建议

  1. 分页处理:对图书列表实现分页
    ```php
    $page = isset($_GET[‘page’]) ? (int)$_GET[‘page’] : 1;
    $perPage = 10;
    $offset = ($page - 1) * $perPage;

$stmt = $pdo->prepare(“SELECT * FROM books LIMIT ? OFFSET ?”);
$stmt->execute([$perPage, $offset]);

  1. 2. **输入验证**:所有用户输入必须验证
  2. ```php
  3. function validateInput($data) {
  4. $data = trim($data);
  5. $data = stripslashes($data);
  6. $data = htmlspecialchars($data);
  7. return $data;
  8. }
  1. 错误处理:统一错误管理
    1. set_error_handler(function($errno, $errstr) {
    2. error_log("Error [$errno]: $errstr");
    3. http_response_code(500);
    4. echo "系统错误,请稍后再试";
    5. exit;
    6. });

部署注意事项

  1. 生产环境必须:

    • 禁用错误显示(display_errors = Off
    • 启用HTTPS
    • 定期备份数据库
  2. 性能优化:

    • 对常用查询添加索引
    • 使用OPcache加速PHP执行
    • 实现缓存机制(如Redis

该系统实现了图书管理的核心功能,包括完整的用户认证流程和数据库操作。通过预处理语句、密码哈希和Session管理确保了基本安全性。开发者可在此基础上扩展借阅记录、分类管理、数据统计等高级功能。