PHP&带谷歌时间线图表的MySQL

时间:2016-09-29 22:01:02

标签: php mysql json pdo google-visualization

我正在尝试使用PHP& amp;创建Google时间线图表MySQL到目前为止没有任何成功。所以经过无数个小时的努力,到目前为止我已经做到了这一点:

首先,我尝试使用PHP创建json(我相信我在这里错过了一些东西) PHP

            try {
                  $db = connectPDO();
                  $result = $db->query("SELECT naziv_plan AS name, 
                                        objava_odluke AS start_date, 
                                        datum_stupanja_glasnika AS end_date 
                                        FROM ispu_plan
                                        WHERE datum_donosenja_plana 
                                        BETWEEN '2014-01-01' 
                                        AND CURDATE() 
                                        ORDER BY datum_donosenja_plana ASC"); 

                        $rows = array();
                        $table = array();
                             $table['cols'] = array(
                               array('label' => 'Godina', 'type' => 'string'),
                               array('label' => 'Odluka', 'type' => 'number'),
                               array('label' => 'glasnik', 'type' => 'number')
                             );

                  foreach($result as $r) {
                   $temp = array();
                   $temp[] = array('v' => (string) $r['naziv_plan']); 
                   $temp[] = array('v' => (int) $r['objava_odluke']); 
                   $temp[] = array('v' => (int) $r['datum_stupanja_glasnika']);
                   $rows[] = array('c' => $temp);
                    } 
                   $table['rows'] = $rows;
                   $jsonTable = json_encode($table,JSON_NUMERIC_CHECK);
                   } catch(PDOException $e) {
                           echo 'ERROR: ' . $e->getMessage();
                   }

使用这段代码,我得到了这个JSON(它有效,用JSONLint检查)但是,我发现了一些不寻常的格式,甚至在JSON_NUMERIC_CHECK之后

{"cols":[{"label":"Godina","type":"string"},{"label":"Odluka","type":"number"},{"label":"glasnik","type":"number"}],"rows":[{"c":[{"v":"Stambenog susjedstva - Stubi\u010dki Trnac - I.ID"},{"v":2014},{"v":2014}]},{"c":[{"v":"Prostorni plan ure\u0111enja Grada Krapine - IV. ID"},{"v":2013},{"v":2015}]},{"c":[{"v":"Prostorni plan ure\u0111enja Grada Donja Stubica - I ID"},{"v":2014},{"v":2015}]},{"c":[{"v":"Generalni urbanisti\u010dki plan Grada Krapine - V.ID"},{"v":2015},{"v":2016}]}]}

这是JS:

google.charts.setOnLoadCallback(drawChart);
    function drawChart() {

        var container = document.getElementById('timeline');
        var chart = new google.visualization.Timeline(container);
        var data = new google.visualization.DataTable(<?php echo $jsonTable;?>);
        chart.draw(data);

运行整个代码块后,我收到此错误

无法读取未定义的属性'v'

PHP代码有问题吗? 1.可能日期格式有问题吗?

  1. 为什么我会得到一些格式怪异的JSON示例 - * Stambenog susjedstva - Stubi \ u010dki Trnac - I.ID当我应该得到而不是这个 - &gt; Stubi \ u010dki 这个 - &gt; Stubički
  2. 当我运行SQL时,我会得到类似这样的内容(例如:)

    +-----------+------------------+-----------------+
    | name|     |   start_date     |  end_Date       |
    +-----------+------------------+-----------------+
    | example_1 | 2014-06-06       | 2014-12-27      | 
    | example_1 | 2013-12-31       | 2015-06-07      |  
    | example_1 | 2016-06-06       | 2015-12-31      |  
    +-----------+------------------+-----------------+
    

    * 我想得到这样的东西: https://jsfiddle.net/api/post/library/pure/

    更新1

    所以,我设法修复了一些已解决的问题: 首先,使用奇怪格式化的JSON的问题,用 JSON_UNESCAPED_UNICODE

    修复

    所以,而不是这段代码:

    $jsonTable = json_encode($table,JSON_NUMERIC_CHECK);
    

    我用过这个:

    $jsonTable = json_encode($table,JSON_UNESCAPED_UNICODE);
    

    在时间轴上注意我已经设法成功渲染时间线图表,但是在x轴上,而不是年份和日期,它显示了我的小时数。我相信在从查询转换为json时我错过了一些东西。 (如下图所示)

    enter image description here

    我使用了这段PHP代码:

                          try {
                          $db = connectPDO();
                          $result = $db->query("SELECT naziv_plan, objava_odluke, datum_stupanja_glasnika 
                                              FROM  ispu_plan
                                                WHERE  datum_donosenja_plana 
                                                BETWEEN '2014-01-01' 
                                                AND CURDATE() 
                                                ORDER BY datum_donosenja_plana ASC"); 
    
    
                                $rows = array();
                                $table = array();
                                     $table['cols'] = array(
                                       array('label' => 'Naziv plana', 'type' => 'string'),
                                       array('label' => 'Odluka', 'type' => 'datetime'),
                                       array('label' => 'glasnik', 'type' => 'datetime')
                                     );
    
                          foreach($result as $r) {
                           $temp = array();
                           $temp[] = array('v' => (string) $r['naziv_plan']); 
                           $temp[] = array('v' => (int) strtotime($r['objava_odluke'])); 
                           $temp[] = array('v' => (int) strtotime($r['datum_stupanja_glasnika']));
                           $rows[] = array('c' => $temp);
                            } 
                           $table['rows'] = $rows;
                           $jsonTable = json_encode($table,JSON_UNESCAPED_UNICODE);
                           } catch(PDOException $e) {
                                   echo 'ERROR: ' . $e->getMessage();
                           }
    

    在JSON中我得到类似1402005600这样的开始日期,在我的表中格式化为2014-06-06,我相信我需要得到类似2014, 6, 6的内容才能正确渲染和计算时间线图表。 请帮助解决我一生的危机:)

    更新2

    使用白帽的知识和方向我觉得我距离最近让这种憎恶更近了:)同时,使用WhiteHat提供的方向和代码我创建了这个:

                            $rows = array();
                            $table = array();
                            $table['cols'] = array(
                                   array('label' => 'Godina', 'type' => 'string'),
                                   array('label' => 'Odluka', 'type' => 'date'),
                                   array('label' => 'glasnik', 'type' => 'date')
                                 );
                            while ($row = $result->fetch(PDO::FETCH_ASSOC)){
                            $date1 = new DateTime();
                            $date2 = "Date(".date_format($date1, 'Y').", ".((int) date_format($date1, 'm') - 1).", ".date_format($date1, 'd').")";
    
                            $temp = array();
                            $temp[] = array('v' => (string) $row['naziv_plan']);
                            $temp[] = array('v' => (string) $date2);
                            $temp[] = array('v' => (string) $date2);
                            $rows[] = array('c' => $temp);
                          }
    
                       $table['rows'] = $rows;
    
                       $jsonTable = json_encode($table,JSON_NUMERIC_CHECK);
    

    json的输出是这样的:

    {"cols":[{"label":"Godina","type":"string"},{"label":"Odluka","type":"date"},{"label":"glasnik","type":"date"}],"rows":[{"c":[{"v":"Stambenog susjedstva - Stubi\u010dki Trnac - I.ID"},{"v":"Date(2016, 8, 30)"},{"v":"Date(2016, 8, 30)"}]},{"c":[{"v":"Prostorni plan ure\u0111enja Grada Krapine - IV. ID"},{"v":"Date(2016, 8, 30)"},{"v":"Date(2016, 8, 30)"}]},{"c":[{"v":"Prostorni plan ure\u0111enja Grada Donja Stubica - I ID"},{"v":"Date(2016, 8, 30)"},{"v":"Date(2016, 8, 30)"}]},{"c":[{"v":"Generalni urbanisti\u010dki plan Grada Krapine - V.ID"},{"v":"Date(2016, 8, 30)"},{"v":"Date(2016, 8, 30)"}]}]}
    

    我得到时间表,但没有线:(

    这样的事情:

    enter image description here

    这两个错误:

    预期数字,“MNaN,0LNaN,40.992

    错误:属性x:预期长度,“NaN”

    更新3

    好的,我相信我已经以某种方式管理,而且它有效。这是下面的代码,希望它可以帮助某人。再次感谢WhiteHat:)

                     try {
                      $db = connectPDO();
                      $result = $db->query("SELECT naziv_plan, objava_odluke, datum_stupanja_glasnika
                                          FROM  ispu_plan
                                            WHERE  datum_donosenja_plana 
                                            BETWEEN '2014-01-01' 
                                            AND CURDATE() 
                                            ORDER BY datum_donosenja_plana ASC "); 
    
                      $rows = array();
                      $table = array();
    
                                 $table['cols'] = array(
                                   array('label' => 'Godina', 'type' => 'string'),
                                   array('label' => 'Odluka', 'type' => 'date'),
                                   array('label' => 'glasnik', 'type' => 'date')
                                 );
                            while ($row = $result->fetch(PDO::FETCH_ASSOC)){
                            // here I added rows in DateTime function, that was missing
                            $date1 = new DateTime($row['objava_odluke']);
                            $date2 = "Date(".date_format($date1, 'Y').", ".((int) date_format($date1, 'm') - 1).", ".date_format($date1, 'd').")";
    
                            $date3 = new DateTime($row['datum_stupanja_glasnika']);
                            $date4 = "Date(".date_format($date3, 'Y').", ".((int) date_format($date3, 'm') - 1).", ".date_format($date3, 'd').")";
    
    
                            $temp = array();
                            $temp[] = array('v' => (string) $row['naziv_plan']);
                            $temp[] = array('v' => (string) $date2);
                            $temp[] = array('v' => (string) $date4);
                            $rows[] = array('c' => $temp);
                          }
    
                       $table['rows'] = $rows;
    
                       $jsonTable = json_encode($table,JSON_NUMERIC_CHECK);
                       } catch(PDOException $e) {
                               echo 'ERROR: ' . $e->getMessage();
                       }
                  ?>
    

    图片,证明: enter image description here

0 个答案:

没有答案