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
相关产品推荐
相关产品推荐

