点击「加入想读清单」按钮时如何将传递的ISBN存入MySQL数据库
嘿,我来帮你搞定这个需求!要实现点击「加入想读清单」按钮把ISBN存入数据库,咱们可以分前端交互和后端数据库处理两部分来做,下面是具体的步骤和代码示例:
1. 前端修改:用AJAX实现无跳转添加(推荐)
这种方式不用跳转到新页面,用户体验更好。咱们先修改按钮的点击逻辑,再写对应的JS代码发送请求:
<!-- 把原来的a标签改成按钮,或者保留a标签但阻止跳转行为 --> <button class="btn btn-primary btn-xl text-uppercase js-scroll-trigger" onclick="addToWantRead()">Add to 'Want to Read'</button> <script> function addToWantRead() { // 获取页面上显示的ISBN const isbn = document.getElementById('isbn').textContent.trim(); // 这里要获取当前登录用户的userID,假设你已经通过session保存了用户ID const userId = <?php echo $_SESSION['userID']; ?>; // 先检查ISBN是否有效 if (!isbn) { alert('无法获取书籍ISBN,请重试'); return; } // 用fetch发送POST请求到后端处理脚本 fetch('add_to_want_read.php', { method: 'POST', headers: { 'Content-Type': 'application/x-www-form-urlencoded', }, // 编码参数避免特殊字符问题 body: `userID=${userId}&isbn=${encodeURIComponent(isbn)}` }) .then(response => response.text()) .then(data => { if (data === 'success') { alert('已成功加入想读清单!'); // 可以在这里把按钮改成"已加入"状态,避免重复点击 event.target.disabled = true; event.target.textContent = '已加入想读清单'; } else { alert('添加失败:' + data); } }) .catch(error => { console.error('请求出错:', error); alert('添加失败,请稍后重试'); }); } </script>
⚠️ 注意:要确保你的页面已经开启了Session(在bookdetails.php开头加上<?php session_start(); ?>),并且已经实现了用户登录逻辑,把用户ID存在$_SESSION['userID']里。
2. 后端创建处理插入的PHP脚本(add_to_want_read.php)
这个脚本负责接收前端传来的参数,连接数据库,执行插入操作,还要处理重复添加的情况:
<?php session_start(); // 先验证用户是否登录 if (!isset($_SESSION['userID'])) { echo '请先登录后再操作'; exit; } // 获取前端传递的参数 $userID = $_POST['userID']; $isbn = $_POST['isbn']; // 验证参数合法性 if (empty($userID) || empty($isbn)) { echo '参数错误,请重试'; exit; } // 替换成你的数据库连接信息 $servername = "localhost"; $dbUsername = "你的数据库用户名"; $dbPassword = "你的数据库密码"; $dbName = "你的数据库名称"; // 创建数据库连接 $conn = new mysqli($servername, $dbUsername, $dbPassword, $dbName); // 检查连接是否成功 if ($conn->connect_error) { die("数据库连接失败: " . $conn->connect_error); } // 先检查用户是否已经添加过这本书(避免重复记录) $checkSql = "SELECT * FROM bookswantstoread WHERE userID = ? AND ISBN = ?"; $checkStmt = $conn->prepare($checkSql); // "is"表示第一个参数是int类型,第二个是string类型 $checkStmt->bind_param("is", $userID, $isbn); $checkStmt->execute(); $result = $checkStmt->get_result(); if ($result->num_rows > 0) { echo '这本书已经在你的想读清单里啦'; $checkStmt->close(); $conn->close(); exit; } // 如果没重复,执行插入操作 $insertSql = "INSERT INTO bookswantstoread (userID, ISBN) VALUES (?, ?)"; $insertStmt = $conn->prepare($insertSql); $insertStmt->bind_param("is", $userID, $isbn); if ($insertStmt->execute()) { echo 'success'; } else { echo '数据库错误: ' . $insertStmt->error; } // 关闭所有连接和语句 $insertStmt->close(); $checkStmt->close(); $conn->close(); ?>
3. 额外注意事项
- 安全防护:上面用了预处理语句(
prepare+bind_param),这是防止SQL注入的最佳实践,千万不要直接把变量拼接到SQL语句里。 - 重复检查:添加前先查询用户是否已经添加过同一本书,避免数据库出现重复数据。
- 用户权限:后端要再次验证
$_SESSION['userID']和提交的userID是否一致,防止恶意伪造用户ID。 - ISBN验证:可以在前端或后端额外验证ISBN的格式(比如10位或13位),过滤无效的ISBN。
备选方案:跳转页面处理添加
如果你更倾向于点击按钮跳转到新页面处理,也可以这样做:
修改按钮的链接:
<a class="btn btn-primary btn-xl text-uppercase js-scroll-trigger" href="wanttoread.php?isbn=<?php echo $ISBN; ?>">Add to 'Want to Read'</a>
然后在wanttoread.php里处理插入逻辑(和上面的add_to_want_read.php逻辑基本一致),完成后再跳回书籍详情页:
<?php session_start(); if (!isset($_SESSION['userID'])) { header('Location: login.php'); exit; } $isbn = $_GET['isbn']; $userID = $_SESSION['userID']; // 数据库连接和插入逻辑(和上面的add_to_want_read.php一样) // ... 省略连接和插入代码 ... // 插入完成后跳回书籍详情页,带成功提示 header('Location: bookdetails.php?isbn=' . $isbn . '&msg=added'); exit; ?>
内容的提问来源于stack exchange,提问作者Natalie Neill
相关产品推荐
相关产品推荐

