响应storage.get时出错:TypeError:无法读取属性' style'为null

时间:2014-06-12 10:13:17

标签: javascript json google-visualization undefined

我正在尝试使用GoogleCharts将oracle数据库中的数据转换为LineChart,但我总是面临一些错误。

如果有人可以帮助我,我们将不胜感激!

以下是获取折线图的脚本:

<html>
<head>


    <script type="text/javascript" src="https://www.google.com/jsapi"></script>
    <script src="http://ajax.googleapis.com/ajax/libs/jquery/1.9.1/jquery.min.js"></script>
    <script type="text/javascript">


    $( document ).ready(function() {

      google.load("visualization", "1", {packages:["corechart"]});
        google.setOnLoadCallback(drawChart);

        function drawChart (callback) {
        var jsonData = $.ajax({
            type: "POST",
            contentType: "application/json; charset=utf-8",
            url:"getData.php",
            dataType:"json",
            async:false,



        }).responseText;

        //Create our data table out of JSON data loaded from server
        var data = new google.visualization.DataTable(jsonData);

        //PieCharts expects 2 columns of data: a label and a value, so we need to use a DataView to restrict to 2 columns
        var view = new google.visualization.DataView(data);
        view.setColumns([0, 1]);


        var options = {
      title: 'Whatever'
    };
        //Instantiate and draw our chart, passing in some options
        var chart = new google.visualization.LineChart(document.getElementById('chart_div'));
        chart.draw(data, options);
    }
    });




    </script>

</head>

<body>
     <!--Div that will hold the pie chart-->
<div id="chart_div">Test</div>
</body>

这是将数据放入表中的Phpscript:

    <?php 





//On exécute la requete









//on appelle la page connexion
include 'connexion.php';

//La requete

$query = "

select A.*  
from (
SELECT 
         EB_RESULTAT_DTM.VALEUR AS EB_RESULTAT_VALEUR, 
         EB_RESULTAT_DTM.INSERT_DATE AS EB_RESULTAT_INSERT_DATE,

         rank() over (partition by EB_INDICATEUR_DTM.INDICATEUR_NUM,to_char(EB_RESULTAT_DTM.INSERT_DATE,'yyyymm') order by to_char(EB_RESULTAT_DTM.INSERT_DATE,'yyyymmdd') asc) as rang,
         to_char(EB_RESULTAT_DTM.INSERT_DATE,'yyyymm') as MOIS_M
    FROM COMPTEUR_OWNER.EB_DOMAINE_DTM EB_DOMAINE_DTM
         INNER JOIN
         COMPTEUR_OWNER.EB_INDICATEUR_DTM EB_INDICATEUR_DTM
            ON EB_DOMAINE_DTM.EB_DOMAINE_DTM_NUM =
                  EB_INDICATEUR_DTM.X_EB_DOMAINE_DTM_NUM
         INNER JOIN
         COMPTEUR_OWNER.EB_RESULTAT_DTM EB_RESULTAT_DTM
            ON EB_INDICATEUR_DTM.INDICATEUR_NUM =
                  EB_RESULTAT_DTM.X_EB_INDICATEUR_DTM_NUM
   WHERE     EB_INDICATEUR_DTM.INDICATEUR_NUM = 106
         AND EB_RESULTAT_DTM.INSERT_DATE BETWEEN ADD_MONTHS (SYSDATE, -9) 
                                               AND SYSDATE
) a where a.rang=1
";

$stid = oci_parse($conn, $query);
oci_execute($stid);

$table = array();
$table['cols'] = array(
    /* define your DataTable columns here
     * each column gets its own array
     * syntax of the arrays is:
     * label => column label
     * type => data type of column (string, number, date, datetime, boolean)
     */
    array('label' => 'Nombres', 'type' => 'number'),
    array('label' => 'Date', 'type' => 'date'),
    // etc...
);

$rows = array();
while($r = oci_fetch_assoc($stid)) {
    $temp = array();
    // each column needs to have data inserted via the $temp array
    $temp[] = array('v' => $r['EB_RESULTAT_VALEUR']);
    $temp[] = array('v' => $r['EB_RESULTAT_INSERT_DATE']);
    // etc...

    // insert the temp array into $rows
    $rows[] = array('c' => $temp);
}

// populate the table with rows of data
$table['rows'] = $rows;

    // encode the table as JSON
    $jsonTable = json_encode($table);



    // return the JSON data
    echo $jsonTable;

    ?>

我收到了这条消息:

Error in response to storage.get: TypeError: Cannot read property 'style' of null

或者:

undefined is not a function

2 个答案:

答案 0 :(得分:0)

所以我已经改变了PHP和脚本,但现在又收到了另一条错误消息:

Uncaught Error: Not an array 

这是php getData2.php:

<?php



include 'connexion.php';
//


