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

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

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

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

phpMyAdmin

phpMyAdminはオープンソースで、PHPで書かれたウェブベースのMySQL管理ツールのことです。

PHP

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

Q&A

解決済

1回答

524閲覧

取出したMySQLのデータをjson_encodeする時に、階層構造を作りたい

oyatsu8

総合スコア97

MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

phpMyAdmin

phpMyAdminはオープンソースで、PHPで書かれたウェブベースのMySQL管理ツールのことです。

PHP

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

0グッド

0クリップ

投稿2017/09/26 17:21

編集2017/09/27 05:00

MySQL,PHP初心者です。phpMyadminから取出したMySQLのデータをjson_encodeする時に、階層構造を作りたいのですが、どうしていいか分かりません。
最初はCONCATを使って、階層の上の部分を追加しようとしたのですが、うまく行かず、
下記のような記事を見つけましたが、丁度この逆のことがしたいと思っています。
アドバイスを頂けたら助かります。

http://pulogu.net/blog/020-computer/php/json-use/

また、そのような事をしたい場合に、ちょうど良い参考書があれば教えて頂けたら助かります。

追記:
回答をありがとうございます。
プログラムは多分全然出来ていないと思いますが追記させて頂きます。
SELECT文の後か前に、PHPで階層を作るようなプログラムにしないといけないと思うのですが
普通はどうやるのかがわかりません。

PHPプログラム

1<?php 2function es($str) { 3 return htmlspecialchars($str, ENT_QUOTES, 'UTF-8'); 4} 5//エラー出力強制 6ini_set( 'display_errors', 1 ); 7//すべてのエラー表示 8error_reporting( E_ALL ); 9 10//データベースへの接続 11define('DB_NAME', 'test'); 12define('DB_HOST', 'test'); 13define('DB_USER', 'test'); 14define('DB_PASS', 'test'); 15 16$dbName = DB_NAME; 17 18$dsn = 'mysql:dbname=' . DB_NAME . ';host=' . DB_HOST . ';charset=utf8'; 19$option = array( 20 PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION, 21 PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC, 22 PDO::MYSQL_ATTR_USE_BUFFERED_QUERY => true, 23 PDO::ATTR_EMULATE_PREPARES => false, 24 PDO::ATTR_STRINGIFY_FETCHES => false 25); 26?> 27 28<!DOCTYPE html> 29<html lang="ja"> 30<head> 31<meta charset="utf-8"> 32<title>レコードを取り出す(すべて)</title> 33</head> 34<body> 35<div> 36 <?php 37 38 //MySQLデータベースに接続する 39 try { 40 $db = new PDO($dsn, DB_USER, DB_PASS, $option); 41 42 // SQL文を作る(全レコード) 43 44 $sql = "SELECT CONCAT ('aaaaaaaaaaa') FROM test_json"; 45 //$sql = "SELECT * FROM test_json"; 46 47 $res = $db->query($sql, PDO::FETCH_ASSOC); 48 $res = $res !== false ? $res : []; 49 $result = []; 50 51 foreach($res as $row) { 52 $result[] = $row; 53 } 54 //json 55 $json = json_encode($result); 56 57////json書き出し 58 $filename = "test_json.json"; 59 60 $result = touch($filename); 61 62 if ($result){ 63 // ファイルに書き出す 64 file_put_contents($filename, $json, LOCK_EX); 65 echo "{$filename}にデータを書き出しました。", "<hr>"; 66 echo '<a href="get_contents.php">ファイルを読み込む</a>'; 67 } else { 68 // ファイルエラー 69 echo '<span class="error">ファイルに保存できませんでした。</span>'; 70 } 71////json書き出しend 72 73 ?> 74</div> 75</body> 76</html>
  • MySQLのテーブルは階層で作る事は出来ないのでしょうか?

phpMyadminのテーブル:test_json

  • MySQLのテーブルは階層になっていませんが下記のように出力したいと思います。
