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

如何在图标卡片中输出不同MySQL查询结果?现有方案失效求助

解决图标卡片显示MySQL查询结果的问题

首先,咱们先梳理下你当前遇到的问题,然后一步步调整到左侧卡片的展示效果:

1. 先开启PHP错误提示,排查隐藏问题

你现在控制台没报错,但卡片空内容,大概率是PHP连接或查询出错了,但错误被系统屏蔽了。在页面最顶部加上这段代码,就能看到具体的错误信息:

error_reporting(E_ALL);
ini_set('display_errors', 1);

2. 修复数据库连接与查询逻辑

你的代码每个卡片都重新建立一次数据库连接,既浪费资源又容易出问题,而且查询结果的处理也不够完善。咱们把连接抽出来统一管理,同时处理空结果的情况:

// 页面顶部统一建立数据库连接
$connect = mysqli_connect("localhost", "user", "password!", "test");
// 检查连接是否成功
if (!$connect) {
    die("数据库连接失败: " . mysqli_connect_error());
}

另外要注意:如果你的date字段是datetime类型,得用DATE(date) = CURDATE()来匹配日期,避免时间部分干扰查询结果。

3. 调整卡片内的输出格式,匹配左侧样式

你之前输出的['时间']格式不符合卡片的展示逻辑,左侧卡片应该是显眼的数值+下方的描述文本,咱们修改输出部分:

<div class="mr-5">
    <?php
    $query = "SELECT SUBSTRING(AVG(TIME_FORMAT(`time`, '%i:%s')), 2, 5) AS `time` FROM test.time WHERE DATE(`date`) = CURDATE()";
    $result = mysqli_query($connect, $query);
    $row = mysqli_fetch_assoc($result);
    // 如果没有查询到数据,显示默认值--
    $avgTime = $row['time'] ?? '--';
    ?>
    <div class="h5 mb-0 font-weight-bold"><?php echo $avgTime; ?></div>
    <div class="text-white-50">今日平均处理时长</div>
</div>

4. 多卡片的复用方案(如果需要多个不同查询的卡片)

如果要做多个卡片,每个对应不同的查询,咱们可以把卡片配置和查询封装成数组,循环生成卡片,这样代码更整洁易维护:

// 定义所有卡片的配置:图标、背景色、标题、查询语句
$cards = [
    [
        'icon' => 'fas fa-fw fa-clock',
        'bgClass' => 'bg-primary',
        'title' => '今日平均处理时长',
        'query' => "SELECT SUBSTRING(AVG(TIME_FORMAT(`time`, '%i:%s')), 2, 5) AS `time` FROM test.time WHERE DATE(`date`) = CURDATE()"
    ],
    [
        'icon' => 'fas fa-fw fa-users',
        'bgClass' => 'bg-success',
        'title' => '今日访问用户数',
        'query' => "SELECT COUNT(DISTINCT user_id) AS count FROM test.logs WHERE DATE(created_at) = CURDATE()"
    ],
    // 可以继续添加更多卡片
];
?>

<!-- Icon Cards-->
<div class="row">
    <?php foreach ($cards as $card): ?>
        <div class="col-xl-3 col-sm-6 mb-3">
            <div class="card text-white <?php echo $card['bgClass']; ?> o-hidden h-100">
                <div class="card-body">
                    <div class="card-body-icon">
                        <i class="<?php echo $card['icon']; ?>"></i>
                    </div>
                    <div class="mr-5">
                        <?php
                        $result = mysqli_query($connect, $card['query']);
                        $row = mysqli_fetch_assoc($result);
                        // 自动获取查询结果的第一个字段值,无数据则显示--
                        $value = $row ? reset($row) : '--';
                        ?>
                        <div class="h5 mb-0 font-weight-bold"><?php echo $value; ?></div>
                        <div class="text-white-50"><?php echo $card['title']; ?></div>
                    </div>
                </div>
            </div>
        </div>
    <?php endforeach; ?>
</div>

<?php
// 页面末尾关闭数据库连接
mysqli_close($connect);
?>

为什么之前的代码没显示内容?

  • 可能是查询没有返回数据(比如今天还没有相关记录),但你的代码没有处理空结果的情况,所以输出为空;
  • 也可能是数据库连接失败,但因为没开错误提示,看不到报错信息;
  • 你之前输出的['时间']格式不符合卡片的CSS样式,可能被隐藏或者视觉上看起来是空的。

另外,之前Ajax导致页面崩溃,大概率是因为请求逻辑有问题(比如循环请求、没有正确处理回调),用PHP直接渲染的方式更适合这种后台统计卡片的场景,性能更稳定。

内容的提问来源于stack exchange,提问作者a.parkes

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.11 08:54:32