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
相关产品推荐
相关产品推荐