"type":"type01", "properties":{ "properties01":"properties01の内容", "properties02":"properties02の内容" }, "material":{ "material01":{ "material01_shop01":"material_shop01の内容", "material01_shop02":"material_shop02の内容" }, "material02":{ "material02_shop01":"material02_shop01の購入先01の内容", "material01_shop02":"material02_shop02の購入先02の内容" }, }, "id":"0001"

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

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

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

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

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

hotta

2017/09/26 23:41

さっぱりわからない場合は、とりあえず元の(テスト)データと、それを加工した「望ましい出力」を提示してみるのもよいかもしれません。
oyatsu8

2017/09/27 01:01

ありがとうございます、追記しました
yambejp

2017/09/27 01:07

テーブルのそれぞれのカラムは、JSONデータのそれぞれ何処にあたるのでしょうか?
oyatsu8

2017/09/27 05:00

すみません、内容がずれていました。いま修正しました
guest

回答1

0

ベストアンサー

おそらくCONCATはしないほうがいいと思います
RDBからの戻りはassocでfetchAllすればスプレッドシート的な
縦×横のデータになるので、組み替えてからjsonエンコードするだけです
組み換えについては元データと結果の提示がないのでなんとも言えません

sample

PHP

1/*$aはfetchAllするものとします*/ 2$a=[ 3 [ 4 "type"=>"t_1", 5 "properties01"=>"p1_1", 6 "properties02"=>"p2_1", 7 "material01_shop01"=>"m1s1_1", 8 "material01_shop02"=>"m1s2_1", 9 "material02_shop01"=>"m2s1_1", 10 "material02_shop02"=>"m2s2_1", 11 "id"=>"i_1", 12 ], 13 [ 14 "type"=>"t_2", 15 "properties01"=>"p1_2", 16 "properties02"=>"p2_2", 17 "material01_shop01"=>"m1s1_2", 18 "material01_shop02"=>"m1s2_2", 19 "material02_shop01"=>"m2s1_2", 20 "material02_shop02"=>"m2s2_2", 21 "id"=>"i_2", 22 ], 23 [ 24 "type"=>"t_3", 25 "properties01"=>"p1_3", 26 "properties02"=>"p2_3", 27 "material01_shop01"=>"m1s1_3", 28 "material01_shop02"=>"m1s2_3", 29 "material02_shop01"=>"m2s1_3", 30 "material02_shop02"=>"m2s2_3", 31 "id"=>"i_3", 32 ], 33 ]; 34$b=[]; 35foreach($a as $key=>$val){ 36 $b[$key]["type"]=$val["type"]; 37 $b[$key]["properties"]=[];/*空配列は宣言しなくてもOKだが念の為*/ 38 $b[$key]["properties"]["properties01"]=$val["properties01"]; 39 $b[$key]["properties"]["properties02"]=$val["properties02"]; 40 $b[$key]["material"]=[]; 41 $b[$key]["material"]["material01"]=[]; 42 $b[$key]["material"]["material01"]["material01_shop01"]=$val["material01_shop01"]; 43 $b[$key]["material"]["material01"]["material01_shop02"]=$val["material01_shop02"]; 44 $b[$key]["material"]["material02"]=[]; 45 $b[$key]["material"]["material02"]["material02_shop01"]=$val["material02_shop01"]; 46 $b[$key]["material"]["material02"]["material02_shop02"]=$val["material02_shop02"]; 47 $b[$key]["idl"]=$val["id"]; 48} 49print_r(json_encode($b, JSON_PRETTY_PRINT));

投稿2017/09/27 00:19

編集2017/09/27 05:17
yambejp

総合スコア114572

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

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

oyatsu8

2017/09/27 01:02

ありがとうございます。追記しました。どのように取出したDBデータを階層に変形?するかがわからないです。
yambejp

2017/09/27 05:18

sample追記しました DBからうけとった配列$aを整形用に$bに変換してjson_encodeしておきました
oyatsu8

2017/09/27 05:30

大変ありがとうございます!!!! 多分エンジニアの方には日常的にありそうな作業だと思うのですが、このような方法はどこで学習したらいいのかわかりませんでした。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問