
本文详解 codeigniter 3 中模型查询数据库、控制器正确传递数据、视图安全渲染下拉菜单的全流程,重点解决因数据未正确传入视图导致的空白选项问题,并提供可运行代码与关键注意事项。
本文详解 codeigniter 3 中模型查询数据库、控制器正确传递数据、视图安全渲染下拉菜单的全流程,重点解决因数据未正确传入视图导致的空白选项问题,并提供可运行代码与关键注意事项。
在 CodeIgniter 3 中,数据无法在视图中显示,绝大多数情况下并非模型逻辑错误,而是控制器未将数据实际加载到视图上下文,或视图中访问变量的方式与控制器传递方式不匹配。你当前的代码存在两个核心问题:一是控制器调用了自定义的 page_construct() 方法(非 CI 原生方法),但未确认该方法是否真正执行了 $this->load->view() 并注入 $this->data;二是视图中直接使用 $vendors,而控制器是通过 $this->data['vendors'] = ... 赋值的——这意味着视图只能访问 $vendors 当且仅当 $this->data 数组被显式提取(如通过 extract($this->data))或作为关联数组传入视图。
✅ 正确做法是:控制器必须显式加载视图并传入数据数组。请将控制器方法修正为标准 CI 3 写法:
public function allVendors() {
$data['vendors'] = $this->vendors_sales_model->getAllVendors();
$this->load->view('reports/vendors_sales_details', $data); // 关键:使用原生 load->view()
}
同时,优化你的模型以提升健壮性(避免 foreach 中未初始化 $data 导致 Notice 错误):
public function getAllVendors() {
$this->db->select('DISTINCT SUBSTRING(product_code, 1, 3) as vendor')
->from('tec_sale_items')
->order_by('vendor');
$query = $this->db->get();
if ($query->num_rows() > 0) {
return $query->result_array(); // 返回关联数组,便于视图用 $ven['vendor'] 访问
}
return []; // 返回空数组而非 false,避免视图 foreach 报错
}
视图保持简洁清晰(无需 $this->data):
<select class="form-control" name="vendor"><option value="">All</option>
<?php foreach ($vendors as $ven): ?><option value="<?= htmlspecialchars($ven['vendor'], ENT_QUOTES, 'UTF-8') ?>">= htmlspecialchars($ven['vendor'], ENT_QUOTES, 'UTF-8') ?>
</option>
<?php endforeach; ?></select>
⚠️ 关键注意事项:
- 永远不要在视图中直接拼接未过滤的数据库字段:使用 htmlspecialchars() 防止 XSS 攻击(如 product_code 含 <script> 标签); </script>
- 避免 page_construct() 黑盒方法:若该方法是自定义封装,请检查其内部是否调用 $this->load->view($view, $data) 且未遗漏 extract() 或类似操作;
- 调试第一步:在控制器中添加 var_dump($data['vendors']); exit; 确认模型返回预期数据;
- 升级建议:CodeIgniter 3 已于 2024 年 10 月结束官方支持,强烈建议迁移至 CI4(支持 PHP 7.4+、PSR-4、命名空间、更安全的查询构建器),例如 CI4 中模型返回 Result 对象,视图可直接用 = $ven->vendor ?>,且内置防 XSS 输出助手 esc()。
遵循以上结构与规范,即可确保数据库数据稳定、安全、清晰地呈现在视图下拉菜单中。










