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

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

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

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

JSON

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

PHP

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

Q&A

解決済

2回答

968閲覧

4つのレコードをjson形式で表示したいのですができません

jiro-

総合スコア28

MySQL

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

JSON

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

PHP

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

0グッド

0クリップ

投稿2020/02/18 09:37

編集2020/02/18 09:50

前提・実現したいこと

MySQLのparticipating_athletesというテーブルに4つのレコードが入っています。
その4レコードをjson形式にしてオブジェクトをブラウザで表示したいのですが、$decoded_jsonの中身がquery文のオブジェクトになり表示されてしまいます。
参考にしたサイト:リンク内容リンク内容
オブジェクトの1つのkeyの中身を取得表示する場合はアローで取得すると書いているのですが、複数のレコードを取得表示する場合はvar_dump($decoded_json)という表示のさせ方でできるように参考にしたサイトでは書かれているように思います。
私の認識が間違えていますでしょうか?ご教授よろしくお願い致します。

現在ブラウザに表示されているのは

var_dump($decoded_json)の中身を確認して表示されているものです。
下にoneというphpを書いてそちらではDBからレコードの取得までできているのは確認できています。

json.phpのブラウザ表示画面

C:\xampp\htdocs\PDO\json.php:24: object(stdClass)[3] public 'queryString' => string 'SELECT * FROM participating_athletes' (length=36)

該当のソースコード

json.php

<?php //変数の初期化 $athletes = null; $res = null; $dbh = null; $dsn = "mysql:dbname=mydb;host=localhost;charset=utf8mb4"; $user_name = "root"; $password = ""; $driver_options = [ PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION, PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC, ]; try { //DBへ接続 $dbh = new PDO($dsn, $user_name, $password, $driver_options); //SQL作成 $participating_athlete = "SELECT * FROM participating_athletes"; //SQL実行 $athletes = $dbh->query($participating_athlete); //連想配列をJSONに変換 $json = json_encode($athletes , JSON_PRETTY_PRINT|JSON_UNESCAPED_UNICODE|JSON_UNESCAPED_SLASHES ) ; //json形式に変換されている$jsonをオブジェクト型に変換する $decoded_json = json_decode($json); print(var_dump($decoded_json)); } catch (PDOException $e) { // エラーメッセージを表示させる echo ‘データベースにアクセスできません!’ . $e->getMessage(); // 強制終了 die(); } //接続を閉じる $dbh = null; ?>

試したこと

#####PDOに接続できているか確認しMySQLからレコードを取ってこれているか連想配列で確認したコード
one.php

<?php //変数の初期化 $athletes = null; $res = null; $dbh = null; $dsn = "mysql:dbname=mydb;host=localhost;charset=utf8mb4"; $user_name = "root"; $password = ""; $driver_options = [ PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION, PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC, ]; try { //DBへ接続 $dbh = new PDO($dsn, $user_name, $password, $driver_options); //SQL作成 $participating_athlete = "SELECT * FROM participating_athletes"; //SQL実行 $athletes = $dbh->query($participating_athlete); //取得したデータを出力 foreach ($athletes as $athlete) { echo $athlete['id'].':'.$athlete['name'].':'.$athlete['race_name']; echo '<br>'; } } catch (PDOException $e) { // エラーメッセージを表示させる echo 'データベースにアクセスできません!' . $e->getMessage(); // 強制終了 die(); } //接続を閉じる $dbh = null; ?>

one.phpのブラウザでの表示画面

1:マリオ:キノコレース 3:ルイージ:キノコレース 4:クッパ:フラワーレース 5:ドンキー:スターレース

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

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

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

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

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

jiro-

2020/02/18 09:51

すいません。何がわかっていないかを追記しましたm(__)m
guest

回答2

0

ベストアンサー

どういう結果を得たいかによるんですけど。
PDO::queryの返却値ってPDOStatement なので、もう1ステップ入れないと中身取り出せません。PHPマニュアル確認しましょう。

とするくらいなら、PDO::prepare → PDOStatement::bindValue → PDOStatement::execute の3ステップでクエリを実行して、fetchAll()したほうが配列そのままjson_encode()にかけられるので安全で楽かと思います。

