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

CodeIgniter中如何从视图及Ajax向基础控制器传递数据?

解决CodeIgniter中视图传数据给基础控制器及Ajax调用失败问题

嘿,我来帮你搞定这两个问题!咱们一步步来分析:

一、如何从任意视图向MY_Controller传递数据

首先得明确:CodeIgniter的核心控制器(比如core/MY_Controller)是用来被其他业务控制器继承的,不能直接访问。所以视图的数据最终是提交给继承了MY_Controller的业务控制器,再由业务控制器调用MY_Controller的方法或者共享数据。常见的传递方式有三种:

1. 表单同步提交

在视图里创建表单,把action指向业务控制器的方法,数据会被提交到该方法,而MY_Controller可以在构造函数或公共方法中处理这些数据:

<!-- 视图中的表单 -->
<form method="POST" action="<?= base_url('home/submit_form') ?>">
    <input type="text" name="username" placeholder="输入用户名">
    <button type="submit">提交</button>
</form>

然后创建业务控制器application/controllers/Home.php:

<?php
class Home extends MY_Controller {
    public function __construct() {
        parent::__construct();
    }

    public function submit_form() {
        // 获取表单数据,MY_Controller的$this->input同样可用
        $username = $this->input->post('username');
        // 可以把数据存到MY_Controller的公共属性里
        $this->site_data['username'] = $username;
        // 后续逻辑...
    }
}

2. URL参数(GET请求)

如果是简单的参数,可以通过URL传递,比如视图里的链接:

<a href="<?= base_url('home/get_data?user_id=1001') ?>">查看用户信息</a>

在业务控制器的方法中获取,再传递给MY_Controller:

public function get_data() {
    $user_id = $this->input->get('user_id');
    $this->site_data['user_id'] = $user_id;
    // 调用MY_Controller的公共方法处理
    $this->process_user_data();
}

3. Ajax异步提交

这就是你第二个问题的场景,咱们下面详细说。

二、修复Ajax调用MY_Controller失败的问题

你的Ajax调用失败主要有几个关键问题,咱们逐个修正:

1. 核心问题:URL错误

CodeIgniter不允许直接访问core目录下的MY_Controller,必须通过继承它的业务控制器来访问方法。所以你的Ajax URL不能写MY_Controller/user_data_submit,得改成业务控制器的路径。

2. 代码语法错误

你的Ajax代码最后多了三个});,导致语法错误,请求根本发不出去。

3. 控制器方法的输出规范

最好在输出JSON前设置正确的Content-Type,避免前端解析错误。

修正后的完整代码示例

步骤1:创建继承MY_Controller的业务控制器

比如application/controllers/Home.php:

<?php
class Home extends MY_Controller {
    public function __construct() {
        parent::__construct();
    }

    // 直接调用MY_Controller的user_data_submit方法
    public function user_data_submit() {
        parent::user_data_submit();
    }
}

步骤2:修正Ajax代码

jQuery.ajax({
    type: "POST",
    url: "<?php echo base_url(); ?>home/user_data_submit", // 改成业务控制器路径
    dataType: 'json',
    data: { name: ogrno }, // 确保ogrno是已定义的变量(比如var ogrno = "xxx";)
    success: function(data) {
        if (data) {
            alert(data);
            $("#notifications #bsayisi").text('');
        }
    },
    // 加上错误处理,方便调试
    error: function(xhr, status, error) {
        console.log("请求错误:" + error);
        console.log("状态码:" + status);
        console.log("服务器返回:" + xhr.responseText);
    }
});

步骤3:优化MY_Controller的方法

<?php
class MY_Controller extends CI_Controller {
    public $site_data;

    function __construct() {
        parent::__construct();
    }

    public function user_data_submit() {
        $abc = $this->input->post('name');
        // 设置输出为JSON格式
        $this->output->set_content_type('application/json');
        // 输出JSON数据
        echo json_encode($abc);
        exit; // 确保没有多余输出
    }
}

调试小技巧

如果还是有问题,打开浏览器的开发者工具(F12),切换到「网络」标签,查看Ajax请求的状态:

  • 如果是404:说明URL路径错误,检查业务控制器名称、方法名是否正确,或者路由配置(application/config/routes.php)
  • 如果是500:说明服务器端代码报错,查看application/logs目录下的日志文件找错误原因
  • 如果是200但前端解析失败:检查返回的内容是否是标准JSON格式,有没有多余的HTML输出(比如调试用的echo)

内容的提问来源于stack exchange,提问作者Tolga İskender

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 07:33:36