
本文讲解如何在使用 PDO::FETCH_NUM 获取 MySQL 查询结果后,对特定列(如 Downstream SNR)中 52–120 范围内的数值动态添加红色样式,解决因使用数值索引导致字段逻辑判断困难的问题。
本文讲解如何在使用 `pdo::fetch_num` 获取 mysql 查询结果后,对特定列(如 downstream snr)中 52–120 范围内的数值动态添加红色样式,解决因使用数值索引导致字段逻辑判断困难的问题。
在使用 PDO::FETCH_NUM 时,结果以纯数字索引数组(如 $row[0], $row[1]…)形式返回,无法通过字段名直接识别语义,因此条件格式化需明确指定目标列索引。根据你的 SQL 查询:
SELECT mac_address, upstream, downstream_snr, downstream, uptime FROM modems ...
各字段对应索引为:
-
mac_address→$row[0](字符串,不参与数值判断) -
upstream→$row[1] -
downstream_snr→$row[2]✅(需高亮的列) -
downstream→$row[3] -
uptime→$row[4]
因此,仅应对 $row[2](Downstream SNR)应用 52–120 的颜色规则,其他列保持默认样式。
以下是完整、安全、可维护的渲染逻辑(含错误处理与结构修复):
$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 '
| Mac | Upstream | Downstream SNR | Downstream | Uptime |
|---|---|---|---|---|
| $value | "; } } echo "
✅ 关键改进说明:
- 使用
prepare()+ 参数绑定防止 SQL 注入; -
fetchAll()替代fetch()避免首行丢失(原代码中$nRows = $stmt->fetch(...)已消耗第一行); - 显式区分
<thead> 和 <code><tbody> 提升语义化与可访问性; <li>对 <code>$row[2]增加is_numeric()校验,避免非数字值(如NULL或空字符串)触发警告; - 使用
'inherit'代替'green'保持非目标列样式中立,避免意外覆盖 CSS 主题; - 修复 HTML 错误:原
<th> 中 <code>id="DWS">Downstream SNR缺少闭合引号,已修正。 ? 进阶建议:
若需多列条件格式(如同时高亮upstream异常值),可将规则抽象为关联数组:$rules = [ 2 => ['min' => 52, 'max' => 120, 'color' => 'red'], // downstream_snr 1 => ['min' => 0, 'max' => 30, 'color' => 'orange'] // upstream too low ];再在循环中动态匹配
$rules[$i],提升可扩展性。










