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

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

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

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

PDO

PDO(PHP Data Objects)はPHPのデータベース抽象化レイヤーです。

PHP

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

Q&A

解決済

3回答

4120閲覧

【PHP】Invalid argument supplied for foreach() エラーが表示されたりされなかったり・・・

zoizoi

総合スコア11

MySQL

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

PDO

PDO(PHP Data Objects)はPHPのデータベース抽象化レイヤーです。

PHP

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

0グッド

0クリップ

投稿2017/05/21 11:04

編集2017/05/21 12:04

###前提・実現したいこと
SQLのテーブルに登録したIDとパスワードを、HTMLのtable内に全て正しく表示させるのが最終目標です。

問題は、コピペして同じように書いているはずなのに、何故かエラーが吐かれる箇所とエラーのない箇所が同時に発生してしまっていることです。
###発生している問題・エラーメッセージ

Warning: Invalid argument supplied for foreach() in /home/users/****/****/****/****/****/manage_list.php on line 78 Warning: Invalid argument supplied for foreach() in /home/users/****/****/****/****/****/manage_list.php on line 83

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

PHP

1<?php $stmt4 =$pdo](1147ac7e24e1de6ee8e92aee88938b41.png)->query('SELECT 2login_no 3FROM 4login_member'); ?> 5 6<?php $stmt5 =$pdo->query('SELECT 7login_id 8FROM 9login_member'); ?> 10 11<?php $stmt6 =$pdo->query('SELECT 12login_pass 13FROM 14login_member'); ?> 15<?php while($re2 = $stmt4->fetch(PDO::FETCH_ASSOC) && $re3 = $stmt5->fetch(PDO::FETCH_ASSOC) && $re4 = $stmt6->fetch(PDO::FETCH_ASSOC)) :?> 16<tr> 17 <td> 18 <?php foreach($re2 as $k => $v):?> 19 <?php print_r($v)?> **←エラー箇所** 20 <?php endforeach;?> 21 </td> 22 <td> 23 <?php foreach($re3 as $k => $v):?> 24 <?php print_r($v)?> **←エラー箇所** 25 <?php endforeach;?> 26 </td> 27 <td> 28 <?php foreach($re4 as $k => $v):?> 29 <?php print_r($v)?> **←ここは何故かエラーがなく、正しくlogin_passが表示される** 30 <?php endforeach;?> 31 </td> 32 <form action="" method="post"> 33 <td><input type="button" name="edit" onclick="location.href='./manage_edit.php'" value="編集" /> 34 <input type="button" name="delete" onclick="location.href='./manage_conf.php'" value="削除" /></td> 35</tr> 36<?php endwhile;?>

###試したこと
1.Invalid argument supplied for foreach()エラーをググってみたところ、foreach内の変数が配列ではない場合に吐かれるエラーとの事なので、

<?php foreach($re2 as $k => $v):?>を <?php foreach((array)$re2 as $k => $v):?>に

変更してみた所、
エラーは吐かれなくなったのですが、login_noもlogin_idも「1」しか表示されなくなってしまいました。
イメージ説明

2.<?php while($re2 = $stmt4->fetch(PDO::FETCH_ASSOC) && $re3 = $stmt5->fetch(PDO::FETCH_ASSOC) && $re4 = $stmt6->fetch(PDO::FETCH_ASSOC)) :?>
の条件式の前に、

<?php while($re2 = $stmt4->fetch(PDO::FETCH_ASSOC)):?>
<?php foreach($re2 as $k => $v):?> <?php print_r($v)?> <?php endforeach;?> <?php endwhile;?>
<?php while($re3 = $stmt5->fetch(PDO::FETCH_ASSOC)):?>
<?php foreach($re3 as $k => $v):?> <?php print_r($v)?> <?php endforeach;?> <?php endwhile;?>

と試しに打ってみたら、
login_noもlogin_idも正しくprint_rされたので、
なぜ該当ソースコードの中ではエラーが吐かれてしまうのかわけがわかりません。。。

わかりづらい所、至らぬ所があったらご指摘ください。

ご教授宜しくお願い致します。

###補足情報(言語/FW/ツール等のバージョンなど)
FWは使っていません

以下エラーのスクショです
イメージ説明

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

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

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

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

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

