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

如何修改server.php实现仪表盘与折线图实时数据同时输出

解决方案

1. 重写server.php代码

你现有server.php存在重复连接数据库、返回数据格式错误、未同时返回两种图表所需数据的问题,直接替换为以下代码即可:

<?php
error_reporting(E_ALL);
header("content-type: application/json");
// 单次连接数据库
$connection = mysqli_connect('localhost', 'root', '', 'adminpanel');

// 1. 查询最新1条数据用于仪表盘
$gaugeQuery = 'SELECT temperature, pH, DO, Turbidity FROM tbl_waterquality ORDER BY id DESC LIMIT 1';
$gaugeResult = mysqli_query($connection, $gaugeQuery);
$gaugeRow = mysqli_fetch_array($gaugeResult);
// 组装仪表盘所需数据格式
$gaugeData = [
    ["Label", "Value"],
    ["Temperature", $gaugeRow["temperature"]],
    ["pH", $gaugeRow["pH"]],
    ["DO", $gaugeRow["DO"]],
    ["Turbidity", $gaugeRow["Turbidity"]]
];

// 2. 查询历史时序数据用于折线图,LIMIT限制条数避免加载过慢
$lineQuery = 'SELECT water_level, UNIX_TIMESTAMP(CONCAT_WS(" ", sensor_date , sensor_time)) AS datetime 
FROM tbl_waterquality ORDER BY sensor_date DESC, sensor_time DESC LIMIT 50';
$lineResult = mysqli_query($connection, $lineQuery);
// 组装折线图所需数据格式
$lineData = [
    ["Date Time", "Water Level (ft)"]
];
while ($row = mysqli_fetch_array($lineResult)) {
    // 转换为Google Charts支持的js日期格式
    $lineData[] = [
        "Date(" . $row["datetime"] . "000)",
        (float)$row["water_level"]
    ];
}

// 统一返回两种数据
echo json_encode([
    'gauge' => $gaugeData,
    'line' => $lineData
]);
?>

注意:如果折线图需要展示温度而非水位,把查询语句里的water_level替换为temperature即可

2. 修改index.php前端逻辑

现有前端共用同一个数据源渲染两种图表的逻辑不成立,两种图表所需数据结构完全不同,替换js部分代码为以下内容:

<script src="https://www.gstatic.com/charts/loader.js"></script>
<script>
let lineChart, gauge;
const lineOptions = {
    title: "Sensors Data",
    legend: { position: "bottom" },
    chartArea: { width: "80%", height: "70%" }
};
const gaugeOptions  = {
    width: 500,
    height: 200,
    minorTicks: 5,
};

// 分别渲染两个图表
const drawCharts = (gaugeArr, lineArr) => {
    // 初始化仪表盘
    if (!gauge) gauge = new google.visualization.Gauge(document.getElementById('gauge_div'));
    const gaugeData = google.visualization.arrayToDataTable(gaugeArr);
    gauge.draw(gaugeData, gaugeOptions);

    // 初始化折线图
    if (!lineChart) lineChart = new google.visualization.LineChart(document.getElementById('linechart_div'));
    const lineData = google.visualization.arrayToDataTable(lineArr);
    lineChart.draw(lineData, lineOptions);
}

const getData = () => {
    fetch('server.php')
        .then(response => response.json())
        .then(res => {
            drawCharts(res.gauge, res.line);
            setTimeout(getData, 2000); // 2秒刷新一次
        });
};

window.addEventListener("load", () => {
    google.charts.load('current', {
        'packages': ['gauge','corechart']
    });
    google.charts.setOnLoadCallback(getData);
})
</script>
</head>
<body>
    <div id="gauge_div" style="width: 400px; height: 120px; margin-top:30px"></div>
    <div id="linechart_div" style="width: 900px; height: 300px; margin-top:30px;"></div>
</body>

注意:原有折线图的高度设置过小,可自行调整div的宽高参数适配页面展示

内容的提问来源于stack exchange,提问作者Corbin Jones

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.27 12:27:02