基于现有MySQL查询结果,用PHP构建表格并按列分组
实现PHP分组表格展示方案
既然你没法调整现有的SQL语句,那咱们就把分组逻辑放到PHP层面来处理——刚好你的SQL已经按rcabbr升序排序了,这为我们在PHP里分组展示提供了天然便利。
步骤1:安全获取数据库查询结果
首先确保你正确执行SQL并拿到结果集,这里用mysqli举个实际例子(用PDO的话逻辑完全通用):
// 假设你已经建立了合法的数据库连接$conn // 先做SQL注入防护:转义输入参数 $safe_agcid = mysqli_real_escape_string($conn, $agcid); $sql = "SELECT a.name AS agcname, m.npa, m.nxx, COUNT( m.npa ) AS ooscount,e.rcabbr,s.l_state FROM MTAs m INNER JOIN AGCs a ON a.id = m.agcid LEFT JOIN endoffice.endoff e ON e.npa = m.npa INNER JOIN endoffice.state s ON s.s_state = e.state AND e.nxx = m.nxx WHERE agcid = '" . $safe_agcid . "' GROUP BY npa, nxx ORDER BY rcabbr ASC"; $result = mysqli_query($conn, $sql); // 把结果转成数组方便后续遍历处理 $data_rows = []; while ($row = mysqli_fetch_assoc($result)) { $data_rows[] = $row; }
步骤2:PHP层面按rcabbr分组生成表格
接下来我们遍历结果集,根据rcabbr的变化自动生成分组标题,同时输出结构化表格:
if (!empty($data_rows)) { echo '<table border="1" cellpadding="8" cellspacing="0" style="width: 100%; border-collapse: collapse;">'; // 输出表头 echo '<thead><tr style="background-color: #e8e8e8;">'; echo '<th>AGC名称</th><th>NPA</th><th>NXX</th><th>统计数量</th><th>所属州</th>'; echo '</tr></thead>'; $current_group = null; foreach ($data_rows as $row) { // 当分组标识rcabbr变化时,输出分组标题行 if ($row['rcabbr'] !== $current_group) { $current_group = $row['rcabbr']; echo '<tbody><tr style="background-color: #f5f5f5; font-weight: 600;">'; echo '<td colspan="5">分组:' . htmlspecialchars($current_group) . '</td>'; echo '</tr>'; } // 输出当前数据行 echo '<tr>'; echo '<td>' . htmlspecialchars($row['agcname']) . '</td>'; echo '<td>' . htmlspecialchars($row['npa']) . '</td>'; echo '<td>' . htmlspecialchars($row['nxx']) . '</td>'; echo '<td>' . htmlspecialchars($row['ooscount']) . '</td>'; echo '<td>' . htmlspecialchars($row['l_state']) . '</td>'; echo '</tr>'; } echo '</tbody></table>'; } else { echo '<p>未查询到相关数据</p>'; }
关键细节说明
- 安全防护:用
htmlspecialchars()转义所有输出内容,避免XSS攻击;同时对输入参数$agcid做了转义,杜绝SQL注入风险。 - 分组逻辑:利用SQL已按
rcabbr排序的特性,遍历过程中只需判断当前行的分组标识与上一行是否一致,不一致就输出新的分组标题,无需额外做数组分组操作。 - 样式自定义:分组标题行和表头加了基础样式,你可以根据自己的布局需求修改CSS属性(比如把内联样式移到外部样式表)。
内容的提问来源于stack exchange,提问作者Kelso
相关产品推荐
相关产品推荐