guest

回答3

0

while文の条件式が危なっかしいですね。

とりあえずwhileループ中の$re2とか$re3とかの値を確認してみては?

投稿2017/05/21 12:11

harashow1701

総合スコア854

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

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

zoizoi

2017/05/21 17:45

ご回答ありがとうございます。 while文の条件式がスマートではないのは自分でも感じているのですが、 試行錯誤した末にこの条件式で惜しい所まで来たので他にどう書いたら良いのかわからないのです・・・。
guest

0

ベストアンサー

がるです。
すみません、こちらのシステムだと、コメントにはソースコードがうまく書けないので、改めて「回答」のほうで書かせていただきます。

分割して書かないと、HTMLの各<td>内に、login_no, login_id, login_passを、添付した画像のように分けて表示させる事が出来なくて

とあったので、おそらく、(連想)配列等に慣れてらっしゃらないように見受けました。
ざっくりとノーデバックで記述したので修正が必要かと思うのですが。
大まかな「こんな感じで書けば、SQLの発行が1回ですむよ」のサンプルとして、以下のコードを見ていただければ、と思います。

PHP

1<?php 2// SQLを発行 3$stmt =$pdo->query('SELECT * FROM login_member'); 4 5// 取得したデータ分、ループを回す 6while($re = $stmt->fetch(PDO::FETCH_ASSOC)) :?> 7<tr> 8 <td> 9 <?php print_r($re['login_no'])?> 10 </td> 11 <td> 12 <?php print_r($re['login_id'])?> 13 </td> 14 <td> 15 <?php print_r($re['login_pass'])?> 16 </td> 17 <form action="" method="post"> 18 <td><input type="button" name="edit" onclick="location.href='./manage_edit.php'" value="編集" /> 19 <input type="button" name="delete" onclick="location.href='./manage_conf.php'" value="削除" /></td> 20</tr> 21<?php endwhile;?>

質問等あったら、また記入していただければ、と思います。

投稿2017/05/22 13:40

gallu

総合スコア506

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

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

zoizoi

2017/05/22 15:02

がるさん ご丁寧にありがとうございます! ほとんどこのまま書いたら、login_noとlogin_passが正しく表示されました! ご指摘の通り自分は連想配列が苦手で、更にfetchの挙動もよく理解せずに書いていました。 教えていただいたら、なんでこんな簡単なことに・・・と言った感じなので、これからはもう少し考えてから質問したいと思います。 がるさんどうもありがとうございました!
gallu

2017/05/23 14:04

連想配列は、確かにイメージがしにくいもの、かもしれません(苦笑 print_rもよいのですが、個人的には var_dump のほうを出力ではよく使いますね。 「うまくいった」コードの、連想配列が「どんなデータが入っているのか」表示をしてなんとなし眺めてみる、なんていうのもよいかもしれません。 頑張ってください^^ノ
guest

0

がると申します。

ものすごく単純な疑問なのですが。

SELECT login_no FROM login_member SELECT login_id FROM login_member SELECT login_pass FROM login_member

のSQLを発行するのであれば、代わりに

SELECT * FROM login_member

またはより適切(元のコードに忠実)には

SELECT login_no, login_id, login_pass FROM login_member

の1回だけ、SQLを発行したほうがコードが明らかに楽、かつ見通し良く書けると思うのですが、なにか「分割して書かなければいけない」理由など、ある感じでしょうか?

投稿2017/05/21 14:09

gallu

総合スコア506

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

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

gallu

2017/05/21 14:10

あと、追記ですが。 基本的には「パスワードを平文で所持する」のは、大変に「お勧めをしない」実装になります。
zoizoi

2017/05/21 17:43

がるさん ご回答ありがとうございます。 >「分割して書かなければいけない」理由など、ある感じでしょうか? 分割して書かないと、HTMLの各<td>内に、login_no, login_id, login_passを、添付した画像のように分けて表示させる事が出来なくてこう書いています。 冗長だとは思いますが・・・ パスワード平文に関しては、今回の課題の条件で、パスワードはあえて表示させることを要求されているので大丈夫です。 しかし実務システムを作る際には気をつけます。ありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.49%

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

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

質問する

関連した質問