You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

编程新手咨询:PHP实现用户已添加书籍列表展示及入库方案

嘿,作为编程初学者,你这个需求其实很常见,我来一步步帮你实现完整的方案——从数据库结构确认,到PHP代码编写,再到功能验证,都会给你讲清楚!

一、先确认你的数据库表结构

首先得确保三张表的字段和外键关联是正确的,我把标准结构贴出来,你可以对照自己的数据库调整:

-- users表:存储用户信息
CREATE TABLE users (
    id INT PRIMARY KEY AUTO_INCREMENT,
    username VARCHAR(50) NOT NULL UNIQUE,
    password VARCHAR(255) NOT NULL,
    email VARCHAR(100) NOT NULL UNIQUE,
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);

-- book表:存储书籍信息
CREATE TABLE book (
    id INT PRIMARY KEY AUTO_INCREMENT,
    title VARCHAR(255) NOT NULL,
    author VARCHAR(100) NOT NULL,
    isbn VARCHAR(20) UNIQUE,
    description TEXT,
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);

-- add_book表:关联用户和书籍的中间表(记录用户添加的书籍)
CREATE TABLE add_book (
    id INT PRIMARY KEY AUTO_INCREMENT,
    users_id INT NOT NULL,
    book_id INT NOT NULL,
    added_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
    -- 设置外键关联
    FOREIGN KEY (users_id) REFERENCES users(id) ON DELETE CASCADE,
    FOREIGN KEY (book_id) REFERENCES book(id) ON DELETE CASCADE,
    -- 确保同一个用户不能重复添加同一本书
    UNIQUE KEY unique_user_book (users_id, book_id)
);

这里特意加了unique_user_book唯一键,防止用户重复添加同一本书,很重要哦!

二、数据库连接(用PDO,更安全易维护)

先写一个通用的数据库连接文件db.php,后面所有功能都要用到它:

<?php
// db.php
$host = 'localhost';
$dbname = '你的数据库名';
$username = '数据库用户名';
$password = '数据库密码';

try {
    $pdo = new PDO("mysql:host=$host;dbname=$dbname;charset=utf8mb4", $username, $password);
    // 设置PDO错误模式为异常,方便调试
    $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
} catch(PDOException $e) {
    die("数据库连接失败: " . $e->getMessage());
}
?>

记得把里面的占位信息换成你自己的数据库配置!

三、实现“添加书籍到个人列表”功能

首先,你得确保用户是已登录状态(不然不知道是谁添加的书籍),所以需要用到Session来保存用户ID。

3.1 登录逻辑(简单示例)

先写一个简单的登录处理login.php,用来验证用户并保存Session:

<?php
// login.php
session_start();
require 'db.php';

if ($_SERVER['REQUEST_METHOD'] === 'POST') {
    $username = $_POST['username'];
    $password = $_POST['password'];

    try {
        $stmt = $pdo->prepare("SELECT id, password FROM users WHERE username = ?");
        $stmt->execute([$username]);
        $user = $stmt->fetch(PDO::FETCH_ASSOC);

        if ($user && password_verify($password, $user['password'])) {
            // 验证成功,保存用户ID到Session
            $_SESSION['user_id'] = $user['id'];
            header("Location: dashboard.php"); // 跳转到用户面板
            exit;
        } else {
            echo "用户名或密码错误!";
        }
    } catch(PDOException $e) {
        echo "登录失败: " . $e->getMessage();
    }
}
?>
<!-- 登录表单 -->
<form method="POST" action="login.php">
    <input type="text" name="username" placeholder="用户名" required>
    <input type="password" name="password" placeholder="密码" required>
    <button type="submit">登录</button>
</form>

注意:用户密码要存在数据库时要用password_hash()加密,比如注册的时候:password_hash($password, PASSWORD_DEFAULT),别存明文!

3.2 添加书籍的功能实现

写一个add_book.php,处理用户添加书籍的请求:

<?php
// add_book.php
session_start();
require 'db.php';

// 检查用户是否登录
if (!isset($_SESSION['user_id'])) {
    header("Location: login.php");
    exit;
}

