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

