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

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

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

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

Q&A

解決済

1回答

2590閲覧

PHPのforeach文について

mashumaro0628

総合スコア19

PHP

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

0グッド

0クリップ

投稿2018/01/23 10:43

編集2018/01/23 12:54

###前提・実現したいこと
echo $course_name_array[2];
の下のforeach文を正常に動作させたいです

###発生している問題・エラーメッセージ

Notice: Undefined variable: key1 in C:\xampp\htdocs\training\aaa\index.php on line 19 Fatal error: Call to a member function prepare() on null in C:\xampp\htdocs\training\aaa\index.php on line 19

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

$size_array=array(); $course_name=""; $course_name_array=array(); $col_math=0; $pdo = new PDO("mysql:host=localhost;dbname=doubutsu;charset=utf8",'root','admin'); //コース名抽出 try{ $stmt = $pdo -> prepare("SELECT course_name from Course"); $stmt->execute(); foreach($stmt as $key) { $course_name.="<td>".$key['course_name']."</td>"; $course_name_array[]=$key['course_name']; } echo $course_name_array[2]; foreach ($course_name_array as $key1 ) { $stmt = $pdo -> prepare("SELECT Size from Size where course_name='".$key1."'"); $stmt->execute(); foreach ($stmt as $key2) { $size_array=$key2['Size']; } $pdo = null; } }catch(PDOException $e){ exit('データベース接続失敗' . $e->getMessage()); }

###試したこと
echo $course_name_array[2]までは値がとれています

###補足情報(言語/FW/ツール等のバージョンなど)
create table Course (
Course_Number int(5) auto_increment,
Course_Name varchar(30) not null,
Release_Range boolean not null,
Maintenance date not null,
primary key(Course_Number));

insert into Course(Course_Name,Release_Range,Maintenance) values('グルーミング',true,'20171112');
insert into Course(Course_Name,Release_Range,Maintenance) values('トリミング',true,'20171112');
insert into Course(Course_Name,Release_Range,Maintenance) values('シャンプー',true,'20171112');

create table Size (
Size_Number int(5) auto_increment,
Size_name varchar(20) not null,
Release_Range boolean not null,
Maintenance date not null,
primary key(Size_Number)
);

insert into Size(Size_name,Release_Range,Maintenance,Course_name) values('小型',true,20171112,'グルーミング');
insert into Size(Size_name,Release_Range,Maintenance,Course_name) values('中型',true,20171112,'グルーミング');
insert into Size(Size_name,Release_Range,Maintenance,Course_name) values('大型',true,20171112,'グルーミング');
insert into Size(Size_name,Release_Range,Maintenance,Course_name) values('小型',true,20171112,'トリミング');
insert into Size(Size_name,Release_Range,Maintenance,Course_name) values('中型',true,20171112,'トリミング');
insert into Size(Size_name,Release_Range,Maintenance,Course_name) values('大型',true,20171112,'トリミング');
insert into Size(Size_name,Release_Range,Maintenance,Course_name) values('小型',true,20171112,'シャンプー');
insert into Size(Size_name,Release_Range,Maintenance,Course_name) values('中型',true,20171112,'シャンプー');
insert into Size(Size_name,Release_Range,Maintenance,Course_name) values('大型',true,20171112,'シャンプー');

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

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

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

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

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

guest

回答1

0

ベストアンサー

ステートメントはfetchしないのでしょうか?

PHP

1$course_name=""; 2$course_name_array=[]; 3 4$stmt = $pdo -> query("SELECT course_name from Course"); 5$rows=$stmt->fetchAll(PDO::FETCH_ASSOC); 6 7foreach($rows as $row) { 8 $course_name.="<td>".$row['course_name']."</td>"; 9 $course_name_array[]=$row['course_name']; 10}

追記

改めて見てみましたが、Courseテーブルからcourse_nameをすべて抜き出してそれに合致する
sizeを拾っているんですよね?
であればsql文は1回発行すればよくないですか?
ただしcourse_nameがどちらかのテーブルでユニークでない場合はm×nのデータが抽出されちゃいますけどね

PHP

