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

动态添加商品行后如何通过AJAX+PHP+MySQL实现变动时实时总价求和

问题根源

你现有代码的核心问题如下:

  • 没有使用事件委托绑定事件,动态新增的商品行的输入、选择操作无法触发计算逻辑
  • 仅读取了第一个商品的ID和数量,没有遍历所有已生成的商品行汇总数据
  • 后端仅支持单商品价格计算,没有批量计算多商品总价的逻辑
  • 没有监听商品选择框的变更事件,切换商品时不会触发总价更新

修复步骤

1. 修改动态生成代码,增加统一类名

给动态生成的商品选择框、数量输入框增加统一类名,方便后续批量选择元素,同时给商品行容器也加统一类名:

let counter = 1;
$("#add-button").click(function () {    
    event.preventDefault(); 
    counter++;
    let newSubjectField =  `<div class="row product-row" id="products${counter}">
                                <div class="col-xl-6 col-md-6 col-12 mb-1">
                                    <div class="form-group">
                                        <label for="product_id${counter}">Product</label>
                                        <!-- 新增统一类名 product-select -->
                                        <select class="form-control product-select" name="product_id[]" id="product_id${counter}">
                                            <option value="">Pilih</option>
                                            <?php
                                                $sql = mysqli_query($con, "SELECT * FROM product ORDER BY id ASC");
                                                while($data = mysqli_fetch_array($sql)){
                                            ?>
                                            <option value="<?php echo $data['id']; ?>"><?php echo $data['name']; ?></option>
                                            <?php } ?>
                                        </select>
                                    </div>
                                </div>
                                <div class="col-xl-6 col-md-6 col-12 mb-1">
                                    <div class="form-group">
                                        <label for="total_product${counter}">Total Product</label>
                                        <!-- 新增统一类名 total-product -->
                                        <input type="number" class="form-control total-product total_product${counter}" name="total_product[]" id="total_product${counter}" placeholder="Jumlah" />
                                    </div>
                                </div>
                            </div>`;
    $('#form-products').append(newSubjectField);
});

记得同步给静态的第一个商品行的选择框加product-select类、数量输入框加total-product类、行容器加product-row类。

2. 替换前端总价计算逻辑

使用事件委托绑定事件,遍历所有商品行汇总数据提交给后端:

// 事件委托到固定父元素,兼容动态新增的元素
$('#form-products').on('keyup', '.total-product', calcTotal)
                   .on('change', '.product-select', calcTotal);

function calcTotal() {
    let productList = [];
    // 遍历所有商品行
    $('.product-row').each(function() {
        let pid = $(this).find('.product-select').val();
        let num = $(this).find('.total-product').val();
        // 仅收集已选商品、已填有效数量的行数据
        if(pid && num && parseInt(num) > 0) {
            productList.push({
                id: pid,
                num: num
            });
        }
    });
    $.ajax({
        type: 'post',
        url: 'ajax-total.php',
        data: {
            products: JSON.stringify(productList)
        },
        success: function(data){
            let obj = JSON.parse(data);
            $('#total').val(obj.total);        
        }
    });
}

3. 修改后端逻辑,支持多商品总价计算

<?php
include '../connection.php';
// 防SQL注入,使用预处理语句
$productList = json_decode($_POST['products'], true);
$total = 0;
if(!empty($productList)) {
    foreach($productList as $item) {
        $pid = intval($item['id']);
        $num = intval($item['num']);
        $stmt = $connection->prepare("SELECT sale_price FROM product WHERE id = ?");
        $stmt->bind_param("i", $pid);
        $stmt->execute();
        $result = $stmt->get_result();
        $row = $result->fetch_assoc();
        if($row) {
            $total += intval($row['sale_price']) * $num;
        }
        $stmt->close();
    }
}
echo json_encode(['total' => $total]);
?>

优化建议

如果你不想每次计算都发起Ajax请求,也可以在商品选择时把对应单价缓存到元素的data-price属性上,前端直接计算总价,减少服务器请求开销。


内容的提问来源于stack exchange,提问作者Khairunnisa Syahfitri

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.23 16:27:01