投稿2020/02/18 09:46

編集2020/02/18 09:50
m.ts10806

総合スコア80875

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

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

jiro-

2020/02/18 09:54

ご返信、アドバイスありがとうございます。 投稿の仕方失礼しましたm(__)m 今読ませて頂いたのですが、アドバイス頂いた内容で理解できない単語が多いので今から調べて1ステップ入れれるようにやってみます。ありがとうございます。 コードができたら再度アップさせて頂きます!
m.ts10806

2020/02/18 09:55

もしかしたら何度か指摘しているかもしれませんが、 PHPマニュアルを必ず確認してください。
jiro-

2020/02/18 09:58

すいません。了解です! PHPマニュアルが読んでも難しく理解できない事が多いので、逃げて簡易に書いてくれているサイトばかりを見るようになってしまってました。必ず見るようにします!
jiro-

2020/02/18 12:03

追加でアドバイスありがとうございます! 今送って頂いた関数の定義(プロトタイプ)を読むにはを1度目を通してみたのですが、恥ずかしながら半分以上理解できなかったです、、、後で調べながらもう1度読んでみます!
m.ts10806

2020/02/18 12:06

読んで理解するというより、「PHPマニュアルの機能確認をする際にページはこういう構造になっているよ」という説明ページなので、取扱説明書の説明と思ってください。 ちなみに、「どういうところが」「どう」理解できなかったのでしょうか。
jiro-

2020/02/18 12:10

3ステップでのクエリ実行で1つはオブジェクト表示する事ができました。 <?php header( "Content-Type: application/json; charset=utf-8" ) ; //変数の初期化 $athletes = null; $res = null; $dbh = null; $dsn = "mysql:dbname=mydb;host=localhost;charset=utf8mb4"; $user_name = "root"; $password = ""; $driver_options = [ PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION, PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC, ]; try { //PDOオブジェクト生成しDBへ接続 $dbh = new PDO($dsn, $user_name, $password, $driver_options); //prepareメソッドでSQLをセット,返り値は「PDOStatement オブジェクト」 //prepareはクエリの分析、コンパイル等にかかる時間は最初の1回だけでよく高速に実行 //また、SQLインジェクション対策に必要なパラメータのエスケープ処理も自動で行われ、安全 //使いどころ、SQLに変数を割り当てしたい時に利用する $stmt = $dbh->prepare("SELECT * FROM participating_athletes where id = ?"); $id = 1; //blidValueはパラメータのセット $stmt->bindValue(1, $id); //$stmt->bindValue(1, 3); //excuteは準備したPDOstatmentにセットしたクエリを実行 $stmt->execute(); //fetchAll=全ての結果レコードを含む配列を返す $athletes=$stmt->fetchAll(PDO::FETCH_ASSOC); //連想配列をJSONに変換 $json = json_encode($athletes , JSON_PRETTY_PRINT|JSON_UNESCAPED_UNICODE|JSON_UNESCAPED_SLASHES ) ; print_r($json); } catch (PDOException $e) { // エラーメッセージを表示させる echo ‘データベースにアクセスできません!’ . $e->getMessage(); // 強制終了 die(); } //接続を閉じる $dbh = null; ?> 結果 ``` [ { "id": "1", "name": "マリオ", "race_name": "キノコレース", "created": "2020-02-12 20:20:06", "modified": "2020-02-12 20:20:06" } ] ``` SQLに変数を割り当てしたい時に利用する時に、prepareとexecuteで高速、SQLインジェクション対策も行えるという事も学べました。 これを使って複数のオブジェクト表示をやってみたいと思います。 PDOのPHPマニュアルももう一度見てみます! ありがとうございました!
jiro-

2020/02/18 13:01 編集

マニュアルより抜粋 in_array ( mixed $needle, array $haystack [, bool $strict = FALSE ] ) : bool in_arrayがbooleanのtrueとfalseを返すという事は理解できました。 ()の中で書かれている ( mixed $needle, array $haystack [, bool $strict = FALSE ] ) : bool とありますが、needle が haystack の中にある場合とこのコードの書き方から読み取る知識がないからです。 [, bool $strict = FALSE ] は$strict = FALSEにするとかは分かるのですが
m.ts10806