$sql  = oci_parse($conn, "select A.*  
from (
SELECT 
         EB_RESULTAT_DTM.VALEUR AS EB_RESULTAT_VALEUR, 
         EB_RESULTAT_DTM.INSERT_DATE AS EB_RESULTAT_INSERT_DATE,

         rank() over (partition by EB_INDICATEUR_DTM.INDICATEUR_NUM,to_char(EB_RESULTAT_DTM.INSERT_DATE,'yyyymm') order by to_char(EB_RESULTAT_DTM.INSERT_DATE,'yyyymmdd') asc) as rang,
         to_char(EB_RESULTAT_DTM.INSERT_DATE,'yyyymm') as MOIS_M
    FROM COMPTEUR_OWNER.EB_DOMAINE_DTM EB_DOMAINE_DTM
         INNER JOIN
         COMPTEUR_OWNER.EB_INDICATEUR_DTM EB_INDICATEUR_DTM
            ON EB_DOMAINE_DTM.EB_DOMAINE_DTM_NUM =
                  EB_INDICATEUR_DTM.X_EB_DOMAINE_DTM_NUM
         INNER JOIN
         COMPTEUR_OWNER.EB_RESULTAT_DTM EB_RESULTAT_DTM
            ON EB_INDICATEUR_DTM.INDICATEUR_NUM =
                  EB_RESULTAT_DTM.X_EB_INDICATEUR_DTM_NUM
   WHERE     EB_INDICATEUR_DTM.INDICATEUR_NUM = 106
         AND EB_RESULTAT_DTM.INSERT_DATE BETWEEN ADD_MONTHS (SYSDATE, -9) 
                                               AND SYSDATE
) a where a.rang=1");

oci_execute($sql);

//while (($row = oci_fetch_array($sql, OCI_BOTH)) != false) {
    // Utilisez des noms de colonne en majuscule pour les indices des tableau associatif
   // echo $row['EB_RESULTAT_VALEUR'];
 //   echo $row['EB_RESULTAT_INSERT_DATE'];
//}

//json_encode($row);

$rows = Array();

while($row = oci_fetch_array($sql, OCI_BOTH)){
     array_push($rows, $row[0], $row[1]);
}

echo json_encode($rows);

    oci_free_statement($sql);
    oci_close($conn);
?>

它返回:

["9415094","14\/09\/13 14:39:56,000000","9419954","02\/11\/13 13:25:26,000000","9355868","07\/12\/13 13:25:58,000000","9369691","04\/01\/14 13:24:19,000000","9385231","01\/02\/14 13:26:36,000000","9414700","01\/03\/14 13:26:28,000000"]

这是index_4.php(脚本):

<html>
<head>
    <title>Donné volumétrique</title>
    <!-- Load jQuery -->
    <script language="javascript" type="text/javascript" 
        src="http://ajax.googleapis.com/ajax/libs/jquery/1.7.0/jquery.min.js">
    </script>
    <!-- Load Google JSAPI -->
    <script type="text/javascript" src="https://www.google.com/jsapi"></script>
    <script type="text/javascript">

        google.load("visualization", "1", { packages: ["corechart"] });
        google.setOnLoadCallback(drawChart);

        function drawChart() {
            var jsonData = $.ajax({
                url: "getData2.php",
                dataType: "json",
                async: false
            }).responseText;

            var data = google.visualization.arrayToDataTable($.parseJSON(drawChart));

            var options = {
                title: 'Donnée Volumétrique'
            };

            var chart = new google.visualization.LineChart(
                        document.getElementById('chart_div'));
            chart.draw(data, options);
        }

    </script>
</head>
<body>
    <div id="chart_div" style="width: 900px; height: 500px;">
    </div>
</body>
</html>

这就是我得到的:

http://imgur.com/w8jexhJ&#34;错误消息&#34;


编辑1:$rows = Array();$rows = Array(array('Nombres', 'Date'));

AND

array_push($rows, $row[0], $row[1]);array_push($rows, array($row[0], $row[1]));

获得:[["Nombres","Date"],["9419954","02\/11\/13 13:25:26,000000"],["9355868","07\/12\/13 13:25:58,000000"],["9369691","04\/01\/14 13:24:19,000000"],["9385231","01\/02\/14 13:26:36,000000"],["9414700","01\/03\/14 13:26:28,000000"]]

答案 1 :(得分:0)

我可以看到一些错误。首先,您正在使用arrayToDataTable方法解析错误的对象:

var data = google.visualization.arrayToDataTable($.parseJSON(drawChart));

应该是:

var data = google.visualization.arrayToDataTable($.parseJSON(jsonData));

然后,您的列的顺序错误。 LineCharts期望x轴值(您的日期)是第一列,然后是第二列中的y值。此外,您需要将数字输出为数字而不是字符串;只需将JSON_NUMERIC_CHECK添加到json_encode函数调用中:

echo json_encode($rows, JSON_NUMERIC_CHECK);