编程新手咨询: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
相关产品推荐
相关产品推荐

