【问题标题】:How do i get updated values from php JSON in canvasJS?如何从 canvasJS 中的 php JSON 获取更新的值?
【发布时间】:2020-02-25 11:31:49
【问题描述】:

我一直试图从 JSON 数组中获取更新的值并将其绘制在 canvasJS 上。

这是传感器 1 的 JSON 数组:

[{
    "Date": "2020-01-24 07:35:46",
    "sensorValue": 213
}, {
    "Date": "2020-01-24 07:35:46",
    "sensorValue": 433
}, {
    "Date": "2020-02-10 06:03:36",
    "sensorValue": 321
}, {
    "Date": "2020-02-10 06:03:36",
    "sensorValue": 43
}, {
    "Date": "2020-02-12 03:30:57",
    "sensorValue": 4321
}]

下面是我的 index2.php 文件

updateChart 功能似乎不起作用。我不确定这是否是正确的方法。 代码背后的基本原理:我希望每隔几秒钟使用通过 php 检索到的更新值来更新图表。如果没有更新的值,则数组不应更改。因此 for 循环和日期比较背后的原因。

<?php
    include 'getsensor.php';
?>
     <!DOCTYPE HTML>
     <html>
     <head>
     <script>
     window.onload = function() {
     <?php
        getSensor();
     ?>

     var updateInterval = 2000;
     var sensor1Data = <?php echo json_encode($json_sensor1, JSON_NUMERIC_CHECK); ?>;
     var sensor2Data = <?php echo json_encode($json_sensor2, JSON_NUMERIC_CHECK); ?>;

    //  sensor datapoints
     var sensor1 = [], sensor2 = [], sensor3 = [], sensor4 = [], sensor5 = [];

     var chart = new CanvasJS.Chart("chartContainer", {
         zoomEnabled: true,
         title: {
             text: "Soil Moisture Reading"
         },
         axisX: {
             title: "chart updates every " + updateInterval / 1000 + " secs"
         },
         axisY:{
             includeZero: false
         }, 
         toolTip: {
             shared: true
         },
         legend: {
             cursor:"pointer",
             verticalAlign: "top",
             fontSize: 22,
             fontColor: "dimGrey",
             itemclick : toggleDataSeries
         },
         data: [{ 
                 type: "line",
                 name: "Sensor 1",
                 dataPoints: sensor1
             },
             {
                 type: "line",
                 name: "Sensor 2",
                 dataPoints: sensor2
             }]
     });

    for(var i = 0; i < sensor1Data.length; i++) {
        sensor1.push({ 
            x: new Date(sensor1Data[i].Date), 
            y: Number(sensor1Data[i].sensorValue)
        })
    }

    for(var i = 0; i < sensor2Data.length; i++) {
        sensor2.push({ 
            x: new Date(sensor2Data[i].Date), 
            y: Number(sensor2Data[i].sensorValue)
        })
    }

     chart.render();
     setInterval(function(){updateChart()}, updateInterval);

     function toggleDataSeries(e) {
         if (typeof(e.dataSeries.visible) === "undefined" || e.dataSeries.visible) {
             e.dataSeries.visible = false;
         }
         else {
             e.dataSeries.visible = true;
         }
         chart.render();
     }

     function updateChart() {
         // retrieves new data from database. updates and shifts the graph.
        <?php
            getSensor();
        ?>
        var sensor1DataNew = <?php echo json_encode($json_sensor1, JSON_NUMERIC_CHECK); ?>;

        var i = sensor1DataNew.length - 1;
        // retrieve the index of the new value
        for (i; i > 0; i--){
            if (sensor1DataNew[i].Date == sensor1Data[19].Date){
                break;
            }
        }

        // pushes the new values to be plotted
        for(i; i < sensor1DataNew.length; i++) {
            sensor1.push({ 
                x: new Date(sensor1DataNew[i].Date), 
                y: Number(sensor1DataNew[i].sensorValue)
            })
        }

        if(sensor1.length > 20){
            sensor1.shift();
        }

        chart.render();
     }

    }
     </script>
     </head>
     <body>
     <div id="chartContainer" style="height: 370px; width: 100%;"></div>
     <script src="https://canvasjs.com/assets/script/canvasjs.min.js"></script>
     </body>
     </html>

这是我的 getSensor.php 文件:

<?php
        require_once 'mysqldb.php';

        $json_sensor1 = array();
        $json_sensor2 = array();
        $json_sensor3 = array();

        function getSensor(){
            global $json_sensor1, $json_sensor2, $json_sensor3;
            global $db_host, $db_user, $db_pass, $db_name;
            /* start connection */
            $conn = mysqli_connect($db_host, $db_user, $db_pass, $db_name);

            /* check connection */
            if (mysqli_connect_errno()) {
                printf("Connection failed: %s\n", mysqli_connect_error());
                exit();
            }

            # get/display datetime and sensor value        
            $sensor1 = 'SELECT Date, sensorValue  FROM sensor WHERE sensorName = "sensor 1" ORDER BY ID ASC, Date DESC LIMIT 20';
            $sensor2 = 'SELECT Date, sensorValue  FROM sensor WHERE sensorName = "sensor 2" ORDER BY ID ASC, Date DESC LIMIT 20';
            $sensor3 = 'SELECT Date, sensorValue  FROM sensor WHERE sensorName = "sensor 3" ORDER BY ID ASC, Date DESC LIMIT 20';

            // $sensor3 = 'SELECT Date, sensorName, sensorValue  FROM sensor WHERE Date IN (SELECT MAX(Date) FROM sensor WHERE sensorName = "sensor 3") ORDER BY ID ASC, Date DESC';

            $json_sensor1 = sqlQuery($conn,$sensor1);
            $json_sensor2 = sqlQuery($conn,$sensor2);
            $json_sensor3 = sqlQuery($conn,$sensor3);

            /* close connection */
            mysqli_close($conn);
        }

        function sqlQuery($conn,$sql_query){
            $json_array = array();
            if($query = mysqli_query($conn,$sql_query)){
                while($row = mysqli_fetch_array($query, MYSQLI_ASSOC)){
                    $json_array[] = $row;
                }
                /* free result set */
                mysqli_free_result($query);
            }
            return $json_array;
        }
?>

【问题讨论】:

    标签: javascript php canvasjs


    【解决方案1】:

    我无法发表评论,但我认为问题在于您加载数据的方式(或缺少数据)。

    基本上,您在 PHP 页面渲染上加载数据一次,仅此而已。 您需要一些 ajax 请求定期加载数据,而不是 updateChart 方法中的 PHP 回显。 (初始化部分没问题)

    $.ajax({
        type: "GET", 
        url: 'getSensorData.php',
        dataType: "text", 
        async: false,
        success: function(data){
            sensor1DataNew = data;
        }
    });
    

    这样的事情可能会起作用(使用一点 jquery)

    【讨论】:

    • 我调用updateChart函数时不是数据加载了吗?在 updateChart 函数中,我调用了将更新数组 $json_sensor1 的 php 函数 getSensor。我将 $json_sensor1 声明为 php 中的全局变量。我已经添加了我的 getSensor.php 代码
    • 尝试使用 Chrome 的开发者工具查看数据是否发生变化。您会看到,即使您通过 PHP“调用”该函数,数据也只会在您重新加载页面时更新。这是 PHP 的“限制”,因为它在页面加载时加载所有函数一次,并且数据保持静态,直到页面再次重新加载。不幸的是,你不能像这样混合和匹配 javascript 和 PHP。如果一个页面需要在不刷新页面的情况下加载数据,那么不幸的是你被旧的 js 卡住了。
    猜你喜欢
    • 2021-06-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多