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

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

ただいまの
回答率

91.35%

  • PHP

    15152questions

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

  • JSON

    775questions

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

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

解決済

回答 3

投稿 2017/11/28 15:46 ・編集 2017/11/28 17:04

  • 評価
  • クリップ 1
  • VIEW 68

maigoneko

score 7

前提・実現したいこと

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()時のすべて)

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) ""
    }
    [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) ""
    }
  }
  '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"
    }
    [2] =>
    array(2) {
      'source' =>
      string(2) "12"
      'target' =>
      string(2) "11"
    }
    [3] =>
    array(2) {
      'source' =>
      string(2) "11"
      'target' =>
      string(2) "12"
    }
    [4] =>
    array(2) {
      'source' =>
      string(2) "11"
      'target' =>
      string(2) "13"
    }
    [5] =>
    array(2) {
      'source' =>
      string(2) "13"
      'target' =>
      string(2) "11"
    }
    [6] =>
    array(2) {
      'source' =>
      string(2) "11"
      'target' =>
      string(2) "12"
    }
    [7] =>
    array(2) {
      'source' =>
      string(2) "13"
      'target' =>
      string(2) "12"
    }
  }
}

追記情報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カラム)

イメージ説明

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • maigoneko

    2017/11/28 16:41

    追記情報のほうに省略していないのを書いておきます

    キャンセル

  • h_3478

    2017/11/28 16:52

    $nodesの中身をvar_dump()で見せてもらえないでしょうか?

    キャンセル

  • h_3478

    2017/11/28 16:55

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

    キャンセル

回答 3

checkベストアンサー

+1

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

<?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 18:33

編集 2017/11/28 18:34

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/11/28 18:44

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

    キャンセル

  • 2017/11/28 18:47

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

    キャンセル

  • 2017/11/28 18:49

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

    キャンセル

0

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

<script>
 var b=`<?PHP
$nodes=[
  ['id' =>"1",'label' =>"testuser",'pic' =>""],
  ['id' =>"2",'label' =>"test",'pic' =>""],
  ['id' =>"11",'label' =>"test300",'pic' =>""],
  ['id' =>"12",'label' =>"test400",'pic' =>""],
  ['id' =>"13",'label' =>"test1106",'pic' =>""],
  ];
$links=[
  ['source' =>"1",'target' =>"2"],
  ['source' =>"2",'target' =>"1"],
  ['source' =>"12",'target' =>"11"],
  ['source' =>"11",'target' =>"12"],
  ['source' =>"13",'target' =>"11"],
  ['source' =>"11",'target' =>"13"],
  ['source' =>"11",'target' =>"12"],
  ['source' =>"13",'target' =>"12"],
  ];
$a=["nodes"=>$nodes,"links"=>$links];
print json_encode($a,JSON_UNESCAPED_UNICODE |JSON_NUMERIC_CHECK | JSON_UNESCAPED_SLASHES | JSON_PRETTY_PRINT );
?>`;
console.log(b);
var c=JSON.parse(b);
console.log(c);
</script>

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

投稿 2017/11/28 17:11

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

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 17:31

編集 2017/11/28 17:33

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/11/28 18:00

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

    キャンセル

  • 2017/11/28 18:07

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

    キャンセル

  • 2017/11/28 18:13

    片方にデーターベースに接続する処理を、片方に接続ユーザー情報を書いています
    接続自体は問題なくできています
    以下のページを参考にしました
    https://qiita.com/fantm21/items/891192da1a095e94c9e1

    キャンセル

  • 2017/11/28 18:16

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

    キャンセル

  • 2017/11/28 18:19

    NO errorとでます
    ブラウザ上では変わらずSyntaxErrorですが

    キャンセル

  • 2017/11/28 18:41

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

    キャンセル

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

ただいまの回答率

91.35%

関連した質問

同じタグがついた質問を見る

  • PHP

    15152questions

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

  • JSON

    775questions

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