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

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

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

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

PHP

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

Q&A

解決済

1回答

1566閲覧

PHP 配列 DB

Z-TALBO

総合スコア525

MySQL

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

PHP

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

1グッド

0クリップ

投稿2016/07/08 09:22

編集2016/07/09 03:21

###はじめに
一つのフォームにある項目の内例えば1~3の項目はAのテーブルへ、
4~5の項目はBのテーブルへというようなことをやっております。

###コード
まずは、コードを書きます

HTML

1<!-- 実際のコードだと長いので、簡単に記述します --> 2<form action="" method="POST"> 3 <?php for ($i = 1; $i <= 8; $i++) : ?> 4 1.訪問先:<input type="text" name="plan[<?= $i; ?>][name]"> 5 2.訪問時間:<input type="text" name="plan[<?= $i; ?>][time]"> 6 <?php for ($j = 0; $j < 3; $j++) : ?> 7 3.訪問スタッフ<?= $j; ?>:<input type="text" name="plan[<?= $i; ?>][<?= $j; ?>][staff]"; 8 <?php endfor; ?> 9 <input type="hidden" name="plan[<?= $i; ?>][id]" value="2016<?= $i; ?>"> 10 <?php endfor; ?> 11 <input type="submit" name="submit"> 12</form>

とりあえず、上記のようにしました。
全体で8行、項目は全部で5列な感じです。
次に、データの取得と、DBへアクセスする感じをしました。

PHP

1$plans = $_POST['plan']; 2foreach($plans as $plan) { 3 $name = $plan['name']; 4 if ($name != "") { 5 $id = $plan['id']; 6 for ($i = 0; $i < 3; $i++) { 7 $staff = $plan[$i]['staff']; 8 if ($staff != "") { 9 $staff_insert = staff_insert($id, $staff); 10 } 11 } 12 $time = $plan['time']; 13 $plan_insert = plan_insert($id, $name, $time); 14 } 15 }

いろいろ、書き方が初心者丸出しですが、、、とりあえずこのように書きました。

PHP

1function staff_insert($id, $staff) { 2// DB接続 3 $sql = "INSERT INTO plan_staff (plan_id, staff) VALUES (:id, :staff)"; 4 $stmt = $dbh->prepare($sql); 5 $stmt->bindParam(':id', $id, PDO::PARAM_INT); 6 $stmt->bindParam(':staff', $staff, PDO::PARAM_STR); 7 $stmt->execute(); 8 return $staff_insert; 9} 10 11function plan_insert($id, $name, $time) { 12// 基本的には上のfunctionと同じです。入れるテーブルが違うだけ 13}

###質問
上記のようにしたとき、データ自体はDBに入るのですが、、、、
plan_insert側は一行ずつ入ればいいので問題はありませんが、、、
staff_insert側については、現在スタッフ3名入れたとしても最初の一名分しか登録ができません。
例えば、、、
id = 20161
staff = A
staff = B
staff = C
name = AAA
time = 12:30
というデータの場合、
plan_insert側は
id, name, timeが入ればいいのでOKですが、
staff_insert側は
20161 | A
20161 | B
20161 | C
というように入ってほしいのですが、
20161 | Aしか入ってきません。

登録とかよりechoしてみると、値は表示されてくるのですが、、、、

この辺り初歩的な部分かと思いますが、アドバイスお願いできますでしょうか?

###修正と追記
ご指摘ありがとうございます。コードに関してはインデントをしてみました。
var_dumpの結果を表示いたします。

array(8) { [1] => array(6) { ["name"] => string(3)"AAA" ["time"] => string(5)"12:30" [0] => array(1) { ["staff"] => string(1)"A" } [1] => array(1) { ["staff"] => string(1)"B" } [2] => array(1) { ["staff"] => string(1)"C" } ["id"] => string(5)"20161" }

一行分だけ書きましたが、このような形になっておりました。

###解決
今回はコード云々ではなくDB側の設計ミスでした。。。
plan_insert側では一行だけですので、plan_idを主キーにしていて問題は無かったのですが、、、当然な話ですね。
staff_insert側も同じようにplan_idを主キーにしていたのが原因でした。
別に主キー用のidを追加して、行ってみたら普通にできました。

KiyoshiMotoki👍を押しています

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

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

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

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

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

KiyoshiMotoki

2016/07/08 09:32

詳しい状況が知りたいので、 $plans = $_POST['plan']; の直後に var_dump($plans); の一行を追加して再実行し、出力された結果を質問欄に追記していただけますか?おそらく、POSTされたデータが意図する構造になっていないように思います。
shi_ue

2016/07/08 11:28

見づらいっす・・・インデントしません?
yoshis22

2016/07/08 15:16

if ($staff == "") { } else { ではなく if ($staff != "") { でいいと思います。 激しく見ずらいので回答しずらいです
Z-TALBO

2016/07/08 23:47

一応インデントいたしました。ご指摘ありがとうございます。 var_dumpの結果を表示いたしました。
onakanishi

2016/07/09 01:46

foreach以下の関数の{}が変ですが、意図としてはfor文でstaff_insertとplan_insertを3回行いたいって事でよろしいでしょうか?
Z-TALBO

2016/07/09 03:21

{}確かに変になってました。申し訳ありません。。。 コード云々ではなくDB側の問題でした。お騒がせいたしました。
guest

回答1

0

ベストアンサー

php

1$plans = $_POST['plan']; 2foreach($plans as $plan) { 3 $name = $plan['name']; 4 if ($name != "") { 5 $id = $plan['id']; 6 for ($i = 0; $i < 3; $i++) { 7 $staff = $plan[$i]['staff']; 8 if ($staff != "") { 9 $staff_insert = staff_insert($id, $staff); 10 } 11 } 12 $time = $plan['time']; 13 $plan_insert = plan_insert($id, $name, $time); 14 } 15} 16```正しいインデントに直してみました。 17処理的には正しいようです。あとはテーブルの構成ですが、`plan_id`がユニークだったりしませんか? 18そうすると、一つだけインサートされて後は失敗します。

投稿2016/07/09 02:07

shi_ue

総合スコア4437

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

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

Z-TALBO

2016/07/09 03:18

修正ありがとうございます。 テーブルの構成を見直しました。。。。 そもそも、簡単にしすぎて、plan_idとplan_staffというカラムでidにprimaryつけていたので、それが原因ですね。。。。 別でtable用のid, plan_id, plan_staffという形に直して、無事に解決しました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問