
本文介绍如何在使用 PDO::FETCH_NUM 获取 MySQL 查询结果后,动态为表格中 52–120 范围内的数值单元格添加红色样式,解决因使用数值索引导致的字段定位与条件判断困难问题。
本文介绍如何在使用 `pdo::fetch_num` 获取 mysql 查询结果后,动态为表格中 52–120 范围内的数值单元格添加红色样式,解决因使用数值索引导致的字段定位与条件判断困难问题。
在使用 PDO 执行 SQL 查询并调用 fetch(PDO::FETCH_NUM) 时,返回的是以数字索引(0, 1, 2…)组织的一维数组,而非关联键名(如 'downstream_snr')。这虽然便于遍历,但也意味着无法直接通过字段名判断语义——因此,若需对某列(例如 downstream_snr,对应索引 2)做条件格式化,必须明确其位置,并在循环中按索引识别。
但注意:题目需求是「所有列中值在 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); // 使用 fetchAll 更清晰;避免遗漏首行
if (count($rows) > 0) {
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];
// 仅对可转为数字的字段应用颜色逻辑(避免对 mac_address、uptime 字符串误判)
if (is_numeric($value) && $value >= 52 && $value <= 120) {
$color = 'red';
} else {
$color = 'inherit'; // 保持默认文本色,不强制 green(原答案中 green 易误导)
}
echo "<td style=\"color: $color;\">" . htmlspecialchars($value) . "</td>";
}
echo "</tr>";
}
echo '</tbody></table>';
} else {
echo "<p>0 results</p>";
}✅ 关键改进说明:
- 使用
prepare()+ 参数绑定替代拼接 SQL,防止 SQL 注入; - 用
fetchAll()统一获取全部结果,避免fetch()跳过首行(原代码中$nRows = $stmt->fetch(...)已提前取走第一行,导致while循环漏显); - 增加
<thead>/<code><tbody> 语义化结构,提升可访问性与 CSS 控制力; <li>加入 <code>is_numeric()校验,确保只对数值型字段(如upstream,downstream_snr)执行范围判断,避免将 MAC 地址或时间字符串错误着色; - 使用
htmlspecialchars()防止 XSS(尤其当字段含用户输入内容时); -
color: inherit替代硬编码green,让非目标值保持自然文本色,更符合设计直觉。 - 若仅需对特定列(如第 2 列
downstream_snr)着色,请将条件改为if ($i === 2 && is_numeric($value) && $value >= 52 && $value ; - 如需更灵活的样式(如背景色、图标、工具提示),建议改用 CSS 类 + JavaScript(如 DataTables 插件),而非内联样式;
- 数值比较前务必确保字段为数字类型(MySQL 中
VARCHAR存储的数字需显式转换)。
⚠️ 注意事项:
通过上述方式,即可稳健、安全、可维护地实现基于数值范围的表格条件着色。

