$user_id = $_SESSION['user_id'];
$book_id = $_POST['book_id'] ?? null;

if ($_SERVER['REQUEST_METHOD'] === 'POST' && $book_id) {
    try {
        // 尝试插入记录,因为有唯一键,重复添加会抛出异常
        $stmt = $pdo->prepare("INSERT INTO add_book (users_id, book_id) VALUES (?, ?)");
        $stmt->execute([$user_id, $book_id]);

        echo "书籍添加成功!";
        // 可以跳回书籍列表页或者用户面板
        header("Location: dashboard.php");
        exit;
    } catch(PDOException $e) {
        // 如果是唯一键冲突,说明已经添加过这本书
        if ($e->getCode() === '23000') {
            echo "你已经添加过这本书啦!";
        } else {
            echo "添加失败: " . $e->getMessage();
        }
    }
}
?>

你可以在书籍详情页或者书籍列表页加一个按钮,提交book_id到这个文件:

<!-- 示例:书籍列表中的添加按钮 -->
<form method="POST" action="add_book.php" style="display: inline;">
    <input type="hidden" name="book_id" value="1"> <!-- 这里的1是对应书籍的ID -->
    <button type="submit">添加到我的书架</button>
</form>
四、展示用户已添加的书籍列表

写一个dashboard.php,展示当前登录用户的所有已添加书籍:

<?php
// dashboard.php
session_start();
require 'db.php';

// 检查用户是否登录
if (!isset($_SESSION['user_id'])) {
    header("Location: login.php");
    exit;
}

$user_id = $_SESSION['user_id'];

try {
    // 关联三张表查询,获取书籍的详细信息
    $stmt = $pdo->prepare("
        SELECT b.id, b.title, b.author, b.isbn, b.description, ab.added_at
        FROM add_book ab
        JOIN book b ON ab.book_id = b.id
        WHERE ab.users_id = ?
        ORDER BY ab.added_at DESC
    ");
    $stmt->execute([$user_id]);
    $user_books = $stmt->fetchAll(PDO::FETCH_ASSOC);
} catch(PDOException $e) {
    die("获取书籍列表失败: " . $e->getMessage());
}
?>
<!DOCTYPE html>
<html>
<head>
    <title>我的书架</title>
    <style>
        .book-item {
            border: 1px solid #ddd;
            padding: 15px;
            margin: 10px 0;
            border-radius: 5px;
        }
    </style>
</head>
<body>
    <h1>我的书架</h1>
    <?php if (empty($user_books)): ?>
        <p>你还没有添加任何书籍,快去添加吧!</p>
    <?php else: ?>
        <?php foreach ($user_books as $book): ?>
            <div class="book-item">
                <h3><?php echo htmlspecialchars($book['title']); ?></h3>
                <p>作者:<?php echo htmlspecialchars($book['author']); ?></p>
                <p>ISBN:<?php echo htmlspecialchars($book['isbn']); ?></p>
                <p><?php echo htmlspecialchars($book['description']); ?></p>
                <small>添加时间:<?php echo date('Y-m-d H:i:s', strtotime($book['added_at'])); ?></small>
            </div>
        <?php endforeach; ?>
    <?php endif; ?>
    <p><a href="book_list.php">去浏览书籍</a></p>
</body>
</html>

这里用了htmlspecialchars()来防止XSS攻击,一定要记得加,不然会有安全隐患!

五、重要注意事项
  • 安全第一:所有用户输入都要经过过滤,用PDO的预处理语句(就是上面代码里的prepare()和execute())防止SQL注入;用htmlspecialchars()防止XSS攻击。
  • 用户认证:所有涉及用户个人数据的页面(比如添加书籍、展示书架)都要检查Session里的user_id,确保用户已登录。
  • 错误处理:上面的代码里用了try-catch来捕获异常,开发阶段可以保留,上线后可以把错误信息换成友好提示,不要暴露数据库细节。
  • 密码加密:用户注册时一定要用password_hash()加密密码,登录时用password_verify()验证,绝对不能存明文密码!

内容的提问来源于stack exchange,提问作者Ibrahima sory diane

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.20 07:25:51