在线图书馆管理系统图书分配异常:未选图书被重复分配求助
嘿,我一眼就瞅出你代码里的问题啦!咱们一步步来捋:
核心问题分析
你现在遇到的“自动分配同一本书直到库存耗尽”的问题,根源出在这几个地方:
- 把图书ID当成了借阅数量:你代码里
$book_qty = $value,但$value是多选框selector[]传过来的图书ID对吧?这就导致你每次借阅直接把图书ID的数值当成了借阅本数(比如book_id是5,就一次借5本),直接把库存干没了! - 完全没处理库存逻辑:既没在借阅前检查库存够不够,也没在借阅后更新库存数量,系统根本不知道库存已经减少,所以会一直重复分配。
- 循环内直接跳转:你在foreach里每插入一条记录就跳回页面,这会导致循环只执行一次,但如果前端存在重复提交的情况,会加重问题。
修复后的代码
我给你调整了代码,加上库存检查和更新逻辑,还修正了数量的处理(默认每次借1本,如果需要自定义数量,你可以在前端对应位置加输入框):
if(!isset($_POST['student_no'])){ echo '<script type = "text/javascript"> alert("请先选择学生姓名"); window.location = "borrowing.php"; </script>'; }else{ if(!isset($_POST['selector']) || empty($_POST['selector'])){ echo '<script type = "text/javascript"> alert("请先选择图书!"); window.location = "borrowing.php"; </script>'; }else{ $student_no = $_POST['student_no']; $date = date("Y-m-d", strtotime("+8 HOURS")); $success = true; $error_msg = ""; foreach($_POST['selector'] as $book_id){ // 先查询当前图书的库存 $stock_query = $conn->query("SELECT book_qty FROM books WHERE book_id = '$book_id'") or die(mysqli_error($conn)); $stock_data = $stock_query->fetch_assoc(); $current_stock = $stock_data['book_qty']; // 假设每次借阅1本,若需自定义数量,前端要加name="book_qty[$book_id]"的输入框,再改成$book_qty = $_POST['book_qty'][$book_id]; $book_qty = 1; if($current_stock >= $book_qty){ // 插入借阅记录 $conn->query("INSERT INTO borrowing VALUES(NULL, '$book_id', '$student_no', '$book_qty', '$date', 'Borrowed')") or die(mysqli_error($conn)); // 更新图书库存 $new_stock = $current_stock - $book_qty; $conn->query("UPDATE books SET book_qty = '$new_stock' WHERE book_id = '$book_id'") or die(mysqli_error($conn)); }else{ $success = false; $error_msg .= "图书ID $book_id 库存不足,无法借阅!\n"; } } // 所有处理完成后统一提示跳转 if($success){ echo '<script type = "text/javascript"> alert("借阅成功"); window.location = "borrowing.php"; </script>'; }else{ echo '<script type = "text/javascript"> alert("'.$error_msg.'"); window.location = "borrowing.php"; </script>'; } } }
额外提醒
- SQL注入风险:你现在的代码直接把POST参数拼进SQL里,非常不安全!建议用mysqli的预处理语句,示例如下:
// 插入借阅记录的预处理写法 $stmt = $conn->prepare("INSERT INTO borrowing VALUES(NULL, ?, ?, ?, ?, 'Borrowed')"); $stmt->bind_param("siss", $book_id, $student_no, $book_qty, $date); $stmt->execute();
- 前端多选框验证:确保你的前端多选框
selector[]的value确实是图书ID,不要和数量输入框的命名混淆。
这样修改后,系统就会先检查库存,只有库存足够才会分配,并且每次借阅后更新库存,不会再出现无限分配同一本书的情况啦!
内容的提问来源于stack exchange,提问作者Inês Toúzi
相关产品推荐
相关产品推荐

