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

CodeIgniter框架Select选项onChange时数据库数据获取异常求助

问题分析与解决方案

先帮你梳理下当前代码里的几个核心问题,然后一步步解决:

一、核心问题点

  • AJAX请求未处理响应:你只发送了POST请求,但没接收控制器返回的数据,自然没法更新文本框
  • POST参数名不匹配:视图里select的name是items_goods,但控制器里写了$this->input->post('item_goods')(少了一个s)
  • 模型数据处理错误:模型返回的是Query对象,不是直接可用的数组,需要提取数据
  • FlashData不适合AJAX场景:FlashData是针对页面刷新的请求,AJAX是异步无刷新,完全起不到作用
  • 视图语法错误:文本框的value写法<?=echo $item_goods" >语法混乱,根本无法正确渲染

二、分步修复代码

1. 修复控制器代码

修改new_sale方法,区分AJAX请求和普通页面请求,处理参数并返回JSON数据(AJAX需要接收JSON格式的响应):

public function new_sale(){
    // 处理AJAX异步请求
    if($this->input->is_ajax_request()){
        $item_id = $this->input->post('items_goods');
        // 获取商品数据,注意提取模型返回的数组
        $item_data = $this->interface_model->get_item_data_by_id($item_id)->row_array();
        // 返回JSON格式的价格数据
        echo json_encode(['price' => $item_data['price'] ?? '']);
        exit; // 结束请求,避免加载视图
    }

    // 普通页面请求,加载初始数据
    $data['title']='Add sale';
    $data['items']=$this->interface_model->get_item_data();
    $this->load->view('templates/header_interfaces');
    $this->load->view('interfaces/new_sale', $data);
    $this->load->view('templates/footer_interfaces');
}

2. 修复模型代码

优化查询,直接返回可用的单条数据数组:

public function get_item_data_by_id($item_id){
    $this->db->select('price'); // 只查询需要的价格字段,提升性能
    $this->db->from('stock');
    $this->db->where('id',$item_id);
    $query = $this->db->get();
    return $query->row_array(); // 返回单条数据的关联数组
}

3. 修复视图代码

修正文本框的语法错误,添加readonly防止手动修改:

<td>
    <select class="form-control" id="items_goods" name="items_goods" style="width:150px;">
        <option value="none" selected disabled>Select Item</option>
        <?php foreach ($items as $item):?>
            <option value="<?php echo $item['id'];?>"><?php echo $item['item_name']; ?></option>
        <?php endforeach;?>
    </select>
</td>
<td>
    <input type="text" name="price" id="price" value="" readonly>
</td>

4. 修复AJAX脚本

添加成功回调,接收返回的JSON并更新文本框:

$('#items_goods').change(function(){
    var items_goods = $(this).val(); // 简化写法,避免重复选择DOM
    if(items_goods === 'none'){
        $('#price').val(''); // 选默认项时清空价格
        return;
    }
    $.ajax({
        url: "<?php echo site_url('your_controller_name/new_sale'); ?>", // 替换为实际控制器名,生成绝对路径
        data: {items_goods: items_goods },
        type: 'post',
        dataType: 'json', // 指定接收JSON格式
        success: function(response){
            $('#price').val(response.price); // 更新文本框内容
        },
        error: function(){
            alert('Failed to fetch item price'); // 错误提示
        }
    });
});

三、替代实现方案(无需AJAX,更高效)

如果商品数据量不大,可以把价格直接存在select的option自定义属性里,前端直接读取,不用发后端请求:

视图修改:

<select class="form-control" id="items_goods" name="items_goods" style="width:150px;">
    <option value="none" selected disabled>Select Item</option>
    <?php foreach ($items as $item):?>
        <option value="<?php echo $item['id'];?>" data-price="<?php echo $item['price'];?>">
            <?php echo $item['item_name']; ?>
        </option>
    <?php endforeach;?>
</select>

脚本修改:

$('#items_goods').change(function(){
    var selectedOption = $(this).find('option:selected');
    var price = selectedOption.data('price') || '';
    $('#price').val(price);
});

这个方案不需要后端请求,响应更快,避免了AJAX的网络开销,适合数据量小的场景。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 07:03:04