🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
PHP

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

Q&A

解決済

3回答

9219閲覧

fetchAll()の抽出をforeachでループする方法

退会済みユーザー

退会済みユーザー

総合スコア0

PHP

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

0グッド

0クリップ

投稿2020/01/03 19:31

編集2020/01/03 21:35

参考にしているサイト: ドットインストール
ドットインストールをベースに行なっています。

前回の質問より、1レコードずつ変数に格納するのではなく、fetchAllの結果をforeachでループするという事がわかったので、実行してみたのですが実行結果が、以下の様になりました。

###実行結果

(Array)(Array)(Array)(Array)

###コード

php

1try { 2 // connect 3 $db = new PDO(PDO_DSN, DB_USERNAME, DB_PASSWORD); 4 $db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); 5 6 // select all 7 $stmt = $db->query("select * from formtable"); 8 $users = $stmt->fetchAll(PDO::FETCH_ASSOC); 9 foreach ($users as $key) : 10 echo "($key) $value"; 11 endforeach; 12 13} catch (PDOException $e) { 14 echo $e->getMessage(); 15 exit; 16 17} 18 19 20?>

###行なった事
PDO::FETCH_ASSOCというデータ形式に指定してみたのですが、変化がなかった為、変更しませんでした。
データ形式に問題があるのでは?と思い調べてみたのですが、質問点にも書いた様に、あまり載っていなかったです。

##質問点

  • なぜ、arrayと表示されているか又、どうすれば良いのか
  • 引っ張ってくるときにどういうデータ形式で引っ張ってくるかを指定することができかを現在はPDO::FETCH_ASSOCとしているが、他のデータ形式にするさいのコード(PHPマニュアルで配列などで探したのですが、私の調べる限り出てきませんでしたので、一覧などがあるページ等を提示してくださると幸いです。)
  • 上記のデータの型のほかのモード(?)としてPDO::FETCH_CLASSというものがあると知りました。以下の様にPDO::FETCH_CLASSの説明をしていたのですが、いまいち分かりません。クラスに直接セットできるメリットは何なのでしょうか?

これを使うと抽出したデータを自分が指定したクラスに直接セットできる

参考元: [ドットインストール](https://dotinstall.com/)

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

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

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

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

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

guest

回答3

0

なぜ、arrayと表示されているか又、どうすれば良いのか

別の方の回答にもあるように結果セットを、配列として取得しているからです。

引っ張ってくるときにどういうデータ形式で引っ張ってくるかを指定することができかを現在はPDO::FETCH_ASSOCとしているが、他のデータ形式にするさいのコード(PHPマニュアルで配列などで探したのですが、私の調べる限り出てきませんでしたので、一覧などがあるページ等を提示してくださると幸いです。)

マニュアルでも良いですが、サンプルを多く扱っている以下の記事は一読しておくと良いです。

PDOフェッチパターン大全

上記のデータの型のほかのモード(?)としてPDO::FETCH_CLASSというものがあると知りました。以下の様にPDO::FETCH_CLASSの説明をしていたのですが、いまいち分かりません。クラスに直接セットできるメリットは何なのでしょうか?

メリットはリンク先の更にリンク先で説明していますが、そもそも class を使用するようなプログラムを書いていないと理解できないと思います。

投稿2020/01/04 12:39

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

退会済みユーザー

退会済みユーザー

2020/01/04 18:34

ご回答ありがとうございます。 >マニュアルでも良いですが、サンプルを多く扱っている以下の記事は一読しておくと良いです。 拝見しました。PHPマニュアルでは例としていくつか挙げられていますが、提示してもらった記事では、沢山のサンプルがあり分かりやすかったです。 参考にします。ありがとうございます。 >メリットはリンク先の更にリンク先で説明していますが、そもそも class を使用するようなプログラムを書いていないと理解できないと思います。 どの様なものかわからないのに、どんなメリットがあるのか聞いても分かりませんよね。。 ありがとうございます。
guest

0

ドットインストールとか教材に頼るよりも先に、
PHPの公式ドキュメント類の方を読み込んで、サンプルコードの意味を理解して、
関数やメソッドの入力や出力に(思い込みを排除して)注目すれば、
さほどズレたコードは書かない気がするのですが。

例えば、こんな感じとか。(机上のみで、動かしてないけど)

php

1<?php 2try { 3 // connect 4 $db = new PDO(PDO_DSN, DB_USERNAME, DB_PASSWORD); 5 $db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); 6 7 // select all 8 $stmt = $db->query("select * from formtable"); 9 $users = $stmt->fetchAll(PDO::FETCH_ASSOC); 10 foreach ($users as $row) : 11 foreach ($row as $key => $value) : 12 echo "($key) $value"; 13 endforeach; 14 echo "------"; // レコードの区切りをわかりやすく 15 endforeach; 16 17} catch (PDOException $e) { 18 echo $e->getMessage(); 19 exit; 20 21} 22 23

投稿2020/01/04 01:10

編集2020/01/04 02:59
退会済みユーザー

退会済みユーザー

総合スコア0

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

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

退会済みユーザー

退会済みユーザー

2020/01/04 18:36

>ドットインストールとか教材に頼るよりも先に、 PHPの公式ドキュメント類の方を読み込んで、サンプルコードの意味を理解して、 関数やメソッドの入力や出力に(思い込みを排除して)注目すれば、 さほどズレたコードは書かない気がするのですが。 オンライン教材だからだと言い、信頼しすぎてた部分がありました。PHPマニュアルを読んだところ、少し誤解が解けました。ありがとうございます。
guest

0

ベストアンサー

なぜ、arrayと表示されているか

配列だからです。

PHPマニュアルを確認してください。
サンプルコードに結果が載っています。

例1

Array ( [0] => Array ( [name] => apple [0] => apple [colour] => red [1] => red ) [1] => Array ( [name] => pear [0] => pear [colour] => green [1] => green )

上記を例にすると
foreach ($users as $key)

の$keyが持っているのは2段目のArrayです。
2段目のArrayをそのまま出力しようとしているのでArrayが出ます。
もちろん
$key['name']のように存在するキーを指定すればちゃんと出力されます。
ついでに突っ込んでおくと$valueと書かれてますがどこにも定義されてないので何も出ません。
変数未定義のNoticeは出るはずですが、エラー表示ONにしてないみたいですね。

引っ張ってくるときにどういうデータ形式で引っ張ってくるかを

むしろPDO::FETCH_ASSOCをどこから引っ張ってきたのでしょうか。

PDOStatement::fetchAllも利用できるfetch_styleは記載されていますし、そこの一番目にリンクのあるPDOStatement::fetchにもfetch_style並んでいますね。

「私の調べる限り出てきませんで」と仰いますが、割とストレートに記載されているので、どのような探し方をしたのか、確認したページなど提示してもらえませんか?
PDOStatement::fetchAllを見れば必ず目につくはずです。
見落とすほうが難しいと個人的には思います。

上記のデータの型のほかのモード(?)としてPDO::FETCH_CLASSというものがあると

「これを使うと抽出したデータを自分が指定したクラスに直接セットできる 」の出典はどこでしょうか。

PHPマニュアルには下記のようにあります。
PDO::FETCH_CLASS: ここで指定したクラスのインスタンスを返します。各行のカラムがクラスのプロパティ名にマッピングされます。

そして例4 各結果用のクラスのインスタンス作成サンプルコードとその出力結果もありますね。
ご自身でも試してみましたか?
そのまま「PDO::FETCH_CLASS メリット」で検索してもしっかり解説している記事も出てくるように思います。

まずは自身で試して、使い方を想像しつつ、解説している記事を読むと良いでしょう。

投稿2020/01/03 20:11

編集2020/01/03 20:12
m.ts10806

総合スコア80875

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

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

退会済みユーザー

退会済みユーザー

2020/01/03 20:24

>「私の調べる限り出てきませんで」と仰いますが、割とストレートに記載されているので、どのような探し方をしたのか、確認したページなど提示してもらえませんか? 検索ボックスでarrayと検索し、該当項目をチェックしました。 https://www.php.net/manual/ja/book.array.php >むしろPDO::FETCH_ASSOCをどこから引っ張ってきたのでしょうか。 >「これを使うと抽出したデータを自分が指定したクラスに直接セットできる 」の出典はどこでしょうか。 ベースはドットインストールで習った事で行なっています。参照したのはドットインストールです。
m.ts10806

2020/01/03 20:34 編集

fetchAll利用しているのならそこから見るのが定石です。 配列自体が問題ではなく、fetchAllが何を返すのかを確認していないことが問題です。 それに折角「array」とPHPが出してくれているのですから「そのarrayには何が入っているのか?」をvar_dump()などで確認すれば今回の質問の7割は出てなかった可能性があります。
m.ts10806

2020/01/03 20:33 編集

>参照したのはドットインストールです。 出典は初めから明示しましょう。全ての人がドットインストールを通るわけではありません。 (現在PHPでそれなりに回答してきている人はむしろドットインストール使ってないのでは。全くいないわけではないでしょうけど)
退会済みユーザー

退会済みユーザー

2020/01/03 21:32

>出典は初めから明示しましょう。全ての人がドットインストールを通るわけではありません。 (現在PHPでそれなりに回答してきている人はむしろドットインストール使ってないのでは。全くいないわけではないでしょうけど) 確認したところ、ドットインストールのコピーライトが2011年だったので、早くても2011年以降からサポートが始まったとしても、8年程です。回答者さんは、回答できるレベルを持っているという事ですし、スキルが高い人が多いという私の認識ですから、八年では穴埋めできませんので、ドットインストールは使ってない人は多いと認識しました。 修正させていただきます。
m.ts10806

2020/01/03 21:45 編集

あまり否定ばかりしてもあれですが、サービスの運用年数とPHPのスキルレベルは関連しないと思います。 きちんとできる人は未経験から数ヶ月でも多少の実務はこなせるようになるでしょうし、出来ない人は何年たっても初心者以下です。 それもこれもPHPマニュアルなど言語やフレームワークのドキュメントを活用できるようになるかどうかが一つのキーであり壁です。 ちなみに。私自身PHPに出会ったのが10年ほど前ですが、「ドットインストール」というもの自体を知ったのはteratailに登録した2017年以降です。無料でできるという点では広まってるようですね。 「じゃあそれで実務に携われるか」というと本人の資質も大きいでしょう。 プログラミングの本質は問題解決にあるので、オンライン学習にばかり頼って自ら考えない・探求しない人は「何年たっても」の方に入ります。 2年半ほど質問見てきましたけど、質問内容で成長する人しない人は分かりますね。 私は見ての通り結構なお人好しなので見込み無くても「間違った情報や参考にならない情報になってはいけない」という想いから回答することが多いですけどね。
退会済みユーザー

退会済みユーザー

2020/01/03 22:01

>プログラミングの本質は問題解決にあるので、オンライン学習にばかり頼って自ら考えない・探求しない人は「何年たっても」の方に入ります。 上記で書いた事にもならないようにしたいと思います。 ただ、独学だからではないと思いますけど。1つのエラーに数時間あるいは、日をまたいでしまうことなどあります。その際に、サイト等でキーワードをいれて入力した後、teratailで質問をしようと心がけていきます。
退会済みユーザー

退会済みユーザー

2020/01/03 22:14

いきなり、既在のDBの内容で行なってしまった為か、少し混乱してしまっているのが現在の状況です。
m.ts10806

2020/01/03 22:22

ちょっと意味がわかりません。 変数が保持している内容をひとつひとつ確認していけばインプットとなる情報がなんであろうと関係ないのでは?
m.ts10806

2020/01/03 22:30

>1つのエラーに数時間あるいは、日をまたいでしまうことなどあります まあ、実務ではよくあることですよ。 結局単純なミスであることが多いですけど。 IDE使ってれば防げることも非常に多いです。 だから現場ではIDEが使われるのです(単純ミスを減らして作業効率を上げるため)
退会済みユーザー

退会済みユーザー

2020/01/03 22:32

一度、正常に表示された後にコメントでどのような処理が行われていたかを自身で記述し学習する様にしました。 ですが、正常に表示されるか試したのですが、実行されません。 try { // connect $db = new PDO(PDO_DSN, DB_USERNAME, DB_PASSWORD); $db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); // select all $stmt = $db->query("select * from formtable"); $users = $stmt->fetchAll(PDO::FETCH_ASSOC); foreach ($users as $key['name']) : echo "($key['name']) "; endforeach; } catch (PDOException $e) { echo $e->getMessage(); exit; } ?>
退会済みユーザー

退会済みユーザー

2020/01/03 22:42 編集

>だから現場ではIDEが使われるのです IDEというものについて無知だったので、調べたのですが、エディタだけでなくWeb IDEはウェブブラウザ上で動作する統合開発環境という認識でよろしいでしょうか? 参考にしたサイト: https://qiita.com/yoshiokatsuneo@github/items/338c60a5b9f04bb7e1ce 私は、エディタはVScode開発環境はMAMPで行なっているのですが、それらをブラウザで行う事ができるといった様なものでしょうか? (HTML/CSS/JavaScriptでいうところのCodePenのようなものでしょうか?) https://codepen.io/
m.ts10806

2020/01/03 22:50 編集

> IDE Eclipseが代表的です。 VSCodeもIDEのうちだとは思いますが、 私が関わった現場はPHPもJavaもEclipseです。 資金に余裕があればPHPStormが良いのでは。 https://qiita.com/rana_kualu/items/95f0c8be51e8665015d5#ide%E3%82%92%E4%BD%BF%E3%81%88 結局は現場ルールと好みによると思います。その人が開発に何を求めるかによるでしょう。 > ですが、正常に表示されるか試したのですが、実行されません。 繰り返します。 変数が保持している内容をひとつひとつ確認していけばインプットとなる情報がなんであろうと関係ないのでは? 一気にやろうとしてできるわけがないので1行ずつ結果を確認してください。
退会済みユーザー

退会済みユーザー

2020/01/03 23:22

一度IDEのインストールも含めて行うので、後日返信させていただきます
m.ts10806

2020/01/03 23:25

EclipseでAll in one ならダウンロードして解凍するだけでインストールはおしまいです。特殊なことをしたいのでなければプラグインを入れなくても事足ります それと今回の質問はリンクしない(そもそも多次元配列の扱い方の問題でもある)ので、こちらを先に解決された方が良いです。
退会済みユーザー

退会済みユーザー

2020/01/04 08:26

了解です
退会済みユーザー

退会済みユーザー

2020/01/04 18:41

一行ずつその変数に代入されたものをコメントして、確認したところできました。 オンライン教材だからといって、少し妥協しすぎた部分がありましたが、PHPマニュアルを読んだところ、誤解が解けました。 オンライン教材では、教材レベルの実力になってしまいます。。 ---- IDEはインストールができたのですが、操作がまだできていない状況なので、Qiita等で参考になる記事を探したいと思います。
m.ts10806

2020/01/04 23:47

仕様を元に自ら考えていく力がないとプログラミングは厳しいです。 学校のお勉強・試験とは違うので。論理的思考を育ててください。
退会済みユーザー

退会済みユーザー

2020/01/04 23:56 編集

論理的思考だとか、プログラミング的思考などよく世間で耳にしますね。というのも、ご存知かと思いますが、2020年度よりプログラミングの授業が必修化すると文部科学省が定めたようです。この論理的思考の重要性は明らかだと、m.ts 10806さんの指摘で再認識できました。 ありがとうございます。 https://www.sejuku.net/blog/107493
m.ts10806

2020/01/05 00:00

プログラミング言語はあくまで問題解決のための道具・ツールです。 それをどのように使って問題解決していくかを考えることが大事です。 >sejuku.net 個々の記事の質はともかく、こういうそれなりに世間に影響のある 問題が起きたサービス提供元を避ける情報収集や「より正しい情報にアクセスする」 ための思考も大事ですね。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問