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

为什么AJAX无法根据select下拉选择的价格区间获取对应商品价格?

核心问题1:HTML重复ID冲突

你在循环输出多个商品的过程中,给所有的下拉选择框都设置了相同的id="price_range",给所有价格展示区域都设置了相同的id="product_price"。HTML规范要求页面内ID必须全局唯一,jQuery的ID选择器只会匹配页面中第一个对应ID的元素,所以不管你修改哪个商品的下拉选项,只会触发第一个下拉的事件,也只会修改第一个商品的价格展示。

核心问题2:AJAX传递的商品ID错误

你在JS代码中直接写的var product_id = <?php echo $product_id ?>;,这个$product_id是PHP循环遍历商品结束后剩下的最后一个商品的ID,不管你修改哪个商品的下拉,传给后端的都是最后一个商品的ID,永远拿不到当前操作商品的对应价格。


修复方案

第一步:修改HTML循环部分的元素属性

把固定ID改为带商品ID的动态ID,同时给下拉框加类名和自定义属性存储当前商品ID,修改后的对应代码如下:

<!-- 下拉选择框部分 -->
<select name="price_range" class="form-control price_range" data-product-id="<?php echo $product_id; ?>">
    <option value="price_range1" selected><?php echo $row['weight_range1']; ?> <?php echo $row['product_unit']; ?></option>
    <option value="price_range2"> <?php echo $row['weight_range2']; ?><?php echo $row['product_unit']; ?></option>
    <option value="price_range3"><?php echo $row['weight_range3']; ?><?php echo $row['product_unit']; ?></option>
    <option value="price_range4"><?php echo $row['weight_range4']; ?> <?php echo $row['product_unit']; ?></option>
</select>

<!-- 价格展示部分 -->
<span id="product_price_<?php echo $product_id; ?>">
    <input type="hidden" name="cart_price" value="<?php echo $row['product_price1']; ?>">
    <?php echo $row['product_price1']; ?>
</span>/<?php echo $row['product_unit']; ?>

第二步:修改JS事件绑定逻辑

用类名绑定事件,从当前操作的下拉框读取商品ID,再更新对应商品的价格区域:

$(document).ready(function() {
    // 用类名绑定所有商品的下拉变更事件
    $('.price_range').on('change', function() {
        // 从当前下拉的自定义属性取对应商品ID
        var product_id = $(this).data('product-id');
        var price_range = this.value;
        $.ajax({
            url: "includes/fetch-price.php",
            type: "POST",
            data: {
                product_id: product_id,
                price_range: price_range
            },
            cache: false,
            success: function(result){
                // 只更新当前商品对应的价格区域
                $("#product_price_" + product_id).html(result);
            }
        });
    });
});

额外优化建议

你当前fetch-price.php的SQL语句直接拼接用户传入的product_id,存在SQL注入风险,建议改为预处理查询:

<?php
require_once "../session.php";
$product_id = $_POST["product_id"];
$price_range = $_POST["price_range"];
// 使用预处理语句避免注入
$stmt = $conn->prepare("SELECT product_price1, product_price2, product_price3, product_price4 FROM products where id = ?");
$stmt->bind_param("i", $product_id);
$stmt->execute();
$scrow = $stmt->get_result()->fetch_assoc();

$price_field = str_replace("range", "price", $price_range);
echo '<input type="hidden" name="cart_price" value="'.$scrow[$price_field].'">'.$scrow[$price_field];
?>

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.01 14:15:04