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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 08:03:09