
本文讲解如何正确处理和展示 mysql union 查询返回的多行数据,重点解决因错误索引导致的 null 输出问题,并提供安全、可维护的表格渲染方案。
本文讲解如何正确处理和展示 mysql union 查询返回的多行数据,重点解决因错误索引导致的 null 输出问题,并提供安全、可维护的表格渲染方案。
在使用 UNION 合并多个学期成绩表(如 ftscores_primary、scores_primary、hscores_primary)时,查询会返回一个扁平化的结果集——每行代表一个学期的成绩记录,所有列按字段别名对齐(例如统一用 total 表示各学期总分)。你当前的问题在于:误将外层 foreach 的单行 $totvalue 当作二维数组处理,却用 $totvalue[0]['total'] 这种越级索引方式访问数据,导致始终返回 NULL。
实际上,$totScores 是一个一维数组,其每个元素(即 $totvalue)本身就是一个关联数组,结构类似:
[ ['id' => 85, 'student_id' => 23, 'total' => 85, ...], ['id' => 696, 'student_id' => 23, 'total' => 81, ...], ['id' => 594, 'student_id' => 23, 'total' => 87, ...] ]
因此,正确的遍历逻辑应为:
<?php foreach ($totScores as $totvalue): ?><tr> <td> <?php echo $CI->GetSubjectNameWithID($totvalue['subject_id'] ?? null); ?></td> <td><?php echo htmlspecialchars($totvalue['total'] ?? '—'); ?></td> </tr><?php endforeach; ?>
⚠️ 注意事项:
-
不要嵌套索引:
$totvalue[0]['total']是错误写法,$totvalue已是单行数据,直接取'total'键即可; -
字段一致性保障:
UNION要求所有SELECT子句列数、类型和顺序严格一致。你原查询中第三张表使用h_ca1等前缀,但SELECT列未做别名映射(如tt.h_ca1 AS ft_ca1),可能导致列错位。建议显式重命名以确保语义对齐:
SELECT tt.id, tt.student_id, ..., tt.h_ca1 AS ft_ca1, ..., tt.h_tot_score AS total, ... FROM hscores_primary tt WHERE ...
-
增强健壮性:使用空合并操作符
??防止缺失键报错;htmlspecialchars()防止 XSS; -
性能提示:若仅需
total和subject_id,应精简SELECT字段,避免传输冗余数据。
最终,一个完整的、生产就绪的表格渲染示例:
| 科目 | 学期总分 |
|---|---|
| 暂无成绩记录 | |
| GetSubjectNameWithID($row['subject_id'] ?? 0)); ?> | |
通过以上修正,你将能稳定、清晰地展示学生三学期累计成绩,同时提升代码安全性与可读性。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











