Google Vis аннотированная временная шкала из базы данных SQL с использованием PHP JSON - PullRequest
1 голос
/ 28 марта 2011

Я пытаюсь создать простую аннотированную временную шкалу из базы данных PostgreSQL, используя сценарий PHP на стороне сервера для доступа к данным из базы данных, а затем сценарий на стороне клиента JavaScript для отображения графика. Там довольно простые вещи. Теперь, как вы можете догадаться, при посещении страницы ничего не появляется.

Итак, вот что я получил: когда я посмотрел на мои файлы журнала apache, я вижу, что мой PHP-скрипт правильно разбирается, и когда я использую гиперссылку (включая все дополнительные вкусности, к которым мой JavaScript правильно добавлен спросите PHP, что он хочет от базы данных) Я вижу ответ в правильном формате Google. По крайней мере, я так думаю. Я, КИНДА, думаю, что проблема может заключаться в том, что ответ от моей функции PHP на самом деле имеет неправильный синтаксис для объекта аннотированной временной шкалы Google, но я не могу найти достаточно документации, чтобы доказать, что это правда или нет.

Вот усеченная версия того, что выдает моя функция PHP:

Google.visualization.Query.setResponse({version:'0.5',reqId:'0',status:'ok',table:{cols: [{id:'date',label:"date",type:'datetime'},{id:'temp',label:"temp",type:'number'}],
rows: [{c:[{v:new Date(2011,2,22,13,47,26),f:"03\/22\/2011 01:47pm"},{v:132.8,f:"133"}]},{c:[{v:new Date(2011,2,22,13,48,57),f:"03\/22\/2011 01:48pm"},{v:136.8,f:"137"}]},
       {c:[{v:new Date(2011,2,22,13,56,49),f:"03\/22\/2011 01:56pm"},{v:132.8,f:"133"}]},{c:[{v:new Date(2011,2,22,13,58,42),f:"03\/22\/2011 01:58pm"},{v:128.8,f:"129"}]},
       {c:[{v:new Date(2011,2,22,14,1,26),f:"03\/22\/2011 02:01pm"},{v:124.8,f:"125"}]},{c:[{v:new Date(2011,2,22,14,4,19),f:"03\/22\/2011 02:04pm"},{v:128.8,f:"129"}]},{c:[{v:new Date(2011,2,22,14,5,51),f:"03\/22\/2011 02:05pm"},{v:132.8,f:"133"}]},

И это продолжается, конечно, но я решил, что дам вам представление о том, что я вижу, а не усыплю вас полным дампом.

Теперь я знаю, вставив document.write («попал сюда»); вроде как тэги в мой JavaScript, я могу сказать, что программа завершает работу и не выдает никаких сумасшедших ошибок из-за глупых упущений с моей стороны ... (открывая рот для подготовки, чтобы вставить ногу) ... Однако как-то из того, что я читал в другом месте, этот ответ на запрос выглядит как-то неправильно отформатированным (я изменил форматирование и вставил пробел для удобства чтения в этом посте, поэтому, если вы видите что-то не так с пробелом, это, скорее всего, я). Я включу и мой PHP, и мой код JavaScript в нижней части этого поста. Если кто-нибудь увидит что-то вопиющее, что я пропустил, или поймете, в чем может быть проблема, я был бы очень признателен за помощь!

Спасибо всем заранее!

JavaScript index.html

<html> 
  <head> 
      <script type="text/javascript" src="http://www.google.com/jsapi"></script> 
          <script type="text/javascript"> 
        google.load("visualization", "1", {packages:["annotatedtimeline"]});
        google.setOnLoadCallback(drawChart);
        function drawChart() {
                var query = new google.visualization.Query('/vis.php');
            query.setQuery('SELECT date,temp FROM temp1 ORDER BY date');
            query.send(function(result) {
                document.write(result.getDetailedMessage());
                  if(result.isError()) {
                  alert(result.getDetailedMessage());

            } else {

                var data = result.getDataTable();
            var chart = new google.visualization.AnnotatedTimeLine(document.getElementById('chart_div'));                   
            chart.draw(data,{displayAnnotations: false});
                 }
               });
               }
            </script> 
      </head> 
    <body> 
    <div id="chart_div"></div> 
  </body> 
 </html> 

PHP vis.php

<?php
require_once 'MC/Google/Visualization.php';

$user = 'postgres';
$db = new PDO('pgsql:host=localhost;dbname=house',$user,'');
$vis = new MC_Google_Visualization($db,'postgres');

$vis->addEntity('temp1', array(
'fields' => array(
'date' => array('field' => 'date', 'type' => 'datetime'),
'temp' => array('field' => 'temp', 'type' => 'number')
   )
));

$vis->setDefaultEntity('temp1');
$vis->handleRequest();
?>

-------------------------------------------- --------------------------------------------

РЕДАКТИРОВАТЬ: Предупреждение функционального кода!

Хорошо, вот где я сейчас нахожусь, этот код работает, но, конечно, ничего не извлекает из моей базы данных. Как видите, форматирование точно такое же, как я получал из функции PHP выше.

ФУНКЦИОНАЛЬНЫЙ КОД но не то, что я ищу

<html> 
  <head> 
      <script type="text/javascript" src="http://www.google.com/jsapi"></script> 
          <script type="text/javascript"> 
       google.load("visualization", "1", {packages:["annotatedtimeline"]});
       google.setOnLoadCallback(drawChart);
           function drawChart() {
                  var data = new google.visualization.DataTable( 
                  { 
                cols: [{id:'date',label: 'date', type: 'datetime'}, 
                       {id:'level',label: 'level', type: 'number'}], 
                rows: [ 
                       {c:[{v: new Date(2011,2,24,6,52,26),f:"03\/24\/2011 06:52am"}, {v:91.4,f:"91"} ]}, 
                       {c:[{v: new Date(2011,2,25,7,35,20),f:"03\/25\/2011 07:35am"}, {v:89.4,f:"89"} ]}, 
                       {c:[{v: new Date(2011,2,26,1,2,15),f:"03\/26\/2011 01:02am"}, {v:85.4,f:"85"} ]}, 
                       {c:[{v: new Date(2011,2,27,0,27,13),f:"03\/27\/2011 12:27am"}, {v:85.4,f:"85"} ]}] 
            },   0.6); 

       var annotatedtimeline = new google.visualization.AnnotatedTimeLine(document.getElementById('chart_div'));
       annotatedtimeline.draw(data, {'displayAnnotations': true});
                                                                            }
            </script> 
          </head> 
        <body> 
        <div id='chart_div' style="width:400; height:250"></div> 
  </body> 
</html> 

Для меня это означает, что должен быть один шаг разбора, который я пропускаю. Как я уже говорил ранее, после устранения неполадок, которые я знаю, как поступить с кодом Google, я получил правильные размеры строк и столбцов в ответе из базы данных после вызова функции var data = result.getDataTable(). Так что должна быть еще одна модификация, которую я должен сделать с переменными данными, прежде чем я попытаюсь использовать их в моем annotatedtimeline.draw(data, {OPTIONS}) вызове .... Есть идеи?

** --------------------------------------------- ---------------------------- **

РЕДАКТИРОВАТЬ 2: НЕ РАБОЧИЙ КОД Это не рабочий код. Единственная реальная разница - это источник данных. И поскольку я знаю, что база данных отвечает, меня смущает тот факт, что она все еще показывает пустую страницу.

 <html> 
    <head> 
        <script type="text/javascript" src="http://www.google.com/jsapi"></script> 
            <script type="text/javascript"> 
        google.load('visualization', '1', {packages: ['annotatedtimeline']});
        function drawChart() {
         //Tell Google Visualization where your script is
                var query = new google.visualization.Query('/vis.php');
            query.setQuery('SELECT date,level FROM tank1 ORDER BY date');
            query.send(function(result) {
                //if there is an error
                document.write(result.getDetailedMessage());
                  if(result.isError()) {
                  alert(result.getDetailedMessage());

            } else {
                // otherwise plot the data
                var data = result.getDataTable();
                          // Inserting a document.write(data.getNumberOfRows()) proves that the datatable is loading seemingly correctly here
            var annotatedtimeline = new google.visualization.AnnotatedTimeLine(document.getElementById('chart_div'));
            annotatedtimeline.draw(data, { 'displayAnnotations': false });
                 }
               });
               }
           google.setOnLoadCallback(drawChart);
            </script> 
      </head> 
    <body> 
        <div id="chart_div" style="width:400px; height:250px"></div> 
  </body> 
</html>

Ответы [ 3 ]

1 голос
/ 13 марта 2013

Я уже сталкивался с этой проблемой раньше, просто исправьте эту строку в NON_WORKING_CODE

query.setQuery('SELECT date,level FROM tank1 ORDER BY date');

в

query.setQuery('SELECT *');

Это должно работать.Если нет, попробуйте исправить проблему preg_quote https://code.google.com/p/mc-goog-visualization/issues/detail?id=16

1 голос
/ 29 марта 2011

Посмотрите на страницу документации Google здесь: http://code.google.com/apis/visualization/documentation/gallery/annotatedtimeline.html Показывает следующее:

Important: To use this visualization, you must specify the height and width
           of the container element explicitly on your page. So, for example:
           <div id="chart_div" style="width:400; height:250"></div>.

Похоже, вы этого не делаете.

РЕДАКТИРОВАТЬ: я только что попробовал пример на этой странице, и действительно, если я уберу явные высоту и ширину, я ничего не получу; с высотой и шириной отображается временная шкала.

0 голосов
/ 06 октября 2011

В вашем ответе ключи не заключены в кавычки, это может быть причиной того, что диаграмма не отображается

{id:'date', type:'date'}

{"id":"date", "type":"date"}

Я только что искал документацию для visualization.query и this В прямом примере используется ответ, подобный вашему, но в ответе ключи заключены в кавычки:

https://spreadsheets.google.com/tq?key=pCQbetd-CptGXxxQIG7VFIQ&pub=1

Я не знаком с PHP и той библиотекой визуализации, которую вы используете в vis.php, но если вам удастся добавить эти кавычки, я почти уверен, что это будет работать

Я использую табличную дату с нотацией объекта, как вы сделали, но в .NET, и это единственное, что я вижуразница

Надеюсь, это поможет, я знаю, это старый пост, но для таких, как я, в будущем

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...