PHP MySQL多表连接报错及数据动态展示问题求助
解决CodeIgniter多表连接查询及动态字段显示问题
一、先修复模型层的多表连接错误
你的getResponInfo方法里有几个明显问题导致报错,我给你拆解并修复:
- 重复引用
respon_user表:你在from里已经声明了respon_user ru,后面又用join重复关联同一张表,数据库会识别到重复别名触发语法错误。 select *导致字段冲突:respon和respon_user都有isi_respon、tanggal字段,直接查所有字段会让结果里出现同名字段,后续取值会被覆盖。- SQL注入风险:直接拼接
$kode_laporan到where语句里,存在安全隐患。 - 排序逻辑不清晰:需要同时按两张表的
tanggal排序,得明确规则。
推荐用UNION合并查询(更贴合你的需求)
这种方式会把管理员回复和用户回复分成独立的行,每条回复都有明确的发送者标识,后续视图处理更简单:
public function getResponInfo($kode_laporan) { // 管理员回复的查询语句 $admin_query = $this->db->select(' r.isi_respon, r.tanggal, a.nama_opd as sender_name, "admin" as sender_type ') ->from('respon r') ->join('admin a', 'a.id_admin = r.id_admin') ->where('r.kode_laporan', $kode_laporan) ->get_compiled_select(); // 用户回复的查询语句 $user_query = $this->db->select(' ru.isi_respon, ru.tanggal, u.nama as sender_name, "user" as sender_type ') ->from('respon_user ru') ->join('user u', 'u.id = ru.id_pengirim') ->where('ru.kode_laporan', $kode_laporan) ->get_compiled_select(); // 合并两个结果并按时间排序 $final_query = $this->db->query("$admin_query UNION $user_query ORDER BY tanggal ASC"); return $final_query; }
二、解决视图层动态显示发送者名字的问题
用上面的UNION查询后,视图里可以直接统一处理,不用复杂判断:
if($rsp > 0){ foreach ($respon as $r) { // 注意:result()返回的是对象,用->访问属性;如果要数组,控制器里改result_array() echo $r->tanggal; echo $r->sender_name; // 直接显示统一的发送者名字 echo $r->isi_respon; } }
如果你坚持用关联查询的方式
视图里可以通过判断字段是否为空来动态显示:
if($rsp > 0){ foreach ($respon as $r) { // 显示时间:优先取管理员回复时间,没有则取用户回复时间 echo !empty($r->tgl_admin) ? $r->tgl_admin : $r->tgl_user; // 显示发送者:优先显示管理员的nama_opd,没有则显示用户的nama echo !empty($r->nama_opd) ? $r->nama_opd : $r->nama; // 显示回复内容:优先显示管理员回复,没有则显示用户回复 echo !empty($r->respon_admin) ? $r->respon_admin : $r->respon_user; } }
额外小修正(控制器里的小问题)
你控制器里$data['kode_laporan'] = $this->session->set_userdata('kode_laporan');写法错误,set_userdata返回布尔值,应该分开写:
$this->session->set_userdata('kode_laporan', $kode_laporan); $data['kode_laporan'] = $kode_laporan;
内容的提问来源于stack exchange,提问作者R. Amalia
相关产品推荐
相关产品推荐

