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

CodeIgniter 4与Ajax动态联动下拉框失效:500错误求助

CodeIgniter 4 + Ajax动态联动下拉框500错误排查修复

问题背景

尝试开发动态联动下拉框(选择城市后加载对应 barangay),控制台返回500内部服务器错误,功能无法正常运行。

控制台报错

jquery.min.js:2
POST http://localhost/sidsci/public/sd/getAjaxBrgy 500 (Internal Server Error)

数据库结构

mcb_id | mcb_name | mcb_brgy

视图代码

<div class="form-row">
   <div class="form-group col-md-6">
      <label><b>Municipal / City<span class="text-danger">*</span></b></label>
      <select name="s_muncity" class="form-control" id="s_muncity" required>
         <option value="">-Select-</option>
         <?php foreach($mcb as $mcb_row):?>
         <option value="<?= $mcb_row->mcb_name;?>"><?= $mcb_row->mcb_name;?></option>
         <?php endforeach;?>
      </select>
   </div>
   <div class="form-group col-md-6">
      <label><b>Barangay<span class="text-danger">*</span></b></label>
      <select class="form-control" name="s_brgy" id="s_brgy" required></select>
   </div>
</div>

<script>
$('#s_muncity').change(function(){
        var mcb_name = $(this).val();

        $.ajax({
            url:'<?=base_url('/sd/getAjaxBrgy')?>',
            method: 'POST',
            data: {mcb_name: mcb_name},
            dataType: 'json',
            success: function(response){
                $('#s_brgy').find('option').not(':first').remove();
                $.each(response,function(index,data){
                $('#s_brgy').append('<option value="'+data['mcb_brgy']+'">'+data['mcb_brgy']+'</option>');
                });
            }
        });
    });
</script>

页面已引入依赖:

<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.5.1/jquery.min.js"></script>

控制器代码(SD控制器)

public function getAjaxBrgy(){

        $model = new McbModel();
        $postData = array(
            'mcb_name' => $this->request->getPost('mcb_name'),
        );

        $data = $model->getBrgyData($postData);
        echo json_encode($data);
    }

模型代码(McbModel)

public function getBrgyData($postData) {
      $sql = 'select mcb_brgy from mcb where mcb_name ='.$postData['mcb_name'];
      $query =  $this->db->query($sql);
      return $query->getResult();
  }

错误原因与修复方案

1. 核心问题:SQL语法错误+注入风险

模型中直接拼接字符串生成SQL语句,当mcb_name包含空格或特殊字符时,会触发SQL语法错误,同时存在严重的注入漏洞。

修复模型代码:改用CodeIgniter推荐的Query Builder:

public function getBrgyData($postData) {
    return $this->db->select('mcb_brgy')
                    ->where('mcb_name', $postData['mcb_name'])
                    ->get('mcb')
                    ->getResult();
}

或使用参数绑定的原生SQL:

public function getBrgyData($postData) {
    $sql = 'select mcb_brgy from mcb where mcb_name = ?';
    $query = $this->db->query($sql, [$postData['mcb_name']]);
    return $query->getResult();
}

2. 控制器响应优化

明确设置JSON响应格式,增加空值判断避免无效查询:

public function getAjaxBrgy(){
    $model = new McbModel();
    $mcbName = $this->request->getPost('mcb_name');
    
    if(empty($mcbName)){
        return $this->response->setJSON([]);
    }
    
    $data = $model->getBrgyData(['mcb_name' => $mcbName]);
    return $this->response->setJSON($data);
}

3. Ajax错误排查优化

添加错误回调,方便查看服务器返回的详细错误信息:

$('#s_muncity').change(function(){
    var mcb_name = $(this).val();
    if(!mcb_name) return;

    $.ajax({
        url:'<?=base_url('/sd/getAjaxBrgy')?>',
        method: 'POST',
        data: {mcb_name: mcb_name},
        dataType: 'json',
        success: function(response){
            $('#s_brgy').empty().append('<option value="">-Select-</option>');
            $.each(response,function(index,data){
                $('#s_brgy').append('<option value="'+data.mcb_brgy+'">'+data.mcb_brgy+'</option>');
            });
        },
        error: function(xhr, status, error){
            console.log(xhr.responseText); // 打印服务器错误详情
        }
    });
});

4. 路由检查

确认/sd/getAjaxBrgy路由已在App/Config/Routes.php中正确配置:

$routes->post('sd/getAjaxBrgy', 'SDController::getAjaxBrgy');

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.21 11:00:11