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

从数据库读取数据后,学校日程表为何新增空白单元格?

问题解决:日程表右侧出现空白单元格的原因及修复

问题根源

你代码里的核心问题是没有处理rowspan带来的列跳过逻辑:当某小时的某天课程设置了rowspan>1(跨多行显示)时,后续对应的行依然会为该天输出一个空的<td>,导致表格每行的单元格总数超出预期,最终在右侧多出空白单元格。

另外原代码反复调用mysqli_data_seek($result, 0)重置结果集指针,不仅低效,还可能引发指针操作的潜在问题。

修复方案

先把所有日程数据一次性读取到数组中,再通过一个数组记录需要跳过的列及剩余次数,避免重复输出多余单元格:

// 先一次性读取所有日程数据到数组,避免反复操作数据库指针
$schedules = [];
while ($row = mysqli_fetch_assoc($result)) {
    $schedules[] = $row;
}

// 维护数组:记录1-5天各自需要跳过输出td的剩余次数
$skip_days = array_fill(1, 5, 0);

foreach ($hours as $hour) {
    echo "<tr><td>$hour</td>";
    
    for ($d = 1; $d <= 5; $d++) {
        // 如果该天需要跳过,减少剩余次数,不输出td
        if ($skip_days[$d] > 0) {
            $skip_days[$d]--;
            continue;
        }
        
        $rowspan = 0;
        $cell_content = '';
        
        // 在预读取的数组中查找匹配的日程
        foreach ($schedules as $schedule) {
            if (intval($schedule['day']) == $d && strtotime($schedule['beginning_time']) == strtotime($hour)) {
                $end_time = $schedule['end_time'];
                $rowspan = ceil((strtotime($end_time) - strtotime($hour)) / 900);
                $cell_content = $schedule['subject'];
                // 设置后续N-1行需要跳过该列
                if ($rowspan > 1) {
                    $skip_days[$d] = $rowspan - 1;
                }
                break;
            }
        }
        
        echo "<td" . ($rowspan > 1 ? " rowspan=\"$rowspan\"" : "") . ">$cell_content</td>";
    }
    
    echo "</tr>";
}

关键修改点

  • 预读取数据:把数据库结果集一次性存入数组,避免反复重置指针,提升性能同时消除指针操作隐患。
  • 跳过逻辑:新增$skip_days数组,当某列设置rowspan=N时,后续N-1行直接跳过该列的<td>输出,保证每行单元格数量正确。
  • 逻辑简化:用foreach遍历本地数组替代while循环遍历数据库结果集,代码逻辑更清晰易维护。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.23 16:17:32