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

控制器getValue函数无法接收Ajax传递数据问题求助

问题排查与修复方案

1. 确认控制器路由与返回格式

你的Ajax请求指向Market/filter,但提供的是getValue()函数,首先要确保filter方法正确调用getValue()并返回JSON格式数据:

public function filter() {
    $result = $this->getValue();
    // 强制指定JSON响应格式
    header('Content-Type: application/json');
    echo json_encode($result);
    exit; // 避免后续多余输出干扰响应
}

如果filter方法未正确返回JSON,Ajax的dataType: "json"会触发错误回调,导致数据无法解析。

2. 调试参数接收情况

在getValue()开头添加调试代码,确认是否接收到Ajax传递的参数:

public function getValue(){
    $years = $this->input->post('years'); 
    $principal = $this->input->post('principal');
    
    // 打印参数到服务器日志(调试用,上线后删除)
    error_log("Received years: " . $years);
    error_log("Received principal: " . $principal);

    // ... 原SQL查询代码
}

也可以临时修改getValue()直接返回参数,验证Ajax是否能拿到数据:

public function getValue(){
    $years = $this->input->post('years'); 
    $principal = $this->input->post('principal');
    return ['years' => $years, 'principal' => $principal];
}

查看浏览器控制台的console.log(data),如果参数为空,需要检查:

  • 浏览器Network面板中POST请求的Form Data,确认years和principal是否存在且值正确。
  • 表单元素#years和#principal是否能通过.val()正确取值(比如是否是隐藏域、是否有动态赋值问题)。

3. 修复SQL查询的参数绑定问题

当前SQL直接拼接变量,存在SQL注入风险,且参数为空时会生成无效SQL(比如WHERE t1.years = ''),导致无数据返回。改用CodeIgniter的参数绑定:

public function getValue(){
    $years = $this->input->post('years'); 
    $principal = $this->input->post('principal');

    // 参数无效时直接返回空数组
    if(empty($years) || empty($principal)){
        return [];
    }

    // 使用?作为占位符,按顺序绑定参数
    $query = "SELECT 
        t1.kota, 
        SUM(t1.size) AS total_size,
        ROUND((SUM(t2.sum_share) / SUM(t1.size) * 100), 2) AS avg_share, 
        SUM(t2.sum_share) AS sum_share
    FROM market_size AS t1
    JOIN (
        SELECT t1.kota, t1.principal, t1.percentage, 
            SUM(t1.cust) AS sum_share 
        FROM market_share AS t1
        WHERE t1.years = ?
        AND t1.principal = ?
        GROUP BY t1.kota, t1.principal, t1.percentage
    ) AS t2 ON t2.kota = t1.kota AND t2.principal = t1.principal
    WHERE t1.years = ?
    AND t1.principal = ?
    GROUP BY t1.kota;";
    
    $data = $this->db->query($query, [$years, $principal, $years, $principal])->result();
    
    return $data;
}

4. 检查CSRF保护(如果开启)

如果你的CodeIgniter开启了CSRF保护,Ajax请求需要带上CSRF Token:

  • 在页面头部添加Token元标签:
<meta name="csrf-token" content="<?= csrf_hash() ?>">
  • 在Ajax请求中添加headers:
$.ajax({
    url: "<?= base_url('Market/filter') ?>",
    data: {
        years:years,
        principal:principal,
    },
    type: "POST",
    dataType: "json",
    // 携带CSRF Token
    headers: {
        'X-CSRF-TOKEN': $('meta[name="csrf-token"]').attr('content')
    },
    // 移除async: false,同步请求会阻塞浏览器
    success: function(data) {
        // ... 原成功回调代码
    },
    error: function(jqXHR, textStatus, errorThrown) {
        // 打印详细错误信息便于排查
        console.log("Error status:", textStatus);
        console.log("Error message:", errorThrown);
        console.log("Response content:", jqXHR.responseText);
    }
})

5. 其他优化建议

  • 移除async: false,同步请求会导致浏览器卡顿,改用异步请求更合理。
  • 在Ajax的error回调中打印详细错误信息,快速定位响应异常问题。

内容的提问来源于stack exchange,提问作者dhnstr_

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.27 07:20:13