【问题标题】:Redraw google chart based on user input via AJAX request通过 AJAX 请求根据用户输入重绘谷歌图表
【发布时间】:2016-12-21 05:38:08
【问题描述】:

我有一个从我的数据库中提取数据的谷歌图表,它可以按我的意愿工作。根据 URL 中的 get 请求,它从选定的表中提取数据。

我想根据从下拉菜单中选择的表格通过 ajax 更新此图表。我无法突破的部分是通过 ajax 让数据响应。我认为下面的代码很接近,但我得到了下面我似乎无法摆脱的错误。

getdata.php:22 Uncaught ReferenceError: $ is not defineddrawVisualization@getdata.php:22onchange@getdata.php:47

我尝试从 getdata.php 中删除 GET 请求并硬编码一个表,认为 $ 未定义,但这并没有解决错误。

工作图代码

<!DOCTYPE>
<html>
<head> 
<meta http-equiv="content-type" content="text/html; charset=utf-8"/>
<title>
Wind Graph
</title>
<script type="text/javascript" src="http://www.google.com/jsapi"></script>
<script type="text/javascript">
google.load('visualization', '1', {packages: ['corechart']});
</script>
<script type="text/javascript">

function drawVisualization() {

var data = new google.visualization.DataTable();

<?php
require("dbconnect.php");

echo " data.addColumn('string', 'Time');";
echo " data.addColumn('number', 'Wind_Speed');";
echo " data.addColumn('number', 'Wind_Gust');";

$db = mysql_connect($server, $user_name, $password);
mysql_select_db($database);

$sqlQuery = "SELECT * FROM ".$_GET['q']." WHERE Date(Time + INTERVAL 10 HOUR) = Date(UTC_TIMESTAMP() + INTERVAL 10 HOUR)";
$sqlResult = mysql_query($sqlQuery);
while ($row = mysql_fetch_assoc($sqlResult)) {

echo " data.addRow(['{$row['Time']}', {v: {$row['Wind_Speed']}, f: '{$row['Wind_Speed']}' }, {v: {$row['Wind_Gust']}, f: '{$row['Wind_Gust']}' } ]); ";

}

?>

// Create and draw the visualization.
new google.visualization.LineChart(document.getElementById('visualization')).
draw(data, {curveType: "none",
title: "AU0001 Wind Chart",
titleTextStyle: {color: "orange"},
//width: 800, height: 400,
//vAxis: {maxValue: 10},
vAxis: {minValue: 0},
vAxis: {title: 'Wind Speed (Knots)'},
vAxis: {baseline: 0},
vAxis: {gridlines: {count: 10}  },
vAxis: {title: "Wind Speed (Knots)", titleTextStyle: {color: "orange"}},
hAxis: {title: "Time", titleTextStyle: {color: "orange"}},
interpolateNulls: 1
}
);
}

google.setOnLoadCallback(drawVisualization);
</script>
</head>
<body>
<div id="visualization" style="width: 100%; height: 400px;"></div>
</body>
</html>

带有 AJAX 请求的新代码

<!DOCTYPE>
<html>
<head> 
<meta http-equiv="content-type" content="text/html; charset=utf-8"/>
<title>
Wind Graph
</title>
<script type="text/javascript" src="http://www.google.com/jsapi"></script>
<script type="text/javascript">
google.load('visualization', '1', {packages: ['corechart']});
</script>
<script type="text/javascript">

function drawVisualization(num) {

var data = new google.visualization.DataTable(TableData);
var TableData = $.ajax({
  url: "getdata.php",
  data: "q="+num,
  dataType:"json",
  async: false
}).responseText;

// Create and draw the visualization.
new google.visualization.LineChart(document.getElementById('visualization')).
draw(data, {curveType: "none",
title: "Wind Chart",
titleTextStyle: {color: "orange"},
//width: 800, height: 400,
//vAxis: {maxValue: 10},
vAxis: {minValue: 0},
vAxis: {title: 'Wind Speed (Knots)'},
vAxis: {baseline: 0},
vAxis: {gridlines: {count: 10}  },
vAxis: {title: "Wind Speed (Knots)", titleTextStyle: {color: "orange"}},
hAxis: {title: "Time", titleTextStyle: {color: "orange"}},
interpolateNulls: 1
}
);
}

//  google.setOnLoadCallback(drawVisualization);
</script>
</head>
<body style="font-family: Arial;border: 0 none;">
<form>
<select name="users" onchange="drawVisualization(this.value)">
<option value="">Select unit:</option>
<option value="0001">0001</option>
<option value="0002">0002</option>

</select>
</form>
<div id="visualization" style="width: 100%; height: 400px;"></div>
</body>
</html>

