You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

基于数据库值的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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.12 10:05:24