1try{ 2 $sql ="select t1.course_name,t2.Size from Course as t1 "; 3 $sql.="inner join Size as t2 on t1.course_name=t2.course_name "; 4 $stmt = $pdo -> query(); 5 $stmt->execute(); 6 $rows=$stmt->fetchAll(PDO::FETCH_ASSOC); 7 foreach($rows as $row) { 8 $course_name.="<td>".$row['course_name']."</td>"; 9 $course_name_array[]=$row['course_name']; 10 $size_array=$row['Size']; 11 } 12}catch(PDOException $e){ 13 exit('データベース接続失敗' . $e->getMessage()); 14}

db結合

SQL

1select t1.course_name,t2.size_name from Course as t1 2inner join Size as t2 on t1.course_name=t2.course_name

とすれば、以下が得られますね

course_namesize_name
グルーミング小型
グルーミング中型
グルーミング大型
トリミング小型
トリミング中型
トリミング大型
シャンプー小型
シャンプー中型
シャンプー大型

投稿2018/01/23 10:53

編集2018/01/23 13:29
yambejp

総合スコア114583

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

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

mashumaro0628

2018/01/23 10:59

その部分はfetchなしで動きました。 しっかり配列$course_name_arrayに文字化けなしの値が入ってるのにも関わらず 下のforeachでは値が配列に入っていない挙動になっています。
yambejp

2018/01/23 11:13

その後ろは全体的な構造がおかしいです foreach ($course_name_array as $key1) でループ回してる中で $pdo = new PDO("mysql:host=localhost;dbname=doubutsu;charset=utf8",'root','admin'); するのはあたらしいセッションをループしているだけガンガン開いているんですよね? $pdoは先頭の方で宣言して、使いまわしたほうがよいでしょう またqueryを実行していますが、prepareで処理して下さい
退会済みユーザー

退会済みユーザー

2018/01/23 11:32

> $pdoは先頭の方で宣言して、使いまわしたほうがよいでしょう prepare もぜひ!w
mashumaro0628

2018/01/23 11:44

変えてみたんですがこれでいいですか? さっきとあまり状況は変わらないみたいで $course_name_arrayの値は依然としてちゃんと入ってるみたいです
yambejp

2018/01/23 11:55

質問者さんもしくは回答者の私が何か大きく勘違いしているかもしれません。 追記のところのロジックを再考してみて下さい
mashumaro0628

2018/01/23 12:07

この後値を表にして使うために両方の値が必要でm×nが必要なんですよね。 種類1 種類2  種類3 大中小 大中小 特大中小 みたいな感じで使います。
yambejp

2018/01/23 12:11

PHPのプログラムの問題というよりはmysqlのDB設計の問題のような気がします。 テーブルのサンプルを挙げてもらったほうがよいかもしれません (もしサンプルを上げる場合は元の質問に追記する形でつけてください)
mashumaro0628

2018/01/23 12:20

DBのテーブルですか、htmlのテーブルサンプルですか
yambejp

2018/01/23 12:34

create table Course(id int unique,course_name varchar(20)); insert into Course valuse(1,'aaa'),(2,'bbb')・・・; create table Size (id int unique,course_name varchar(20),Size int); insert into Course valuse(1,'aaa',100),(2,'aaa',150),(3,'bbb',200),・・・; のようなデータのかぶり方がわかるようなSQL文で書くとわかりやすいです
mashumaro0628

2018/01/23 12:55

わかりにくくて申し訳ないです
yambejp

2018/01/23 13:02

SizeテーブルにCourse_nameカラムが見当たりませんが
mashumaro0628

2018/01/23 13:03

すみません、諸事情で後からalter table addでカラム追加しました
yambejp

2018/01/23 13:08

なるほどalter table addをしたとして 「SELECT Size from Size」とありますがSizeというカラムがないですね Size_NumberかSize_nameのどちらかを参照するのでは?
mashumaro0628

2018/01/23 13:23

そうでした。 打ち間違えでsize_numberを参照してます。
mashumaro0628

2018/01/23 13:23

すみません、nameの方です。 あと遅くまで付き合っていただいてありがとうございます。
yambejp

2018/01/23 13:30

dbの結合と結果を表記しておきました 得られるものはこれで問題ないのでは?
mashumaro0628

2018/01/23 13:38

ありがとうございます! あとは横ではなく縦に結合させて同じ内容のセルを結合したいんですが流石に贅沢ですかね。
yambejp

2018/01/24 02:13

> 縦に結合させて同じ内容のセルを結合したい ちょっと状況がわかりません。 仕様をつめたら別の機会にまた質問をなげてみてください
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問