You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

PHP MySQL多表连接报错及数据动态展示问题求助

解决CodeIgniter多表连接查询及动态字段显示问题

一、先修复模型层的多表连接错误

你的getResponInfo方法里有几个明显问题导致报错,我给你拆解并修复:

  1. 重复引用respon_user表:你在from里已经声明了respon_user ru,后面又用join重复关联同一张表,数据库会识别到重复别名触发语法错误。
  2. select *导致字段冲突:respon和respon_user都有isi_respon、tanggal字段,直接查所有字段会让结果里出现同名字段,后续取值会被覆盖。
  3. SQL注入风险:直接拼接$kode_laporan到where语句里,存在安全隐患。
  4. 排序逻辑不清晰:需要同时按两张表的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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.28 09:40:12