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

PHP Ajax可获取ID但无法向控制器传递数据问题

问题分析与解决方案

看起来你遇到的问题核心有两个点,还有一个潜在的坑,我帮你拆解并给出修复方案:

核心问题1:Ajax请求后立刻跳转导致参数丢失

你的Ajax是通过POST方式把re_id传给控制器,但在success回调里直接执行了window.location.href跳转——这相当于发起了一个全新的GET请求到Homepage/category/,和之前的POST请求完全是两个独立的HTTP请求,所以新请求里根本拿不到之前POST的re_id。

核心问题2:控制器里的exit()语句终止了程序

你在控制器里拿到re_id后直接调用了exit();,这会立刻终止PHP程序执行,后面加载视图的代码根本不会运行,这也是为什么你看不到页面内容的原因。

潜在坑:CodeIgniter的CSRF保护(如果开启)

如果你的CodeIgniter开启了CSRF保护(默认是开启的),Ajax POST请求必须带上CSRF token,否则请求会被框架拦截,导致控制器无法正确接收参数。


修复方案(分两种场景)

场景1:需要跳转页面并传递参数(最简单的方案)

如果你的需求是选择ID后跳转到分类页面并展示对应内容,其实不需要用Ajax,直接通过URL传递GET参数即可:

前端代码修改

function select_report() {
    var re_id = $('#report_id').val();
    // 直接跳转到带GET参数的URL
    window.location.href = "<?php echo site_url('Homepage/category/'); ?>?re_id=" + re_id;
}

控制器代码修改

public function category() {
    $this->load->model('main_model');
    $this->load->library('session');
    $this->load->helper('url');
    
    // 获取GET参数(因为现在是GET请求)
    $re_id = $this->input->get('re_id');
    
    // 移除exit(),否则视图不会加载
    $data['report'] = $this->main_model->select_report($re_id);
    
    // 加载视图(注意视图名称不需要加.php后缀)
    $this->load->view('templates/header');
    $this->load->view('category', $data);
    $this->load->view('templates/footer');
}

场景2:坚持用Ajax加载内容(不跳转页面)

如果你的需求是不刷新页面,通过Ajax动态更新内容,那么需要调整控制器返回视图内容,并在前端替换页面元素:

前端代码修改(包含CSRF处理)

function select_report() {
    var re_id = $('#report_id').val();
    // 获取CSRF token(如果开启了CSRF保护必须加)
    var csrfTokenName = '<?php echo $this->security->get_csrf_token_name(); ?>';
    var csrfTokenValue = '<?php echo $this->security->get_csrf_hash(); ?>';
    
    $.ajax({
        url : "<?php echo site_url('Homepage/category/');?>",
        type: "POST",
        data: {
            're_id': re_id,
            [csrfTokenName]: csrfTokenValue
        },
        success: function(data) {
            // 把返回的视图内容替换到页面的某个容器中(比如#content)
            $('#content').html(data);
        },
        error: function (jqXHR, textStatus, errorThrown) {
            alert('请求出错: ' + errorThrown);
        }
    });
}

控制器代码修改

public function category() {
    $this->load->model('main_model');
    $this->load->library('session');
    $this->load->helper('url');
    
    $re_id = $this->input->post('re_id');
    $data['report'] = $this->main_model->select_report($re_id);
    
    // 判断是否是Ajax请求,只返回内容视图(不需要头尾)
    if ($this->input->is_ajax_request()) {
        $this->load->view('category', $data);
    } else {
        // 正常请求加载完整页面
        $this->load->view('templates/header');
        $this->load->view('category', $data);
        $this->load->view('templates/footer');
    }
}

额外提示

  • 视图名称不需要加.php后缀,CodeIgniter会自动在views目录下查找对应的文件;
  • 如果不需要Ajax,直接用表单提交POST请求也是可行的方案,避免跳转丢失参数的问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.14 08:52:36