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

CodeIgniter3中Bootstrap Typeahead线上环境获取无效JSON数据问题求助

CodeIgniter3中Bootstrap Typeahead线上环境获取无效JSON数据问题求助

看起来你遇到的问题核心是线上环境的响应内容混进了PHP错误信息,导致前端无法解析纯JSON,再加上请求参数和方法不匹配的问题,咱们一步步拆解修复:

核心问题分析

  1. 请求参数&方法完全不匹配:
    你的前端用$.get()发送的是query参数(GET请求),但控制器里却用$this->input->post('check')去获取POST的check参数——这直接导致$check变量为null。
  2. 线上PHP版本更高,错误输出默认开启:
    本地PHP版本可能较低,对null传递给SQL查询的兼容性更好,且可能关闭了浏览器错误输出;但线上环境(比如PHP 8+)会把mysqli::real_escape_string()接收null标记为废弃错误,CodeIgniter默认会把这个错误以HTML形式输出到响应里,导致你的响应内容变成「错误HTML+JSON」的混合体,前端$.parseJSON()自然就失败了。
  3. 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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.07 10:58:07