2016-04-17 34 views
1

Google Charts APIを使用してMySQLデータベースに基づく折れ線グラフを作成しようとしています。データベースには、温度とタイムスタンプが含まれています。Google Chart API Line Chartの無効なJSON文字列

データを取得してJSONに変換するgetData.phpがあります。

<?php 
$servername = "xxx"; 
$username = "xxx"; 
$password = "xxx"; 
$dbname = "xxx"; 


$conn = mysqli_connect($servername, $username, $password, $dbname); 

// Check connection 
if (!$conn) { 
    die("Connection failed: " . mysqli_connect_error()); 
} 

$qry = "SELECT * FROM temp"; 

$result = mysqli_query($conn,$qry); 

$table = array(); 
$table['cols'] = array(

    array('label' => 'Time', 'type' => 'datetime'), 
    array('label' => 'Temperature', 'type' => 'number') 
); 

$rows = array(); 
foreach($result as $row){ 

    $temp = array(); 

    //$temp[] = array('v' => 'Date(' . $row['time'] . ')'); OLD 

    //turn timestamps into correct datetime form Date(Y,n,d,H,i,s) 
    $temp[] = array('v' => 'Date('.date('Y',strtotime($row['time'])).',' . 
           (date('n',strtotime($row['time'])) - 1).','. 
           date('d',strtotime($row['time'])).','. 
           date('H',strtotime($row['time'])).','. 
           date('i',strtotime($row['time'])).','. 
           date('s',strtotime($row['time'])).')'); 


    $temp[] = array('v' => (float) $row['temperature']); 
    $rows[] = array('c' => $temp); 
} 

$table['rows'] = $rows; 

$jsonTable = json_encode($table, true); 
echo $jsonTable;  
?> 

タイムスタンプはここでGoogleの指示に従って、「日付(年、月、日、時、分、秒、ミリ秒)」形式に変換されます。ここではhttps://developers.google.com/chart/interactive/docs/datesandtimes#dates-times-and-timezones

は私のmain.htmlとあります。これは、Googleの例に基づいている(https://developers.google.com/chart/interactive/docs/php_example#exampleusingphphtml-file

<html> 
<head> 
    <!--Load the AJAX API--> 
    <script type="text/javascript" src="https://www.gstatic.com/charts/loader.js"></script> 
    <script type="text/javascript" src="//ajax.googleapis.com/ajax/libs/jquery/1.10.2/jquery.min.js"></script> 
    <script type="text/javascript"> 

     // Load the Visualization API and the corechart package. 
     google.charts.load('current', {'packages':['line']}); 

     google.charts.setOnLoadCallback(drawChart); 

     function drawChart() { 

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

     var data = new google.visualization.DataTable(jsonData); //Line 27 


     var options = {'title':'Temperature', 
         'width':720, 
         'height':480}; 

     var chart = new google.charts.Line(document.getElementById('chart_div')); 


     //chart.draw(data, options); 
     //chart.draw(data, {width: 400, height: 240}); 
     chart.draw(data, google.charts.Line.convertOptions(options)); 



     } 
    </script> 

</head> 

<body> 
    <div id="chart_div"><p id="test"></p></div> 
</body> 
<html> 

ウェブサイトが空白のとChromeのデバッガはこのエラーを示しています

不明なエラー:無効なJSON文字列:

<body> 
{"cols":[{"label":"Time","type":"datetime"},{"label":"Temperature","type":"number"}],"rows":[{"c":[{"v":"Date(2016,3,14,10,36,30)"},{"v":22}]},{"c":[{"v":"Date(2016,3,14,10,37,31)"},{"v":25}]},{"c":[{"v":"Date(2016,3,14,10,37,53)"},{"v":21}]},{"c":[{"v":"Date(2016,3,15,01,23,37)"},{"v":21}]}]} 
</body> 

yl @ VM1981:170 
Ol @ VM1981:174 
Sp @ VM1981:234 
drawChart @ main.html:27 
google.a.b.Na @ loader.js:147 
g @ loader.js:145 

main.htmlと: 27はvar data = new google.visualization.DataTable(jsonData)です。ライン。ここで

は、私がここに途方に暮れて完全だjsonlint

{ 
"cols": [{ 
    "label": "Time", 
    "type": "datetime" 
}, { 
    "label": "Temperature", 
    "type": "number" 
}], 
"rows": [{ 
    "c": [{ 
     "v": "Date(2016,3,14,10,36,30)" 
    }, { 
     "v": 22 
    }] 
}, { 
    "c": [{ 
     "v": "Date(2016,3,14,10,37,31)" 
    }, { 
     "v": 25 
    }] 
}, { 
    "c": [{ 
     "v": "Date(2016,3,14,10,37,53)" 
    }, { 
     "v": 21 
    }] 
}, { 
    "c": [{ 
     "v": "Date(2016,3,15,01,23,37)" 
    }, { 
     "v": 21 
    }] 
}] 
} 

でフォーマットJSONです。 JSON文字列はうまくなければならず、jsonlint.comによっても検証されています。どんな助けでも大歓迎です。

+0

削除されたコメントについて:データポイントは非常に近く、軸ラベルはそれほど有用ではありませんでした。あなたはフォーマットを編集することができます。varオプション= { 'タイトル': '温度'、 '幅':720、 '高さ':480、 \t \t \t \t \t 'hAxis':{ '形式':「DD/MM/yyyy HH:mm '}}; –

+0

もう一度、私は自分自身を見つけ出すことができたので、コメントを編集できなかったので、それを削除することにしました。答えは、タグをgetData.phpから削除することでした。答えに感謝します。私は実際にはどのようにグラフのすべてのドットのX軸上のタイムスタンプを取得することができます考えています。ここにグラフの写真があります。現在の数値はテスト用です。 http://puu.sh/olQh0/8307ba8a9c.png – Alqio

+0

連続したグラフに問題があるようです。横軸を時間軸に合わせてスケーリングする必要がない場合は、datetime型からstring型に切り替えて、タイムスタンプを文字列としてフォーマットすることで離散型チャートに切り替えることができます。それ以外の場合、私は解決策を知りません、多分別の質問を開きますか? –

答えて

0

コードをコピーし、貼り付けたjson文字列をgetData.phpに戻します。エラーを再現できません。

main.htmlとのあなたのAJAXの応答を確認してください:

console.log(jsonData); 

私は(例えば、何かをのvar_dump)getData.phpに追加の出力を追加する場合、私は無効なJSON文字列のエラーを作成することができます。エラーメッセージに不正な形式のJSON文字列が印刷されているので、あなたのJSON文字列の周り

<body> 

タグは、しかし疑わしいですので、タグは、あなたのJSON文字列の一部であるように思われます。 bodyタグに埋め込まれたgetData.phpのPHPコードですか? main.htmlとで

あなたは試みることができる:

jsonData=jsonData.replace("<body>", "").replace("</body>", ""); 

をチェックするために、これは問題になる可能性がある場合。