CodeIgniter3中Bootstrap Typeahead线上环境获取无效JSON数据问题求助
CodeIgniter3中Bootstrap Typeahead线上环境获取无效JSON数据问题求助
看起来你遇到的问题核心是线上环境的响应内容混进了PHP错误信息,导致前端无法解析纯JSON,再加上请求参数和方法不匹配的问题,咱们一步步拆解修复:
核心问题分析
- 请求参数&方法完全不匹配:
你的前端用$.get()发送的是query参数(GET请求),但控制器里却用$this->input->post('check')去获取POST的check参数——这直接导致$check变量为null。 - 线上PHP版本更高,错误输出默认开启:
本地PHP版本可能较低,对null传递给SQL查询的兼容性更好,且可能关闭了浏览器错误输出;但线上环境(比如PHP 8+)会把mysqli::real_escape_string()接收null标记为废弃错误,CodeIgniter默认会把这个错误以HTML形式输出到响应里,导致你的响应内容变成「错误HTML+JSON」的混合体,前端$.parseJSON()自然就失败了。 - Typeahead数据源格式不匹配:
你的模型返回的是对象数组([{"name":"XXX"}, ...]),但Bootstrap Typeahead需要的是纯字符串数组(["XXX", "YYY"]),即使JSON解析成功,也会显示[object Object]而不是医生名字。
分步修复方案
1. 修复控制器的参数获取逻辑
把控制器里的参数获取改成匹配前端的GET请求和query参数,同时增加空参数判断避免后续错误:
public function get_doctor() { // 匹配前端传递的GET参数名query,而不是POST的check $check = $this->input->get('query'); // 空参数直接返回空数组,避免触发SQL查询错误 if (empty($check)) { echo json_encode([]); return; } $data = $this->customers->get_doctor($check); echo json_encode($data); }
2. 给模型增加空值防护
在模型里提前拦截空参数,避免传递null给like查询:
function get_doctor($check) { if (empty($check)) { return []; } $this->db->select('name'); $this->db->like('name', $check); $this->db->from('doctors'); $query = $this->db->get(); return $query->result(); }
3. 修复前端的数据源格式
把返回的对象数组提取为纯字符串数组,适配Typeahead的要求:
$("#refby").typeahead({ source: function (query, process) { return $.getJSON("<?php echo base_url('get_doctor'); ?>", { query: query }, function (data) { console.log(data); // 提取每个对象的name属性,生成纯字符串数组 const doctorNames = data.map(item => item.name); return process(doctorNames); }); } });
(这里用$.getJSON代替手动$.parseJSON,更简洁且自动处理JSON解析)
4. 关闭线上环境的浏览器错误输出
在application/config/config.php里修改配置,避免错误HTML混入响应:
// 只把错误记录到日志,不输出到浏览器 $config['display_errors'] = FALSE; // 日志记录级别(1为只记录严重错误) $config['log_threshold'] = 1; // 确保日志目录可写,或者设置正确的路径 $config['log_path'] = FCPATH . 'application/logs/';
5. 确认线上环境的资源路径正确
检查bootstrap3-typeahead.js的线上路径是否可访问,确保base_url在config.php里配置了正确的线上域名:
$config['base_url'] = 'https://你的线上域名/';
验证效果
修复后,线上环境的响应会变成纯JSON数组,前端能正常解析并渲染Typeahead提示,同时也避免了PHP错误的触发。本地环境因为逻辑统一了,也能保持正常工作。
内容来源于stack exchange
相关产品推荐
相关产品推荐

