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

如何在jQuery Autocomplete插件列表中附带数据库的隐藏product_id

解决jQuery Autocomplete获取product_id的问题

要实现自动补全时携带product_id,需同时修改后端接口和前端逻辑,核心是让后端返回包含产品ID和名称的结构化数据,前端通过Autocomplete直接获取并使用ID:

1. 修改后端fetch_autocomplete_name.php

修改查询语句,同时获取product_id和product_name,构造符合jQuery Autocomplete要求的JSON结构,同时修复SQL注入风险:

if (isset($_GET['term'])) {
    $term = $_GET['term'];
    // 使用参数绑定避免SQL注入
    $query = $db->prepare("SELECT product_id, product_name FROM products 
                           WHERE product_name LIKE CONCAT('%', :term, '%') LIMIT 10");
    $query->bindParam(':term', $term);
    $query->execute();

    $result = array();
    if ($query->rowCount() > 0) {
        while ($row = $query->fetch(PDO::FETCH_ASSOC)) {
            $result[] = array(
                'label' => $row['product_name'], // 自动补全列表显示的文本
                'value' => $row['product_name'], // 选中后填充到输入框的内容
                'product_id' => $row['product_id'] // 自定义字段,携带产品ID
            );
        }
    }
    echo json_encode($result);
}

2. 修改前端JavaScript逻辑

调整Autocomplete配置,在select事件中直接获取ui.item.product_id,无需再通过产品名称查询,同时优化初始化逻辑避免重复绑定:

function select_name(){
    // 给所有product_name开头的input绑定Autocomplete,仅初始化一次
    $("[id^='product_name']").each(function() {
        var $this = $(this);
        var id = $this.attr('id').replace("product_name",'');
        
        if (!$this.data('autocomplete-init')) {
            $this.autocomplete({
                source: 'store_supply/fetch_autocomplete_name.php',
                select: function (event, ui) {
                    event.preventDefault(); // 可选,阻止默认填充逻辑,手动控制输入框内容
                    $this.val(ui.item.label); // 设置输入框显示产品名称
                    
                    var productId = ui.item.product_id; // 直接获取选中产品的ID
                    $.ajax({
                        url:"store_supply_manage/fetch_product_code.php",
                        method:"POST",
                        data:{product_id: productId}, // 传递product_id而非名称
                        dataType:"json",
                        success:function(data){
                            $('#mu_emri_'+id).val(data.mu_name);
                            $('#product_code_'+id).val(data.barCode);
                            $('#vat_vlera_'+id).val(data.vat_value_4);
                            $('#product_id'+id).val(data.product_id);
                            calculateTotal();
                        }
                    });
                }
            });
            $this.data('autocomplete-init', true);
        }
    });
}

3. 调整fetch_product_code.php(配套修改)

由于现在传递的是product_id,需修改该接口的查询逻辑,通过ID获取产品信息:

if (isset($_POST['product_id'])) {
    $productId = $_POST['product_id'];
    $query = $db->prepare("SELECT mu_name, barCode, vat_value_4, product_id FROM products WHERE product_id = :id");
    $query->bindParam(':id', $productId);
    $query->execute();
    $data = $query->fetch(PDO::FETCH_ASSOC);
    echo json_encode($data);
}

关键说明

  • 后端返回的JSON数组中,label是自动补全列表的显示文本,product_id作为自定义字段会被Autocomplete完整传递给前端
  • 前端直接读取ui.item.product_id,彻底解决同名产品的歧义问题
  • 通过参数绑定修复了原代码中的SQL注入风险,提升安全性

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.31 08:59:16