PHP+Oracle查询生成指定结构HTML表格的实现问题
实现思路
原有代码存在两个核心问题导致表格结构不符合预期:
- 两次独立查询的结果没有做关联匹配,分开循环输出时无法保证订单和对应阶段状态在同一行
- HTML标签存在多处错配:比如th标签后错误闭合td、多余的td闭合标签、tr行标签位置逻辑错误
修正步骤
- 合并SQL查询,一次性取出订单号和对应所有阶段的状态,避免多查询结果不对齐
如果你的不同阶段对应不同的operation_no,可以用CASE WHEN按阶段分组取状态,示例SQL:
SELECT CONCAT(CONCAT(order_no, '_'), sequence_no) AS order_sn, MAX(CASE WHEN operation_no = '22' THEN oper_status_code END) AS stage_22 -- 按需新增其他阶段的判断,比如operation_no为30就新增对应行 FROM database WHERE order_no LIKE 'M114244' AND release_no = '1' GROUP BY CONCAT(CONCAT(order_no, '_'), sequence_no)
- 修正表格HTML结构,先写对表头,再循环查询结果,每条订单数据输出一个完整的
<tr>行,行内按顺序放订单单元格、各阶段状态单元格。
完整修正代码
<?php // 单次查询拿到所有需要的结构化数据 $sql = "SELECT CONCAT(CONCAT(order_no, '_'), sequence_no) AS order_sn, MAX(CASE WHEN operation_no = '22' THEN oper_status_code END) AS stage22_status /* 按实际需要的阶段数,新增更多CASE WHEN语句即可 */ FROM database WHERE order_no LIKE 'M114244' AND release_no = '1' GROUP BY CONCAT(CONCAT(order_no, '_'), sequence_no)"; $stid = oci_parse($conn, $sql); oci_execute($stid); ?> <table style="width: 60%; text-align: left; position: absolute; top:220px; left:440px; font-size: 10px; border-collapse: collapse;"> <thead> <tr> <th>ORDER</th> <th>STAGE 22</th> <!-- 对应新增的阶段,新增th表头即可 --> </tr> </thead> <tbody> <?php while ($row = oci_fetch_assoc($stid)) { // 每条记录输出完整的一行 echo '<tr>'; echo '<td>'.htmlspecialchars($row['ORDER_SN']).'</td>'; echo '<td>'.htmlspecialchars($row['STAGE22_STATUS'] ?? '').'</td>'; // 对应新增的阶段,输出对应td单元格 echo '</tr>'; } ?> </tbody> </table>
实用技巧
- 从数据库取出的内容输出到HTML前,用
htmlspecialchars()做转义,避免特殊字符打乱HTML结构 - 表格样式加上
border-collapse: collapse,边框显示更规整 - 如果阶段是动态不固定的,可以先查询所有去重的
operation_no作为阶段列,再动态拼接SQL和表格结构,无需硬编码阶段号
效果参考
- 当前错误效果:

- 目标结构效果:

内容的提问来源于stack exchange,提问作者mkl13
相关产品推荐
相关产品推荐

