CodeIgniter关联查询报Unknown column错误的解决求助
问题解决步骤
错误根源分析
- SQL语法错误:直接拼接字符串变量
$kode到SQL语句中,字符串类型的HG01未被引号包裹,数据库将其识别为列名,触发1054 Unknown column错误。 - 查询字段错误:SELECT语句里的
matkul是表名,不是有效字段,必须指定具体字段(比如课程名称,假设字段名为nama_matkul,请根据实际表结构调整)。 - 未返回查询结果:
studidos()函数执行查询后没有return结果,导致视图无法获取数据。 - 冗余JOIN操作:matkul表本身包含
kode_dosen字段,无需关联dosen表,直接过滤即可。
修正后的Model代码
public function studidos() { // 获取当前登录教师的kode_dosen $studos = $this->M_Dosen->sedo(); $kode = $studos['kode_dosen']; // 使用CodeIgniter查询构造器(自动处理字符串引号,更安全) $this->db->select('kode_dosen, kode_matkul, nama_matkul'); // 替换nama_matkul为实际课程名字段 $this->db->from('matkul'); $this->db->where('kode_dosen', $kode); // 返回查询结果 return $this->db->get()->result_array(); }
若坚持使用原生SQL,需给变量加单引号,同时用预处理语句防SQL注入:
$query = "SELECT kode_dosen, kode_matkul, nama_matkul FROM matkul WHERE kode_dosen = ?"; return $this->db->query($query, [$kode])->result_array();
控制器补充(确保数据传给视图)
在对应控制器方法中,调用model并将数据赋值给视图:
public function input_nilai() { $data['sedo'] = $this->M_Dosen->sedo(); $data['studidos'] = $this->M_Dosen->studidos(); $this->load->view('nilai_input', $data); }
视图调整(匹配字段名)
如果课程名字段是nama_matkul,修改视图循环部分:
<div class="form-group"> <label for="exampleFormControlSelect1">Kode Matkul</label> <select class="form-control" id="exampleFormControlSelect1" name="kode_matkul"> <?php foreach($studidos as $stud) : ?> <option value="<?= $stud['kode_matkul']; ?>"><?= $stud['nama_matkul']; ?> (<?= $stud['kode_matkul']; ?>)</option> <?php endforeach; ?> </select> </div>
关键注意事项
- SQL注入防护:优先使用CodeIgniter查询构造器或预处理语句,避免直接拼接用户可控变量到SQL中。
- 字段名匹配:确保SELECT语句中的字段名与数据库表实际字段一致,避免字段不存在的错误。
- 数据返回检查:确认model函数return了查询结果,否则视图无法获取数据。
内容的提问来源于stack exchange,提问作者Haidar
相关产品推荐
相关产品推荐

