控制器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_
相关产品推荐
相关产品推荐

