如何在PHP和MySQL中动态使用rowspan生成合并单元格表格?
解决方案:实现合并rowspan的表格
没问题,我来帮你搞定这个单元格合并的需求!要实现你想要的 rowspan 效果,核心思路是先按 ward_no 分组统计每个组的记录数,然后在渲染表格时,只在每组的第一行输出带 rowspan 属性的 ward 单元格,后续行跳过这个单元格即可。
具体修改步骤:
- 优化查询语句:添加
ORDER BY ward_no确保同个 ward 的记录连续排列,避免分组混乱;同时改用预处理语句规避 SQL 注入风险(这是生产环境必须注意的安全要点)。 - 分组存储数据:把查询结果按 ward_no 归类,方便统计每个 ward 对应的子区块数量,以此确定 rowspan 的值。
- 调整表格渲染逻辑:遍历分组后的数据,在每组第一行设置
rowspan为该组的记录数,后续行仅输出子区块单元格。
修改后的完整代码:
if(isset($_POST["union_id"]) && !empty($_POST["union_id"])) { // 使用预处理语句避免SQL注入,若union_id是字符串类型,将"i"替换为"s" $stmt = $mysqli->prepare("SELECT * FROM test_epi_table WHERE union_id = ? ORDER BY ward_no"); $stmt->bind_param("i", $_POST['union_id']); $stmt->execute(); $query = $stmt->get_result(); // 统计总记录数 $rowCount = $query->num_rows; // 渲染表格内容 if($rowCount > 0) { echo "<hr>"; echo "<h3 align='center'>EPI Schedule</h3>"; echo "<table class='table table-bordered'> <tr> <th>Ward No</th> <th>Sub-Block</th> </tr>"; // 将查询结果按ward_no分组 $wardGroups = []; while($row = $query->fetch_assoc()) { $wardNo = $row['ward_no']; if(!isset($wardGroups[$wardNo])) { $wardGroups[$wardNo] = []; } $wardGroups[$wardNo][] = $row['sub_block_name']; } // 遍历分组数据生成表格行 foreach($wardGroups as $wardId => $subBlocks) { $blockCount = count($subBlocks); $isFirstRow = true; foreach($subBlocks as $blockName) { echo "<tr>"; // 仅组内第一行输出带rowspan的ward单元格 if($isFirstRow) { echo "<td rowspan='{$blockCount}'>{$wardId}</td>"; $isFirstRow = false; } echo "<td>{$blockName}</td>"; echo "</tr>"; } } echo "</table>"; echo "<hr>"; } else { echo "<br>"; echo "<h3 align='center'>Sorry, No Available Information!</h3>"; echo "<hr>"; } }
关键细节说明:
- SQL安全优化:替换了原代码直接拼接参数的写法,防止恶意输入引发的SQL注入攻击,这是线上项目必须重视的安全规范。
- 数据分组逻辑:通过遍历查询结果,将同一 ward 的子区块归类存储,确保能准确获取每个 ward 的记录数量,从而设置正确的跨行合并属性。
- 表格渲染逻辑:每组的第一行渲染合并后的 ward 单元格,后续行仅渲染子区块列,完美实现了你想要的跨行合并效果。
内容的提问来源于stack exchange,提问作者user4354828
相关产品推荐
相关产品推荐

