视图中直接使用变量名即可,但必须与控制器传入的键名完全一致(包括大小写和下划线);控制器需用关联数组显式赋值,如 $data['items'] = ...;未传键或拼写错误会导致 undefined variable 错误。

视图里直接用变量名就行,但必须匹配控制器传来的键名
CodeIgniter 把控制器传进 $this->load->view() 的关联数组,用 extract() 拆成独立变量。比如控制器写了 $data['user_name'] = 'Alice',视图里就直接写 $user_name,不用 $data['user_name']。
常见错误是键名拼错或大小写不一致:控制器传了 $data['userName'],视图却写 $username,就会报 Undefined variable。
- 键名必须完全一致(包括下划线、大小写)
- 不能在视图里访问未声明的键,哪怕它在
$data数组里是null - 如果控制器没传某个键,视图中直接使用会触发 Notice,不是 Warning 或 Fatal
控制器没传变量?先检查 $data 数组结构
最常踩的坑是:模型返回了数据,但控制器没把它塞进 $data 的正确键里。比如模型返回一个数组,你本想传给视图叫 items,结果控制器写成了:
$data = $this->item_model->get_all(); // ❌ 直接赋值,不是关联数组
$this->load->view('list', $data);
这样视图收不到 $items,因为 $data 本身是索引数组或对象,不是带键的关联数组。
- 务必用
$data['items'] = $this->item_model->get_all();这种显式键名方式 - 调试时可在控制器里加
var_dump($data); exit;确认结构 - CI4 中推荐用
return view('list', $data);,逻辑更清晰
输出前记得转义,别裸写 = $var ?>
CodeIgniter 不自动过滤输出,$var 如果含用户输入内容(比如表单提交、URL 参数),直接 echo 可能导致 XSS。CI3 用 html_escape($var),CI4 用 esc($var)。
例如视图中写:
<p>欢迎,= esc($user_name) ?></p>
- 字符串、数字、布尔值都可安全传入
esc();数组和对象会返回空字符串,需先判断 - 不要对已知安全的静态文本转义,比如
esc('订单列表')没必要 - 若变量可能为
null,建议先判空:= $user_name ? esc($user_name) : '访客' ?>
多层嵌套数组或对象,别漏掉层级
如果控制器传的是 $data['profile']['email'],视图里就得写 $profile['email'],不能跳过 $profile 直接用 $email。CI 不做深层展开。
典型误用场景:
- 模型返回
result_array()得到索引数组,如[0 => ['id'=>1, 'name'=>'A']],控制器却传$data['users'] = $query->result_array()→ 视图要遍历$users[0]['name'],而不是$users['name'] - 想传单条记录却忘了取
[0],比如$data['user'] = $query->result_array()[0] ?? [] - 用
row_array()或row()更稳妥,它们直接返回一维数组或对象
变量能不能用,只取决于控制器传进 view() 的那个数组里有没有对应键——没有捷径,也没有隐式映射。写视图前,花十秒确认 $data 结构,比后面查半小时 undefined error 快得多。











