我已经使用这种 xmlhttprequest 方法来制作显示水质但无法正常工作的实时仪表图表?

Posted

技术标签:

【中文标题】我已经使用这种 xmlhttprequest 方法来制作显示水质但无法正常工作的实时仪表图表?【英文标题】:I've used this xmlhttprequest approach to be able to make a real-time gauge chart that shows water quality but not working? 【发布时间】:2021-12-19 07:14:01 【问题描述】:

没有这个 xmlhttprequest,仪表图可以正常工作并显示如下

但是在我在 index.php 中添加此代码后,图表突然停止显示,当出现问题时会发生这种情况(即使没有检测到错误),但我无法找出在哪里......

Index.php 自动更新/刷新仪表图表数据的代码,无需重新加载页面。

<?php
    include("connection.php");
 ?>
<html>
<head>
    <title>
    </title>

</head>
<body>
    <div class="container">
        <div id="link_wrapper">

        </div>
    </div>
</body>
</html>
<script>
function loadXMLDoc() 
  var xhttp = new XMLHttpRequest();
  xhttp.onreadystatechange = function() 
    if (this.readyState == 4 && this.status == 200) 
      document.getElementById("link_wrapper").innerHTML =
      this.responseText;
    
  ;
  xhttp.open("GET", "server.php", true);
  xhttp.send();

setInterval(function()
    loadXMLDoc();
    // 1sec
,1000);

window.onload = loadXMLDoc;
</script>

动态仪表图的Server.php代码

 <?php
        $connection = mysqli_connect('localhost', 'root', '', 'adminpanel');
        $query = 'SELECT * FROM tbl_waterquality ORDER BY id DESC';

        $query_run = mysqli_query($connection, $query);

        while ($row = mysqli_fetch_array($query_run)) 

        ?>

            <html>

            <head>
                <div class="justify-content-between">
                    <script type="text/javascript" src="https://www.gstatic.com/charts/loader.js"></script>
                    <script type="text/javascript">
                        google.charts.load('current', 
                            'packages': ['gauge']
                        );
                        google.charts.setOnLoadCallback(drawChart);

                        function drawChart() 
                            var data = google.visualization.arrayToDataTable([
                                ['Label', 'Value'],
                                ['Temperature', <?php echo $row['temperature'] ?>],
                                ['pH', <?php echo $row['pH'] ?>],
                                ['DO', <?php echo $row['DO'] ?>],
                                ['Turbidity ', <?php echo $row['Turbidity'] ?>]
                            ]);
                        <?php
                    
                        ?>
                        var options = 
                            width: 500,
                            height: 200,
                            minorTicks: 5,

                        ;

                        var chart = new google.visualization.Gauge(document.getElementById('chart_div'));
                        chart.draw(data, options);
                        
                    </script>
            </head>

            <body>
                <div id="chart_div" style="width: 400px; height: 120px,; margin-top:30px"></div>
            </body>

            </html>

【问题讨论】:

什么确切不起作用? AJAX 请求是否正确发送?服务器是否返回预期的数据(我不会假设,因为您为数据库中的每一行开始一个新的 &lt;html&gt; 块)? 【参考方案1】:

正确执行此操作的方法是仅使用 PHP 获取 DATA,然后在页面中运行它。

从您的数据库中返回 JSON 并将其传递给执行可视化的函数。

这是您的新 server.php - 已完成

<?php

  header("content-type: application/json");

  $connection = mysqli_connect('localhost', 'root', '', 'adminpanel');
  $query = 'SELECT * FROM tbl_waterquality ORDER BY id DESC';
  $query_run = mysqli_query($connection, $query);
  $row = mysqli_fetch_array($query_run); // assuming ONE result
  echo <<<EOT
  [
    ["Label", "Value"],
    ["Temperature", $row["temperature"]],
    ["pH", $row["pH"] ],
    ["DO", $row["DO"] ],
    ["Turbidity", $row["Turbidity"]]
  ]
  EOT
?>

并使用此页面调用它

在测试后取消注释 fetch 的注释

<!doctype html>
<html>
<head>
  <meta charset="utf8" />
  <title>Gauge</title>
  <script src="https://www.gstatic.com/charts/loader.js"></script>
  <script>
    /* ------------- Remove when you uncomment the fetch -----------*/
    let temp = 25; // testdata
    const arr = [
      ['Label', 'Value'],
      ['Temperature', temp],
      ['pH', 7.2],
      ['DO', 60],
      ['Turbidity ', 10]
    ]; // testdata
    /* ------------- END Remove -----------*/

    let chart;
    const options = 
      width: 500,
      height: 200,
      minorTicks: 5,
    ;
    const drawChart = arr => 
      if (!chart) chart = new google.visualization.Gauge(document.getElementById('chart_div')); // only do this once
      var data = google.visualization.arrayToDataTable(arr);
      chart.draw(data, options);
    

    const getData = () => 
      /* UNCOMMENT after test
       fetch('server.php')
         .then(response => response.json())
         .then(arr => 
           drawChart(arr);
           setTimeout(getData, 2000); // run again
         );
       */
      /* REMOVE AFTER TEST */
      drawChart(arr); // remove after test
      arr[1][1] = ++temp
      setTimeout(getData, 5000); // run again - remove after test
      /*  END REMOVE   */

    ;
    window.addEventListener("load", () =>  // when page loads
      google.charts.load('current', 
        'packages': ['gauge']
      );
      google.charts.setOnLoadCallback(getData); // start
    )
  </script>
</head>

<body>
  <div class="justify-content-between">
    <div id="chart_div" style="width: 400px; height: 120px,; margin-top:30px"></div>
  </div>
</body>
</html>

如果你需要创建一个包含所有行的数组,这里是如何循环的

http://sandbox.onlinephpfunctions.com/code/8c371c0da3a5e7a91bcf8cf1e961f822c0755e57

$arr = array(array( "Label", "Value"));
while ($row = mysqli_fetch_array($query_run)) 
  array_push($arr,
    array("Temperature", $row["temperature"]),
    array("pH", $row["pH"] ),
    array("DO", $row["DO"] ),
    array("Turbidity", $row["Turbidity"])
  );


echo json_encode($arr)

【讨论】:

您好,我会尝试一下,如果它可以工作并首先了解 json_encode 方法。另外,我目前只是在测试它,但我会将间隔设置得更长一些。谢谢。 关于您发布的第一个代码,所以一切都将保持不变,除了我将删除while? 我写的php是完整的php,我写的html和js是调用它的页面 是的,但它们仍然是动态的吗?同样在 php 中,我对 echo [ 让我们continue this discussion in chat.

以上是关于我已经使用这种 xmlhttprequest 方法来制作显示水质但无法正常工作的实时仪表图表?的主要内容,如果未能解决你的问题,请参考以下文章

如何在反应本机中使用 XMLHttpRequest 在 GET 方法的标头中传递授权令牌

如何将基本身份验证标头分配给 XMLHTTPREQUEST?

使用 JSON 制作 XmlHttpRequest POST [重复]

HTTP 补丁 XmlHttpRequest 支持

XMLHttpRequest之status

如何重新发送失败的xmlHttpRequest