控制器必须通过关联数组向视图传数据,键名严格匹配变量名,否则报错;$data须为['key'=>val]格式,索引数组无效;模型返回嵌套结构需解包;输出必用esc()防XSS。

控制器把数据交给视图,核心就一条:必须用关联数组,键名会自动变成视图里的变量名。传错结构、漏传键、拼写不一致,都会导致 Undefined variable 或 Undefined array key。
控制器必须用 $this->load->view() 的第二个参数传关联数组
这个参数不是可选的“附加工具”,而是唯一合法的数据通道。视图里所有变量都靠它生成,没有例外。
-
$data必须是关联数组,比如['total' => 12, 'items' => $list];索引数组如[12, $list]不生效 - 键名就是视图中变量名:
$data['user_name']→ 视图里直接写$user_name - 不能在视图里访问控制器的局部变量、类属性或未声明的全局变量
- CI4 中推荐用命名空间加载模型,但数据传递方式和 CI3 完全一致,
$this->load->view('page', $data)仍有效
常见错误:模型返回了数组嵌套,但控制器没解包就直接传
比如模型用了 result_array() 查计数:return $this->db->select('COUNT(*) as total')->get('table')->result_array();,结果是 [ ['total' => 42] ] —— 这是个含一个元素的索引数组,不是关联数组。
- 视图里写
$total会报Undefined variable,因为控制器传的是整个数组,没提取出total键 - 正确做法是在控制器里解一层:
'total' => $model->getCount()[0]['total'],或者(更推荐)模型改用count_all_results()直接返回整数 - 若模型返回对象(
result()),也要注意:对象属性不能直接当变量用,得先转成数组或显式取属性
视图里输出前务必用 esc()(CI4)或 html_escape()(CI3)
这不是“锦上添花”,而是防止 XSS 的强制动作。哪怕只是个数字,也建议包裹,因为变量来源可能被污染,且统一处理能避免遗漏。
-
= esc($total) ?>是 CI4 安全输出的标准写法;CI3 对应= html_escape($total) ?> - 不要用
echo $total直接输出,尤其当值来自数据库或用户输入时 - 如果值是 HTML 片段且你明确信任它,才考虑用
unescaped_output()(CI4)或绕过转义,但这是例外,不是默认行为
最容易被忽略的一点:控制器和视图之间的变量映射完全依赖键名字符串匹配,大小写、下划线、中文空格全算不同变量;传了 $data['UserName'],视图里写 $username 就是错的——这里没有自动转换,也没有容错机制。


