getdata.php 代码

<?php
require("dbconnect.php");

echo " data.addColumn('string', 'Time');";
echo " data.addColumn('number', 'Wind_Speed');";
echo " data.addColumn('number', 'Wind_Gust');";

$db = mysql_connect($server, $user_name, $password);
mysql_select_db($database);


$sqlQuery = "SELECT * FROM ".$_GET['q']." WHERE Date(Time + INTERVAL 10 HOUR) = Date(UTC_TIMESTAMP() + INTERVAL 10 HOUR)";
$sqlResult = mysql_query($sqlQuery);
while ($row = mysql_fetch_assoc($sqlResult)) {

echo " data.addRow(['{$row['Time']}', {v: {$row['Wind_Speed']}, f: '{$row['Wind_Speed']}' }, {v: {$row['Wind_Gust']}, f: '{$row['Wind_Gust']}' } ]); ";

}

?>

【问题讨论】:

    标签: php ajax google-visualization


    【解决方案1】:

    推荐使用php获取google接受的格式的json

    以下是使用ajax从php获取json数据并绘制google图表的完整示例

    php

    <?php
      require("dbconnect.php");
    
      $db = mysql_connect($server, $user_name, $password);
      mysql_select_db($database);
    
      $sqlQuery = "SELECT * FROM ".$_GET['q']." WHERE Date(Time + INTERVAL 10 HOUR) = Date(UTC_TIMESTAMP() + INTERVAL 10 HOUR)";
      $sqlResult = mysql_query($sqlQuery);
    
      $rows = array();
      $table = array();
    
      $table['cols'] = array(
          array('label' => 'Time', 'type' => 'string'),
          array('label' => 'Wind_Speed', 'type' => 'number'),
          array('label' => 'Wind_Gust', 'type' => 'number')
      );
    
      while ($row = mysql_fetch_assoc($sqlResult)) {
        $temp = array();
        $temp[] = array('v' => (string) $row['Time']);
        $temp[] = array('v' => (float) $row['Wind_Speed']);
        $temp[] = array('v' => (float) $row['Wind_Gust']);
        $rows[] = array('c' => $temp);
      }
    
      $table['rows'] = $rows;
    
      echo json_encode($table);
    ?>
    

    不推荐使用 --> async: false
    或内联事件处理程序 --> &lt;select name="users" onchange="drawVisualization(this.value)"&gt;

    另外,hAxisvAxis 在图表选项中只能出现一次

    html/javascript

    <!DOCTYPE>
    <html>
      <head>
        <meta http-equiv="content-type" content="text/html; charset=utf-8"/>
        <title>
          Wind Graph
        </title>
        <script src="http://www.google.com/jsapi"></script>
        <script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
        <script>
          google.load('visualization', '1', {
            // google-vis callback
            callback: function () {
              // add event listener to select element
              $("#users").change(drawChart);
    
              function drawChart() {
                $.ajax({
                  url: 'getdata.php',
                  // use value from select element
                  data: 'q=' + $("#users").val(),
                  dataType: 'json',
                  success: function (responseText) {
                    // use response from php for data table
                    var data = new google.visualization.DataTable(responseText);
                    new google.visualization.LineChart(document.getElementById('visualization')).
                    draw(data, {
                      curveType: 'none',
                      title: 'Wind Chart',
                      titleTextStyle: {
                        color: 'orange'
                      },
                      interpolateNulls: 1
                    });
                  },
                  error: function(jqXHR, textStatus, errorThrown) {
                    console.log(errorThrown + ': ' + textStatus);
                  }
                });
              }
            },
            packages: ['corechart']
          });
        </script>
      </head>
      <body style="font-family: Arial;border: 0 none;">
        <form>
          <select id="users">
            <option value="" selected disabled>Select unit:</option>
            <option value="0001">0001</option>
            <option value="0002">0002</option>
          </select>
        </form>
        <div id="visualization" style="width: 100%; height: 400px;"></div>
      </body>
    </html>
    

    【讨论】:

    • 嗨@WhiteHat,感谢您的帮助!我在 html 文件的页面加载时收到以下错误: graphindexnew1.php:14 Uncaught ReferenceError: $ is not definedcallback @ graphindexnew1.php:14 它指向这行代码$("#users").change(drawChart);
    • 您是否在某处包含了 jquery?假设它在那里,$.ajax 已经在那里,请参阅上面答案的编辑..
    • 就是这样!非常感谢你!上面的代码有效
    猜你喜欢
    • 1970-01-01
    • 2013-05-16
    • 2016-05-17
    • 1970-01-01
    • 2018-02-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多