AJAX仅返回单条数据:按学期学年分表展示数据库数据异常
问题分析与解决:按学年学期分类展示数据时仅显示一条
你遇到的这个问题很常见——明明数据库里存了两条「第1学年第1学期」的课程数据,但页面上只显示了一条。咱们来拆解下代码里的问题:
问题根源
你的核心思路是用$a变量控制表头和表尾只生成一次,但表尾的闭合时机完全错了:
- 第一次循环时,
$a=1,程序生成了表头,接着输出第一行数据,然后立刻闭合了表格,还把$a改成了2。 - 第二次循环时,虽然数据依然符合「第1学年第1学期」的条件,程序也生成了第二行的
<tr>代码,但此时表格已经被闭合了,这行代码会被放在表格外面,属于无效的HTML结构,自然在页面上看不到。
解决方案
我们需要调整表尾的闭合逻辑:不能在第一次循环就收尾,要等所有同组(同学年同学期)的数据都输出完再闭合表格。这里给你两种实用的实现方式:
方式1:先收集同组数据,再统一生成表格
先把同一学年学期的数据都存到数组里,等遍历完所有数据库结果后,再生成完整的表格,逻辑更清晰:
// 初始化数组存储第1学年第1学期的数据 $firstSemesterCourses = []; while($row = mysqli_fetch_array($result)) { if($row['semester'] == '1st' && $row['year'] == 1){ $firstSemesterCourses[] = $row; } } // 只有当有数据时才生成表格 if(!empty($firstSemesterCourses)){ $output .='<div class="table-responsive"> <table class="table table-striped"> <thead> <tr> <th class="text-center">Subject Code</th> <th class="text-center">Subject Title</th> <th class="text-center">Units</th> <th class="text-center">Pre-req</th> <th class="text-center">Co-req</th> </tr> </thead> <tbody>'; // 循环输出所有课程行 foreach($firstSemesterCourses as $course){ $output .= '<tr> <td class="text-center">'.$course['code'].'</td> <td class="text-center">'.$course['title'].'</td> <td class="text-center">'.$course['unit'].'</td> <td class="text-center">'.$course['prereq'].'</td> <td class="text-center">'.$course['corequisite'].'</td> </tr>'; } // 闭合表格 $output .= '</tbody> </table> </div>'; } echo $output;
方式2:循环中动态判断组变化(支持多学年学期)
如果你的需求是展示所有学年学期的课程,而不只是第1学年第1学期,这种方式更灵活——它会自动识别不同的学年学期组,生成对应的表格:
$output = ''; $currentYear = null; $currentSemester = null; $isTableOpen = false; while($row = mysqli_fetch_array($result)) { $year = $row['year']; $semester = $row['semester']; // 如果当前数据属于新组,先闭合之前的表格(如果存在) if(($year != $currentYear || $semester != $currentSemester) && $isTableOpen){ $output .= '</tbody></table></div>'; $isTableOpen = false; } // 生成新组的表头 if($year != $currentYear || $semester != $currentSemester){ $currentYear = $year; $currentSemester = $semester; // 可以在这里添加学年学期的标题,比如: // $output .= '<h5>'.$year.'学年 '.$semester.'学期</h5>'; $output .='<div class="table-responsive"> <table class="table table-striped"> <thead> <tr> <th class="text-center">Subject Code</th> <th class="text-center">Subject Title</th> <th class="text-center">Units</th> <th class="text-center">Pre-req</th> <th class="text-center">Co-req</th> </tr> </thead> <tbody>'; $isTableOpen = true; } // 输出当前课程行 $output .= '<tr> <td class="text-center">'.$row['code'].'</td> <td class="text-center">'.$row['title'].'</td> <td class="text-center">'.$row['unit'].'</td> <td class="text-center">'.$row['prereq'].'</td> <td class="text-center">'.$row['corequisite'].'</td> </tr>'; } // 循环结束后,别忘了闭合最后一个打开的表格 if($isTableOpen){ $output .= '</tbody></table></div>'; } echo $output;
这种方式完全贴合你提到的「类似课程体系展示逻辑」,能自动按学年学期分组生成表格,不用单独处理每个组。
内容的提问来源于stack exchange,提问作者hihihihi
相关产品推荐
相关产品推荐