2020/02/18 12:53

全抜粋しなくても・・・。 $needleも$haystackもあくまで変数です。 それより型に注目すべきですね。その機能のとる引数の型。 https://www.php.net/manual/ja/functions.arguments.php#functions.arguments.type-declaration ただ、プロトタイプページはその「プロトタイプ」という名前のように、「例」です。 「こういう見方をします」という例です。 ちなみに [] 内は「任意の引数」です。 という前提知識を元に今回使いたい機能の説明ページを見てみるとどうでしょうか。 少しだけ使い方が分かるようになりませんか? いずれにしても「機能」というのは「関数」です。 「何を渡したら」「何が返ってくる」という「input / output 」だけでも押さえれば十分だったりします。APIの考え方です。使う側は内部の処理は意識することはほとんどないです。 「何を渡したら」「何が返ってくる」 日常生活にすると下記。 「自販機にお金を入れてボタンを押したら」「指定した缶ジュースが出てくる」 というものです。
jiro-

2020/02/18 13:19

抜粋しすぎて見にくくしてしまってすいません。 第3引数[任意の引数]で変更できるというのも理解できました! 今 https://www.php.net/manual/ja/pdo.prepare.php https://www.php.net/manual/ja/pdostatement.bindvalue.php をもう一度見てみたのですが、今まで指定された型やmixedで様々な型が使えるなどに目はいってなかったので見方が変わってます!! 「何を渡したら」「何が返ってくる」 ここも余り意識せずに使ってたので意識するようにします。 PHPマニュアルをこの見方で見るようにします! ご丁寧に今後の事まで考えてアドバイスして頂き本当にありがとうございました!
guest

0

$pdo=new PDO(・・・);
$sql="SELECT * FROM participating_athletes";
$stmt = $pdo->query($sql);
$rows=$stmt->fetchAll(PDO::FETCH_ASSOC);
$json = json_encode($rows);
print_r($json);

投稿2020/02/18 09:44

yambejp

総合スコア116724

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

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

jiro-

2020/02/18 09:56

ご返信ありがとうございます! m.tsさんのアドバイス同様fetchAllというのでquery文を変換しないとダメなようですね! 調べてやってみます。 アドバイスありがとうございました!
jiro-

2020/02/18 12:20

ありがとうございました! レコードを4つ取得し表示する事できました! <?php header( "Content-Type: application/json; charset=utf-8" ) ; //変数の初期化 $athletes = null; $res = null; $dbh = null; $dsn = "mysql:dbname=mydb;host=localhost;charset=utf8mb4"; $user_name = "root"; $password = ""; $driver_options = [ PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION, PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC, ]; try { //DBへ接続 $dbh = new PDO($dsn, $user_name, $password, $driver_options); //SQL作成 $participating_athlete = "SELECT * FROM participating_athletes"; //SQL実行 $rows = $dbh->query($participating_athlete); //fetchAll=全ての結果レコードを含む配列を返す $athletes=$rows->fetchAll(PDO::FETCH_ASSOC); //連想配列をJSONに変換 $json = json_encode($athletes , JSON_PRETTY_PRINT|JSON_UNESCAPED_UNICODE|JSON_UNESCAPED_SLASHES ) ; print_r($json); } catch (PDOException $e) { // エラーメッセージを表示させる echo ‘データベースにアクセスできません!’ . $e->getMessage(); // 強制終了 die(); } //接続を閉じる $dbh = null; ?> 結果 ``` [ { "id": "1", "name": "マリオ", "race_name": "キノコレース", "created": "2020-02-12 20:20:06", "modified": "2020-02-12 20:20:06" }, { "id": "3", "name": "ルイージ", "race_name": "キノコレース", "created": "2020-02-12 20:22:11", "modified": "2020-02-12 20:22:11" }, { "id": "4", "name": "クッパ", "race_name": "フラワーレース", "created": "2020-02-12 20:22:49", "modified": "2020-02-12 20:22:49" }, { "id": "5", "name": "ドンキー", "race_name": "スターレース", "created": "2020-02-12 20:23:51", "modified": "2020-02-12 20:23:51" } ] ```
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問