CodeIgniter使用AJAX选择分类后加载子分类报500错误如何解决?
CodeIgniter分类联动功能500错误解决
场景说明
开发CodeIgniter站点的表单分类联动功能,选中主分类后通过AJAX请求加载对应子分类,请求返回500错误无法正常加载。
相关代码
前端JS代码
$(document).ready(function() { $('#country').change(function() { var country_id = $('#country').val(); if (country_id != '') { $.ajax({ url: "<?php echo base_url(); ?>index.php/homecontroller/fetchstate", method: "POST", data: { country_id: country_id }, success: function(data) { $('#state').html(data); $('#city').html('<option value="">Select Brand</option>'); } }); } else { $('#state').html('<option value="">Select Category</option>'); $('#city').html('<option value="">Select Brand</option>'); } }); });
表单HTML代码
<form action="" method="post"> <label for="inputEmail4">Category</label> <select id="country" class="form-control" name="cname" aria-label="Default select example"> <option>Select Category</option> <?php foreach($listcategory as $vals){ echo '<option value="'.$vals->name.'">'.$vals->name.'</option>'; }?> </select> <label for="inputEmail4">Brand</label> <select class="form-control" name="sname" id="state"> <option value="">Select Brand</option> </select>
控制器代码
function fetchstate() { if($this->input->post('country_id')) { echo $this->excel_import_model->fetch_state($this->input->post('country_id')); } }
模型代码
function fetch_state($country_id) { $this->db->where('inventorycategory', $country_id); $this->db->order_by('name', 'ASC'); $query = $this->db->get('inventorybrand'); $output = '<option value="">Select Brand</option><option value="None">None</option>'; foreach($query->result() as $row) { $output .= '<option value="'.$row->name.'">'.$row->name.'</option>'; } return $output; }
报错信息
POST http://localhost/letsship/index.php/homecontroller/fetchstate 500 (Internal Server Error)
排查方案
- 检查控制器是否加载对应模型:确认
homecontroller的构造方法中已经加载excel_import_model,加载代码为$this->load->model('excel_import_model');,未加载直接调用模型方法会触发500错误。 - 检查CSRF防护配置:如果站点开启了全局CSRF校验,AJAX POST请求未携带CSRF token会被拦截。解决方法是在AJAX请求参数中添加token:
先在页面中获取token信息:
再修改AJAX的data参数:var csrfName = '<?php echo $this->security->get_csrf_token_name(); ?>'; var csrfHash = '<?php echo $this->security->get_csrf_hash(); ?>';data: {country_id: country_id, [csrfName]: csrfHash}, - 检查控制器方法权限:确认
fetchstate方法为public类型,私有/受保护方法无法被外部URL直接访问。 - 检查数据库相关配置:确认
inventorybrand表、inventorycategory字段真实存在,名称没有拼写错误,数据库连接配置正确。 - 开启调试模式定位具体错误:临时将站点根目录
index.php中的ENVIRONMENT设置为development,再次请求接口即可看到具体的PHP错误提示,快速定位问题。
内容的提问来源于stack exchange,提问作者sim papa
相关产品推荐
相关产品推荐

