質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
JSON

JSON(JavaScript Object Notation)は軽量なデータ記述言語の1つである。構文はJavaScriptをベースとしていますが、JavaScriptに限定されたものではなく、様々なソフトウェアやプログラミング言語間におけるデータの受け渡しが行えるように設計されています。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

Q&A

解決済

3回答

1653閲覧

PHPのjson_encodeで作ったJSONがHandlebarsで利用できないのはなぜ?

nnahito

総合スコア2004

JSON

JSON(JavaScript Object Notation)は軽量なデータ記述言語の1つである。構文はJavaScriptをベースとしていますが、JavaScriptに限定されたものではなく、様々なソフトウェアやプログラミング言語間におけるデータの受け渡しが行えるように設計されています。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

0グッド

1クリップ

投稿2016/05/21 14:02

編集2016/05/23 05:35

質問

PHPの関数「json_encode」を用いて、sqlite3から読みだしたデータをJSON化しました。

※$rowsには、sqlite3から読みだしたデータが入っています。

php

1json_encode($rows, JSON_UNESCAPED_UNICODE)

この処理を行うPHPに、jQueryのajax関数を用いてjson_encodeの結果を取得します。
この時、返って来たJSONは、JSON Pretty Linter Ver2でエラーはありませんでした。

しかし、Handlebarsでは値が表示されませんでした。

とりあえず、そのJSONをコピペし、直接

JavaScript

1data = {JSONの内容};

と貼り付けてHandlebarsのコンパイルを通すと、普通に表示されます。
これは、変数に入っているか、直接コピペするかの違いしか無いはずです。

なのに、なぜ変数では表示されないのでしょうか?
理由が全くわかりません。

お分かりに方がいらっしゃいましたらご教授ください。
お願い致します。

追記

JSONを創るPHP

php

1<?php 2// DB操作開始 3$dbh = new PDO('sqlite:../db/data.db'); 4 5// DBからデータ取得 6$sth = $dbh->prepare("select * from reservation"); 7$sth->execute( ); 8 9$result = ""; 10 11while( $rows = $sth->fetch() ){ 12 $result .= json_encode($rows, /*JSON_PRETTY_PRINT && */JSON_UNESCAPED_UNICODE) .","; 13} 14 15//最後の一文字(余分な「,」)を削除 16$result = substr($result, 0, -1); 17 18$result = '{' ."". '"reservation":['."". $result ."]}"; 19echo preg_replace("/\s/", "", $result); 20 21$dbh = null; 22 23?>

JSONをPHPから受け取る部分

html

1 <div id="reservation"></div> 2 <script> 3 $(document).ready(function(){ 4 $.ajax({ 5 type: "GET", 6 url: "./operation/get_reservation.php", 7 }).done(function(data){ 8 var template = Handlebars.compile( $('#reservation-template').html() ); 9 $("#reservation").html(template(data)); 10 }); 11 });

Handlebarsの記述

html

1<!-- handlebarsの設定(ランキング用) --> 2 <script type="text/x-handlebars-template" id="reservation-template"> 3 <table class="reservation"> 4 <tr> 5 <td>予約番号</td> 6 <td>予約時間</td> 7 <td>お名前</td> 8 <td>支払方法</td> 9 <td>予約人数</td> 10 <td>備考</td> 11 <td>雨天</td> 12 </tr> 13 14 15 {{#each reservation}} 16 <tr> 17 <td>{{id}}</td> 18 <td>{{hour}}{{minute}}</td> 19 <td>{{name}}</td> 20 <td>{{pay}}</td> 21 <td>{{num}}</td> 22 <td>{{other}}</td> 23 <td>{{rain}}</td> 24 </tr> 25 {{/each}} 26 27 28 </table> 29 </script>

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

kei344

2016/05/21 14:06

ご自身で書かれたコードを質問文に追記いただいたほうが回答を得られやすいと思います。
nnahito

2016/05/23 05:35

プログラムを追記いたしましたので、ご回答をお願い致します
guest

回答3

0

ベストアンサー

ajaxで受け取った値をパースしていない様に見えます。

JavaScript

1$.ajax( /* 略 */ ).done( function( data ) { 2 // 今の書き方のまま受け取ったものをパース 3 data = JSON.parse( data ); 4 /* 略 */ 5} ); 6```or 7```JavaScript 8$.ajax( { 9 type: 'GET', 10 dataType: 'json', // データをパースするように指定 = $.getJSON 11 url: 'url' 12} ).done( function( data ) { /* 略 */ } ); 13```or 14```JavaScript 15$.getJSON( 'url', function( data ) { /* 略 */ } ); // データをパースするように指定

投稿2016/05/23 11:45

kei344

総合スコア69398

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

この時、返って来たJSONは、JSON Pretty Linter Ver2でエラーはありませんでした。

返ってきてないんじゃないスか?

投稿2016/05/21 17:19

takasima20

総合スコア7458

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

nnahito

2016/05/23 05:32

返って来てるんスよ!
takasima20

2016/05/23 09:40

じゃあ、dataの構造とHandlebarsが 想定している構造が違ってるとか。
guest

0

コピペして動作するなら、Ajax通信の過程でデータがおかしくなっている可能性があります。
なので、AjaxでPHPから渡されるはずのデータをconsole.logで表示してみたり、通信データをWebブラウザにあるF12開発者ツールやデベロッパーツールなどで眺めてみると良いかもしれません。

投稿2016/05/21 17:28

sounisi5011

総合スコア697

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

nnahito

2016/05/23 05:32

ご回答有り難うございます。 AjaxでPHPから返って来たJSONを、JavaScriptのalert()で表示し、 その表示内容をコピペするとHandlebarsが動くのですが、 変数のまま使うと動いてくれません…… プログラムの方を追記いたします。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問