
本文详解如何在使用 PDO::FETCH_NUM 获取数据库表格数据后,对特定列(如下行信噪比)的数值进行动态颜色标记,例如将 52–120 区间值设为红色,其余设为绿色,并确保 HTML 表格结构正确、样式可维护。
本文详解如何在使用 `pdo::fetch_num` 获取数据库表格数据后,对特定列(如下行信噪比)的数值进行动态颜色标记,例如将 52–120 区间值设为红色,其余设为绿色,并确保 html 表格结构正确、样式可维护。
在使用 PDO::FETCH_NUM 获取 MySQL 查询结果时,返回的是以数字索引([0], [1], …)组织的一维数组,而非关联键名(如 ['downstream_snr'])。这虽利于快速遍历,但若需对特定列(如第 2 列 downstream_snr)做条件格式化,就不能依赖字段名,而应基于列索引进行判断。
原始代码中存在多个关键问题:
-
$nRows = $stmt->fetch(...)仅获取首行,导致后续while循环实际从第二行开始,且$nRows > 0判断逻辑错误(fetch()返回数组或false,不能直接与数字比较); <th> 标签中 <code>id="DWS"前缺少闭合引号,HTML 结构损坏;-
style="$colour"未定义变量$colour,且未对不同列差异化着色。
✅ 正确做法是:在遍历每行时,用 for 循环逐列处理,对目标列(如索引 2 对应 downstream_snr)应用条件判断:
$sql = "SELECT mac_address, upstream, downstream_snr, downstream, uptime FROM modems WHERE rpi_serial = ?";
$stmt = $pdo->prepare($sql);
$stmt->execute([$rpi]);
$rows = $stmt->fetchAll(PDO::FETCH_NUM);
if (empty($rows)) {
echo "0 results";
} else {
echo '<table class="table table-bordered table-condensed table-hover" id="modems">
<thead>
<tr>
<th class="col-md-5ths" id="MC">Mac</th>
<th class="col-md-5ths">Upstream</th>
<th class="col-md-5ths" id="DWS">Downstream SNR</th>
<th class="col-md-5ths" id="DW">Downstream</th>
<th class="col-md-5ths">Uptime</th>
</tr>
</thead>
<tbody>';
foreach ($rows as $row) {
echo "<tr>";
for ($i = 0; $i < count($row); $i++) {
$value = $row[$i];
// 仅对第3列(索引2:downstream_snr)应用颜色规则;其他列保持默认
if ($i === 2 && is_numeric($value)) {
$color = ($value >= 52 && $value <= 120) ? 'red' : 'green';
echo "<td style=\"color: $color;\">". htmlspecialchars($value) ."</td>";
} else {
echo "<td>". htmlspecialchars($value) ."</td>";
}
}
echo "</tr>";
}
echo '</tbody></table>';
}? 关键优化说明:
- 使用
prepare()+execute()防止 SQL 注入,比拼接$rpi更安全; -
fetchAll()一次性获取全部数据,避免游标位置错乱; - 明确区分
<thead> 和 <code><tbody>,提升语义化与可维护性; <li>对 <code>downstream_snr列(索引2)单独判断,避免误染其他列(如 MAC 地址或字符串型 uptime); - 添加
is_numeric()校验,防止非数字值触发警告; - 使用
htmlspecialchars()转义输出,防御 XSS 攻击。 - 将颜色逻辑抽离为函数(如
getSnColor($val)),便于复用与测试; - 改用 CSS 类(如
class="snr-low"/snr-normal")替代内联样式,利于主题定制; - 若需响应式高亮(如悬停显示阈值提示),可结合
data-*属性 + JavaScript 实现。
? 进阶建议:
通过精准控制列索引与类型校验,即可在保持 FETCH_NUM 性能优势的同时,实现灵活、健壮的条件格式化。

















