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

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

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

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

PHP

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

Q&A

解決済

3回答

1423閲覧

[php]JSON.parse: unexpected character at line 1 column 1 of the JSON dataについて

maigoneko

総合スコア13

JSON

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

PHP

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

0グッド

1クリップ

投稿2017/11/28 06:46

編集2017/11/28 08:04

###前提・実現したいこと
PHPでmysqlに接続してdbのデータをjson出力したいと思っています。
その後json出力されたデータを、jsで使用するつもりでいます。

###発生している問題・エラーメッセージ

実際にプログラムを作成しTeraTermでjson出力phpを実行した際、特にエラーが表示されませんでした。
しかしブラウザ上で、urlをたたいて確認すると以下のようなエラーが表示されました

エラーメッセージ

SyntaxError: JSON.parse: unexpected character at line 1 column 1 of the JSON data

そして以下のサイト( https://jsoncompare.com/ )でjson.phpのurlを入力したところ以下のように表示されました

..{ __//赤線 Unexpected '' on line 1__  "nodes": [ { "id": 1, "label": "testuser", "pic": "" }, { "id": 2, "label": "test", "pic": "" } ] "links": [ { "source": 1, "target": 2 }, 以下略 ] }

###該当のソースコード

<?php ob_start(); require_once('config2.php'); require_once('functions.php'); $dbh = connectDb(); $sth = $dbh->prepare("SELECT * FROM user"); $sth->execute(); $nodes = array(); $links = array(); while($row = $sth->fetch(PDO::FETCH_ASSOC)){ $nodes[] = array( 'id'=>$row['id'], 'label'=>$row['name'], 'pic'=>$row['image'], ); } $sth2 = $dbh->prepare("SELECT * FROM follow"); $sth2->execute(); while($row = $sth2->fetch(PDO::FETCH_ASSOC)){ $links[] = array( 'source'=>$row['my_id'], 'target'=>$row['follow_id'], ); } $array= array('nodes'=>$nodes, 'links'=>$links ); header('Content-type:application/json; charset=utf8'); echo json_encode($array,JSON_UNESCAPED_UNICODE |JSON_NUMERIC_CHECK | JSON_UNESCAPED_SLASHES | JSON_PRETTY_PRINT );

###補足情報
ブラウザ:firefox

jsonを扱うのが初めてのこともあり、何が原因でエラーが起きているのか
どうすれば解決するのかがわかっていません。
2週間ほど悩み、友人たちに相談しましたが特に進展がなく、精神的にも参ってきてしまったので、今回こちらのほうに質問を投げさせていただきました。
また返信のほうが遅れてしまう場合があります どうかご容赦ください

###追記情報(var_dump()時のすべて)

teraterm出力

1array(2) { 2 'nodes' => 3 array(5) { 4 [0] => 5 array(3) { 6 'id' => 7 string(1) "1" 8 'label' => 9 string(12) "testuser" 10 'pic' => 11 string(0) "" 12 } 13 [1] => 14 array(3) { 15 'id' => 16 string(1) "2" 17 'label' => 18 string(4) "test" 19 'pic' => 20 string(0) "" 21 } 22 [2] => 23 array(3) { 24 'id' => 25 string(2) "11" 26 'label' => 27 string(21) "test300" 28 'pic' => 29 string(0) "" 30 } 31 [3] => 32 array(3) { 33 'id' => 34 string(2) "12" 35 'label' => 36 string(13) "test400" 37 'pic' => 38 string(0) "" 39 } 40 [4] => 41 array(3) { 42 'id' => 43 string(2) "13" 44 'label' => 45 string(8) "test1106" 46 'pic' => 47 string(0) "" 48 } 49 } 50 'links' => 51 array(8) { 52 [0] => 53 array(2) { 54 'source' => 55 string(1) "1" 56 'target' => 57 string(1) "2" 58 } 59 [1] => 60 array(2) { 61 'source' => 62 string(1) "2" 63 'target' => 64 string(1) "1" 65 } 66 [2] => 67 array(2) { 68 'source' => 69 string(2) "12" 70 'target' => 71 string(2) "11" 72 } 73 [3] => 74 array(2) { 75 'source' => 76 string(2) "11" 77 'target' => 78 string(2) "12" 79 } 80 [4] => 81 array(2) { 82 'source' => 83 string(2) "11" 84 'target' => 85 string(2) "13" 86 } 87 [5] => 88 array(2) { 89 'source' => 90 string(2) "13" 91 'target' => 92 string(2) "11" 93 } 94 [6] => 95 array(2) { 96 'source' => 97 string(2) "11" 98 'target' => 99 string(2) "12" 100 } 101 [7] => 102 array(2) { 103 'source' => 104 string(2) "13" 105 'target' => 106 string(2) "12" 107 } 108 } 109}

###追記情報2(var_dump()時のnodes時)

array(5) { [0] => array(3) { 'id' => string(1) "1" 'label' => string(12) "testuser" 'pic' => string(0) "" } [1] => array(3) { 'id' => string(1) "2" 'label' => string(4) "test" 'pic' => string(0) "" } [2] => array(3) { 'id' => string(2) "11" 'label' => string(21) "test300" 'pic' => string(0) "" } [3] => array(3) { 'id' => string(2) "12" 'label' => string(13) "test400" 'pic' => string(0) "" } [4] => array(3) { 'id' => string(2) "13" 'label' => string(8) "test1106" 'pic' => string(0) "" } }

###追記情報3(nameカラム)
イメージ説明

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

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

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

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

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

m.ts10806

2017/11/28 06:54

プログラムコード(およびエラーメッセージ)は```で囲ってください。(わからなければ質問編集画面でコード部分を選択し<code>ボタンを押してください)正しく反映されているかどうかは質問編集画面のプレビューを見ながら編集していってください。
m.ts10806

2017/11/28 06:56

json_encodeの第2引数を全て省略した場合でも同じですか?
m.ts10806

2017/11/28 07:01 編集

または、header()以前に何かしら出力されている、という可能性のほうが高いかもしれません。
maigoneko

2017/11/28 07:02

全て省略した場合でも同じエラーが返ってきます
退会済みユーザー

退会済みユーザー

2017/11/28 07:03

json_encode化する前の$arrayの中身は見せられますでしょうか?
maigoneko

2017/11/28 07:06

h_3478さん json_encode前にecho $array;すると、Array のみが返ってきます
m.ts10806

2017/11/28 07:07

echoではなくvar_dump()ですね。
maigoneko

2017/11/28 07:12

array(2) { 'nodes' => array(5) { [0] => array(3) { 'id' => string(1) "1" 'label' => string(12) "testuser" 'pic' => string(0) "" } [1] => array(3) { 'id' => string(1) "2" 'label' => string(4) "test" 'pic' => string(0) "" } } 'links' => array(8) { [0] => array(2) { 'source' => string(1) "1" 'target' => string(1) "2" } [1] => array(2) { 'source' => string(1) "2" 'target' => string(1) "1" } }
maigoneko

2017/11/28 07:13

見づらくてすいません
退会済みユーザー

退会済みユーザー

2017/11/28 07:28

上の結果は省略などはしていませんか?
maigoneko

2017/11/28 07:32

あまりに長いので一部省略しています
maigoneko

2017/11/28 07:41

追記情報のほうに省略していないのを書いておきます
退会済みユーザー

退会済みユーザー

2017/11/28 07:52

$nodesの中身をvar_dump()で見せてもらえないでしょうか?
退会済みユーザー

退会済みユーザー

2017/11/28 07:55

それと、userテーブルのnameカラムの構造はどうなっているかも知りたいです。この辺に原因があるような気がします。
guest

回答3

0

ベストアンサー

僕なりに最初からコードを組んでみました。

<?php //DB接続 $dsn='mysql:dbname=データベース名;host=ホスト名'; $user='ユーザー名'; $password='パスワード'; $dbh=new PDO($dsn,$user,$password); $dbh->query('SET NAMES utf8'); //user情報 $sql='SELECT * FROM user'; $stmt=$dbh->prepare($sql); $stmt->execute(); $user=$stmt->fetchAll(PDO::FETCH_ASSOC); //follow情報 $sql='SELECT * FROM follow'; $stmt=$dbh->prepare($sql); $stmt->execute(); $follow=$stmt->fetchAll(PDO::FETCH_ASSOC); $dbh=null; foreach($user as $value){ $data[] = ['id'=>$value['id'],'label'=>$value['name'],'pic'=>$value['image']]; } foreach($follow as $value){ $data2[] = ['source'=>$value['my_id'],'target'=>$value['follow_id']]; } $array = ['nodes'=>$data,'links'=>$data2]; echo json_encode($array); ?>

これで一度試してみてください。

投稿2017/11/28 09:33

編集2017/11/28 09:34
退会済みユーザー

退会済みユーザー

総合スコア0

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

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

maigoneko

2017/11/28 09:44

正常に表示されました!本当にありがとうございます ただ何が原因だったのかイマイチわかりません・・・
退会済みユーザー

退会済みユーザー

2017/11/28 09:47

そこなんですよねー。原因がわかってないのであまりいい解決方法ではないのですが・・・ともかく無事出力されたようで良かったです!
maigoneko

2017/11/28 09:49

これで数週間はまってたエラーから解放されます・・・ 本当に、本当にありがとうございました
guest

0

追記質問に真摯に答えていただいてありがとうございます。しかし私自身の力不足ではっきりとした原因はまだわかっていません。すみません。しかしいくつか試してほしい部分あるので試していただけると幸いです。

・userテーブルから取ってきたnameカラムの値のバイト数が、文字数を超えている

<?php $data = array('nodes'=>[  ['id'=>'1','label'=>'testuser','pic'=>''],  ['id'=>'2','label'=>'test','pic'=>''] ], 'links'=>[ ['source'=>'1','target'=>'2'],  ['source'=>'2','target'=>'1'] ] ); var_dump($data); ?> 結果 array(2) { ["nodes"]=> array(2) { [0]=> array(3) { ["id"]=> string(1) "1" ["label"]=> string(8) "testuser" ["pic"]=> string(0) "" } [1]=> array(3) { ["id"]=> string(1) "2" ["label"]=> string(4) "test" ["pic"]=> string(0) "" } } ["links"]=> array(2) { [0]=> array(2) { ["source"]=> string(1) "1" ["target"]=> string(1) "2" } [1]=> array(2) { ["source"]=> string(1) "2" ["target"]=> string(1) "1" } } }

上記結果のtestuserのバイト数が8なのに対し、maigonekoさんの方は12になっていますよね。変に空欄か何かが混ざってたりしませんか?その辺を調べるといいかもしれません。

・whileはやめて「fetchAll」で取ってきてみる。
whileで回すときに何か起きている可能性もあるので、

$row = $sth->fetchAll(PDO::FETCH_ASSOC);

と書いて一気に全データを配列で取得してみてください。また変数$rowを使いまわさずに他の変数を使ってみるといいかもしれません。

投稿2017/11/28 08:31

編集2017/11/28 08:33
退会済みユーザー

退会済みユーザー

総合スコア0

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

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

maigoneko

2017/11/28 09:00

fetchAllを試していたため、報告が遅れました 結果としては特に変化がありませんでした またtestuserが8なのに12になっている件についてですが、友人のフルネームをテストでいれていたので、質問の際にtestuserに変更していました 紛らわしいことをしてしまい申し訳ありません
退会済みユーザー

退会済みユーザー

2017/11/28 09:07

fetchAllでもダメでしたか。ならあとはもうfunctions.phpとconfig2.phpくらいしか怪しむところがありません。この2つには具体的に何が書かれているのですか?
退会済みユーザー

退会済みユーザー

2017/11/28 09:16

なるほど。ではjson_encodeの次の段に 「print json_last_error_msg(); 」 と書いて何かメッセージが出るか確認してもらえますか?
maigoneko

2017/11/28 09:19

NO errorとでます ブラウザ上では変わらずSyntaxErrorですが
退会済みユーザー

退会済みユーザー

2017/11/28 09:41

新しく回答でコードを書いたので、そっちを試していただけますか?
guest

0

見た感じ特に問題になりそうな箇所はありませんね

PHP

1<script> 2 var b=`<?PHP 3$nodes=[ 4 ['id' =>"1",'label' =>"testuser",'pic' =>""], 5 ['id' =>"2",'label' =>"test",'pic' =>""], 6 ['id' =>"11",'label' =>"test300",'pic' =>""], 7 ['id' =>"12",'label' =>"test400",'pic' =>""], 8 ['id' =>"13",'label' =>"test1106",'pic' =>""], 9 ]; 10$links=[ 11 ['source' =>"1",'target' =>"2"], 12 ['source' =>"2",'target' =>"1"], 13 ['source' =>"12",'target' =>"11"], 14 ['source' =>"11",'target' =>"12"], 15 ['source' =>"13",'target' =>"11"], 16 ['source' =>"11",'target' =>"13"], 17 ['source' =>"11",'target' =>"12"], 18 ['source' =>"13",'target' =>"12"], 19 ]; 20$a=["nodes"=>$nodes,"links"=>$links]; 21print json_encode($a,JSON_UNESCAPED_UNICODE |JSON_NUMERIC_CHECK | JSON_UNESCAPED_SLASHES | JSON_PRETTY_PRINT ); 22?>`; 23console.log(b); 24var c=JSON.parse(b); 25console.log(c); 26</script>

上記、bもcも問題なく表示されていると思います

投稿2017/11/28 08:11

yambejp

総合スコア114742

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.49%

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

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

質問する

関連した質問