基于数据库值的Network Status图标异常排查求助
问题:网站导航栏Network Status图标/文本无法按数据库值正常更新
我网站头部导航栏的Network Status文本和图标,需要根据Notices表的SeverityLevel字段(1-3)对应显示不同状态:
- SeverityLevel=1 → ok.png(绿色圆圈)
- SeverityLevel=2 → medium.png(橙色圆圈)
- SeverityLevel=3 → critical.png(红色圆圈及红色文本)
但我编写的PHP代码始终无法按预期运行,尝试修改$FoundNoticesHeader模拟不同SeverityLevel情况也没用,恳请帮忙找出问题。
我的代码如下:
<?php $DBUserName = "*******"; $DBPassword = "*******"; $HostName = "*******"; $DB = mysqli_connect($HostName, $DBUserName, $DBPassword, '*******'); //WE NEED TO SEE IF THERE ARE ANY OPEN NOTICES AND WHAT THE STATUS IS $GetNotices = "SELECT * FROM notices WHERE Status != 2 ORDER BY SeverityLevel DESC LIMIT 1"; $GotNotices = mysqli_query($DB, $GetNotices); $FoundNoticesHeader = @mysqli_num_rows($GotNotices); if ($FoundNoticesHeader == 0) { //NO NOTICES $HeaderNoticeLabel = '<a href="#" target="_blank" style="background: none; color: black"><img src="assets/img/ok.png" width=10 height=10> Network Status</a>'; } else { //HAS NOTICES while ($Val = mysqli_fetch_array($GotNotices)) { $HeaderPriority = $Val["SeverityLevel"]; } if ($HeaderPriority == 1) { $HeaderNoticeLabel = '<a href="#" style="background: none; color: black"><img src="assets/img/medium.png" width=10 height=10> Network Status</a>'; } else if ($HeaderPriority == 2) { $HeaderNoticeLabel = '<a href="#" target="_blank" style="background: none; color: black"><img src="assets/img/medium.png" width=10 height=10> Network Status</a>'; } else if ($HeaderPriority == 3) { $HeaderNoticeLabel = '<a href="#" target="_blank" style="background: none; color: red"><img src="assets/img/criticial.png" width=10 height=10> Network Status</a>'; } else { $HeaderNoticeLabel = '<a href="#" target="_blank" style="background: none; color: black"><img src="assets/img/medium.png" width=10 height=10> Network Status</a>'; } } ?>
问题分析与修复
核心问题点
- SeverityLevel映射完全错误:你定义的规则是1对应ok.png,但代码里SeverityLevel=1时却用了medium.png,完全不符合需求;
- 拼写错误:critical.png写成了
criticial.png,会导致图片加载失败; - 冗余循环:SQL已经用了
LIMIT 1,只返回一条数据,不需要用while循环,直接一次fetch即可; - 错误抑制符@滥用:
@mysqli_num_rows会掩盖数据库查询失败的错误,不利于调试; - 未处理异常情况:如果数据库连接失败或查询出错,后续逻辑会直接报错;
- 测试方式错误:修改
$FoundNoticesHeader的值无法模拟不同SeverityLevel的情况,这个变量是查询结果的行数,和优先级无关。
修正后的代码
<?php $DBUserName = "*******"; $DBPassword = "*******"; $HostName = "*******"; $DB = mysqli_connect($HostName, $DBUserName, $DBPassword, '*******'); // 初始化默认状态(无通知) $HeaderNoticeLabel = '<a href="#" target="_blank" style="background: none; color: black"><img src="assets/img/ok.png" width="10" height="10"> Network Status</a>'; // 检查数据库连接是否成功 if ($DB) { // 只查询需要的字段,提升性能 $GetNotices = "SELECT SeverityLevel FROM notices WHERE Status != 2 ORDER BY SeverityLevel DESC LIMIT 1"; $GotNotices = mysqli_query($DB, $GetNotices); // 检查查询是否成功且有结果 if ($GotNotices && mysqli_num_rows($GotNotices) > 0) { $Val = mysqli_fetch_assoc($GotNotices); $HeaderPriority = $Val["SeverityLevel"]; switch($HeaderPriority) { case 1: // 对应ok.png(绿色圆圈) $HeaderNoticeLabel = '<a href="#" target="_blank" style="background: none; color: black"><img src="assets/img/ok.png" width="10" height="10"> Network Status</a>'; break; case 2: // 对应medium.png(橙色圆圈) $HeaderNoticeLabel = '<a href="#" target="_blank" style="background: none; color: black"><img src="assets/img/medium.png" width="10" height="10"> Network Status</a>'; break; case 3: // 对应critical.png(红色圆圈+红色文本),修正拼写错误 $HeaderNoticeLabel = '<a href="#" target="_blank" style="background: none; color: red"><img src="assets/img/critical.png" width="10" height="10"> Network Status</a>'; break; default: // fallback到默认状态 break; } } mysqli_close($DB); } ?>
额外建议
- 去掉
@错误抑制符,开发时开启错误提示(error_reporting(E_ALL); ini_set('display_errors', 1);),方便排查问题; - SQL查询只获取需要的字段(如
SeverityLevel),而非*,减少数据传输; - 使用
mysqli_fetch_assoc替代mysqli_fetch_array,避免索引混淆; - 给HTML属性值加上引号(如
width="10"),符合标准语法。
内容的提问来源于stack exchange,提问作者Bjorn Lundberg
相关产品推荐
相关产品推荐

