从数据库读取数据后,学校日程表为何新增空白单元格?
问题解决:日程表右侧出现空白单元格的原因及修复
问题根源
你代码里的核心问题是没有处理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
相关产品推荐
相关产品推荐

