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

在线图书馆管理系统图书分配异常:未选图书被重复分配求助

嘿,我一眼就瞅出你代码里的问题啦!咱们一步步来捋:

核心问题分析

你现在遇到的“自动分配同一本书直到库存耗尽”的问题,根源出在这几个地方:

  • 把图书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>';
        }
    }
}

额外提醒

  1. 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();
  1. 前端多选框验证:确保你的前端多选框selector[]的value确实是图书ID,不要和数量输入框的命名混淆。

这样修改后,系统就会先检查库存,只有库存足够才会分配,并且每次借阅后更新库存,不会再出现无限分配同一本书的情况啦!

内容的提问来源于stack exchange,提问作者Inês Toúzi

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 07:09:46