Codeigniter项目实现autocomplete功能时出现500内部服务器错误求解决
问题修复方案
你遇到的500错误由以下几处代码问题导致,按优先级排查修复即可:
- 函数名拼写错误
模型中判断参数的asset($postData['search'])是拼写错误,PHP判断变量存在且非空应使用isset()或!empty();asset()是CI用于生成静态资源路径的辅助函数,传入不符合要求的参数会直接抛出致命错误,触发500响应。 - 模型加载方式错误
CodeIgniter框架不可直接用new Crud_model的方式实例化模型,需先调用框架的模型加载方法$this->load->model('Crud_model'),否则会报类未找到的致命错误。 - SQL语法风险
直接拼接用户输入到SQL语句中,除了存在SQL注入风险外,若用户输入包含单引号等特殊字符,会触发SQL语法错误导致500,建议使用CI查询构造器自带的like方法。 - CSRF校验问题(可选排查)
若你开启了CI的全局CSRF防护,AJAX POST请求未携带CSRF令牌也会返回500,需要在AJAX请求参数中补充对应令牌。
修正后代码
控制器代码
public function counterpartslist(){ // 加载模型 $this->load->model('Crud_model'); $postData = $this->input->post(); $data = $this->Crud_model->getcounterparts($postData); // 声明JSON响应头避免解析异常 $this->output->set_content_type('application/json'); echo json_encode($data); }
模型代码
function getcounterparts($postData){ $response = array(); // 替换asset为!empty判断参数 if(!empty($postData['search'])){ $this->db->select('user_id,business_name'); // 使用框架原生like方法,自动转义特殊字符 $this->db->like('business_name', $postData['search']); $records = $this->db->get('user_table')->result(); foreach($records as $row ){ $response[] = array( "value"=>$row->user_id, "label"=>$row->business_name ); } } return $response; }
(可选)开启CSRF后的jQuery代码调整
$("#search_counterpart").autocomplete({ source: function( request, response ) { $.ajax({ url: "<?=base_url()?>index.php/admin/counterpartslist", type: 'post', dataType: "json", data: { search: request.term, // 补充CSRF令牌 "<?= $this->security->get_csrf_token_name() ?>": "<?= $this->security->get_csrf_hash() ?>" }, success: function( data ) { response( data ); } }); }, });
如果修复后仍有问题,可将CI根目录index.php中的ENVIRONMENT参数设置为development开启调试模式,直接查看具体错误信息快速定位问题。
内容的提问来源于stack exchange,提问作者Dileep
相关产品推荐
相关产品推荐

