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

PHP+MySQL+AJAX实现多选商品按购买数量统计总金额问题求助

解决方案

你当前的代码存在三个核心问题导致仅能计算第一个商品的金额:

  • 所有商品行的选择器、数量输入框都使用了重复ID,DOM操作只能匹配到第一个元素
  • 每次提交仅传递单组商品ID和数量,没有收集所有选中商品的信息
  • 后端逻辑仅处理单个商品的金额计算,没有累加多商品总价

按照以下步骤修改即可实现多商品总价累加计算:


1. 修改HTML结构

删除重复ID,替换为class,给每个商品行加标识类:

<div class="row product-row">
    <div class="col-xl-6 col-md-6 col-12 mb-1">
        <div class="form-group">
            <label>Produk</label>
            <select class="form-control product_id" name="product_id[]">
                <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>Jumlah Produk</label>
            <input type="number" class="form-control total_product" name="total_product[]" placeholder="Jumlah" />
        </div>
    </div>
</div>
<!-- 新增多组商品直接复制上面的product-row结构即可 -->
<input type="text" id="total" readonly placeholder="总金额">

2. 修改前端JS逻辑

改为事件委托,每次触发计算时遍历所有商品行,收集所有商品ID和数量数组传给后端:

$(document).ready(function(){
    // 同时监听数量输入、商品选择两种变化事件
    $(document).on('keyup change', '.total_product, .product_id', function(){
        let productIds = [];
        let productNums = [];
        // 遍历所有商品行收集有效数据
        $('.product-row').each(function(){
            let pid = $(this).find('.product_id').val();
            let num = $(this).find('.total_product').val();
            if(pid && num && Number(num) > 0){
                productIds.push(pid);
                productNums.push(num);
            }
        });
        // 无有效数据直接清空总金额
        if(productIds.length === 0){
            $('#total').val(0);
            return;
        }
        $.ajax({
            type: 'get',
            url: 'ajax-total.php',
            data: {
                'product_ids': productIds,
                'product_nums': productNums
            },
            success: function(data){
                let obj = JSON.parse(data);
                $('#total').val(obj.total);        
            }
        });
    });
})

3. 修改后端PHP逻辑

接收数组参数,循环计算每个商品的金额累加,同时修复原代码数据库连接变量不一致问题、增加SQL注入防护:

include '../koneksi.php';
// 统一数据库连接变量,和koneksi.php定义的变量保持一致
$productIds = $_GET['product_ids'] ?? [];
$productNums = $_GET['product_nums'] ?? [];
$total = 0;

foreach($productIds as $k => $pid){
    // 转义防止SQL注入
    $pid = mysqli_real_escape_string($con, $pid);
    $num = (int)$productNums[$k] ?? 0;
    if($num <= 0) continue;
    
    $query = mysqli_query($con, "SELECT sale_price FROM product WHERE id='$pid' LIMIT 1");
    $row = mysqli_fetch_assoc($query);
    if($row){
        $total += (int)$row['sale_price'] * $num;
    }
}

$data = array('total' => $total);
echo json_encode($data);

内容的提问来源于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 14:24:01