みんなの「教えて(疑問・質問)」にみんなで「答える」Q&Aコミュニティ

こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

PHP whileでループした複数フォームのPOSTを取得したい

お世話になります。PHP+MYSQLで、動物管理データベースを作成しています。動物入力を簡略化したいため、まず、動物種と匹数を入力した後、匹数に合わせた詳細フォームを表示させるプログラムを組みたいと考えています。

自力で、「動物種と匹数のフォーム表示」→「匹数に合わせた詳細フォーム表示」までは作ることができましたが、最後のフォームデータのみ挿入されます。どうか助けてください。

動物種別と匹数の指定された後、

<?
while($a <= $_POST['匹数'])
{
?>
<tr>
<form method="post" action="admin6.php">
<td><font size="2">自動入力</font></td>
<td><input size="15" type="text" name="個体"></td>
<td><input size="8" type="text" name="動物種別" value=""></td>
<td bgcolor="#ffffff"><SELECT NAME="性別">
<OPTION>オス
<OPTION>メス
</SELECT></td>
<td><input size="8" type="text" name="入荷日" value=""></td>
<td><input size="8" type="text" name="処分日" value=""></td>
<td><input size="8" type="text" name="飼育室" value=""></td>
</tr>
<?
$a++;
}
 ?>
   <br>
   <input type="submit" name="q" value="新規追加">

上記でその匹数分の入力フォームをWhile分で作成し、

if($_POST["q"] == '新規追加')
{
$insertQuery = "INSERT INTO Animal_manage VALUES(NULL,'";
$insertQuery .= addslashes($_POST["個体"]). "','";
$insertQuery .= $_POST["動物種別"]. "','";
$insertQuery .= $_POST["性別"]. "','";
$insertQuery .= $_POST["入荷日"]. "','";
$insertQuery .= $_POST["処分日"]. "','";
$insertQuery .= $_POST["飼育室"]. "')";
mysql_query($insertQuery, $myLink);

mysql_close($myLink);
header("Location: ".$_SERVER["PHP_SELF"]);
exit;
}

と、POSTでMYSQLへ格納しようとしました。
作られた詳細フォーム分のレコードをMYSQLへ挿入するためにはどうしたらよいでしょうか?初心者ということもあり、検討がついていません。ご迷惑かけますがよろしくお願いします。

投稿日時 - 2007-11-11 02:38:01

QNo.3507628

すぐに回答ほしいです

質問者が選んだベストアンサー

PHPを部分的に書いてらっしゃるので
それ以外はわかっていらっしゃるものだと思っていましたが
a.php→b.php(POST受取)
↑例えばこの場合にb.phpからc.phpへPOSTの内容を渡したい場合はb.phpでPOSTデータを受け取った時に変数格納しFORM内にhiddenで埋め込んでc.phpに渡さないとPOSTデータとして受け取る事ができません。

ですのでb.phpを直せばこれでいけると思いますよ。

投稿日時 - 2007-11-12 11:09:13

お礼

ありがとうございます。できました。知識不足で申し訳ありませんでした。
為になる知識を色々と教えていただいて、勉強になりました。

投稿日時 - 2007-11-13 22:20:53

このQ&Aは役に立ちましたか?

2人が「このQ&Aが役に立った」と投票しています

回答(4)

ANo.4

wp_

<input type='text' name='入荷日[]' />
<input type='text' name='入荷日[]' />
<input type='text' name='入荷日[]' />

といったように[]をつけてやるとPOSTされた値が配列として渡されます。
よく見るサンプルではcheckboxで見慣れた形かもしれません。
このパターンですと、

while($a <= $_POST['匹数'])
{
(snip)
echo "<input size='8' type='text' name='入荷日[]' /><br />\n";
(snip)
}
echo "<input type='submite' value='新規追加' />";

とすることで$_POST["入荷日"]が配列で渡ってきます。
受け取り側で
print_r($_POST);
として中身を確認し、insert文を構築するとよろしいでしょう。

おそらくソースの見易さのために修正してると思うのでお節介だったら申し訳ないですが、
nameに日本語を使うのは好ましくないす。
実際のソースではasciiにしましょう。

投稿日時 - 2007-11-12 11:14:34

お礼

丁寧な解説ありがとうございます。

配列として格納するという案は私には斬新に思えますが、なるほど試してみます。日本語のご指摘までいただいてありがとうございます。

投稿日時 - 2007-11-13 22:14:58

ANo.2

みたとこ大丈夫そうなんですがね。

mysql_query($insertQuery, $myLink);
↑この前に$insertQueryの内容をプリントしてきちんとしたSQLが書かれているか確認してみてはいかがですか?

投稿日時 - 2007-11-11 16:49:18

お礼

たびたび申し訳ありません。大変参考になります。

SQLをプリントしてみたのですが、何も表示されませんでした。
私なりに色々と試してみたのですが、$_POST["p"]に格納されてる$_POST["匹数"]は$_POST["q"]が発行された後に消えてしまうことが原因なのではないかと思っています。

その証拠に、$_POST["匹数"]の代わりに2と数字を指定してfor文を実行みると、完全ではありませんが、値の記入されたSQLが確認できます。

POSTを多重にすることは、あまり一般的ではないのでしょうか・・・

投稿日時 - 2007-11-11 19:39:43

ANo.1

while文でフォームタグを匹数分出力しているのとインプットタグのnameの値が同じなのが最後のデータしか入力されない原因です。
フォームタグをwhile文の前においてnameに連番を打ちPOSTされたデータを連番分SQLを発行すればいけると思います。

投稿日時 - 2007-11-11 11:51:44

お礼

返答ありがとうございます。ご指摘の通り、同じname値で格納されれば、上書きの様になってしまうのですね。気がつきませんでした。プログラムを改編し、

<td><input size="15" type="text" name="個体<?print $suji?>"></td>

の様にname値に連番を付け、for分で以下のように連番分クエリを作るようにしましたが、うまくデータベースへの登録ができていません。

for($a=1;$a<=$_POST["匹数"];$a++)
{
$insertQuery = "INSERT INTO Animal_manage VALUES(NULL,'";
$insertQuery .= addslashes($_POST["固体".$a]). "','";
$insertQuery .= $_POST["動物種別".$a]. "','";
$insertQuery .= $_POST["性別".$a]. "','";
$insertQuery .= $_POST["入荷日".$a]. "','";
$insertQuery .= $_POST["処分日".$a]. "','";
$insertQuery .= $_POST["飼育室".$a]. "','";
$insertQuery .= $_POST["試験".$a]. "')";
mysql_query($insertQuery, $myLink);
}

この状態では、複数のクエリが生成されていないのでしょうか?再度ご教授いただければと思います。

投稿日時 - 2007-11-11 16:12:29

あなたにオススメの質問