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

使用fetchAll()与双重foreach循环时数据重复显示问题求助

解决重复数据显示的问题

你的问题主要来自两个核心原因:SQL查询的关联逻辑错误导致数据重复,以及表格表头的渲染逻辑错误导致标题重复输出,下面一步步来修复:

1. 修复SQL查询的JOIN关联问题

你当前的JOIN语句没有指定表之间的关联条件,这会触发笛卡尔积——也就是把三个表的所有行进行无意义的组合,导致同一条学生数据被重复返回多次,这是页面重复显示的根源。

你需要明确每个表之间的关联字段,比如假设:

  • groups表的gid对应students表的group_id(标记学生属于哪个组)
  • students表的course_id对应courses表的course_id(标记学生选的课程)

修改后的SQL应该是这样:

SELECT gid, group_time, name_student, certificate_id, students.course_id, course_title, course_days 
FROM groups 
JOIN students ON groups.gid = students.group_id
JOIN courses ON students.course_id = courses.course_id
WHERE groups.gid = ?

这样查询会返回正确关联的学生-课程-组数据,不会出现无意义的重复行。

2. 修复表格表头的渲染逻辑

你现在把课程标题、报告标题放在了foreach($all)循环里,这意味着每一条数据都会输出一次标题,所以页面上会重复显示多次"report"和课程名称。

同一组的课程信息应该是统一的,所以我们只需要取出第一条数据的课程信息来渲染标题,然后单独渲染表头的日期列:

修改后的表头代码:

<table dir="rtl" class="table table-bordered table-striped table-hover">
    <thead>
        <?php
        // 只有当数据存在时才渲染标题
        if (!empty($all)) {
            $groupCourse = $all[0];
            echo '<div dir="ltr" class="h4 text-center" style="text-decoration:underline;text-decoration-skip: ink;">report</div>';
            echo '<div dir="ltr" class="h3 text-center" style="text-decoration:underline;text-decoration-skip: ink;">'.$groupCourse['course_title'].'('.$groupCourse['group_time'].')</div>';
            echo "<br>";
        }
        ?>
        <tr>
            <th class="text-center">name of student</th>
            <?php
            if (!empty($all)) {
                $totalDays = $all[0]['course_days'];
                // 渲染课程天数的表头
                for ($i = 1; $i <= $totalDays; $i++) {
                    echo "<td class='text-center'>$i</td>";
                }
            }
            ?>
        </tr>
    </thead>
    <tbody>
        <?php foreach($all as $r){ 
            echo "<tr>";
            print "<td class='text-center'>".$r['name_student']."</td>";
            for ($i = 1; $i <= $r['course_days']; $i++) {
                print "<td></td>";
            }
            echo "</tr>";
        } ?>
    </tbody>
</table>

3. 验证效果

完成上面两步修改后:

  • SQL会返回正确的、无重复的学生数据
  • 页面顶部的报告标题和课程信息只会显示一次
  • 每个学生的名字也只会在表格里出现一次

内容的提问来源于stack exchange,提问作者MRDV

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 04:26:57