• 締切済み

php繰り返し構文とforeache

PHP5.26 MySQL5 Apache2.2 <html> <head>登録</head> <body> <form action="" method="post"> <input type="submit" value="登録" /> <?php $context=<<<EOF <input type="text" name="name" /><br /> <input type="checkbox" value="" name="国語" />国語<br /> <input type="checkbox" value="" name="算数" />算数<br /> <input type="checkbox" value="" name="理科" />理科<br /> <input type="checkbox" value="" name="社会" />社会<br /> <input type="checkbox" value="" name="道徳" />道徳<br /> EOF; for($i=0;$i<4;$i++) {print $context;} ?> </body> </html> 上記コードを書くと5つループされます。 これをDBに登録する際、insert文を5回繰り返す、科目が複数チェックされていると1つのinsert文のように登録することが出来ません。1つの場合はforeachを使って配列を返す構文まではわかりました。 解決策としてはforeachを使って返された配列をserialize関数を使ってオブジェクト化し、そのまま登録することを考えました。出来ればserializeを使わずに登録したいと思います。 PDOを使用しています。 どうかどなたかお時間御座いましたらご教授お願いします。

みんなの回答

回答No.2

<?php if($_SERVER['REQUEST_METHOD'] == 'POST'){ if(isset($_POST['group'])){ if(is_array($_POST['group'])){ foreach($_POST['group'] as $p_data){ echo '<pre>'; print_r($p_data); echo '</pre>'; } } } } ?> <form action="" method="POST"> <?php for($i=0;$i<5;$i++) { ?> <input type="text" name="group[<?php echo $i?>][name]" /><br /> <input type="checkbox" name="group[<?php echo $i?>][check][]" value="国語" />国語 <input type="checkbox" name="group[<?php echo $i?>][check][]" value="算数" />算数 <input type="checkbox" name="group[<?php echo $i?>][check][]" value="理科" />理科 <input type="checkbox" name="group[<?php echo $i?>][check][]" value="社会" />社会 <input type="checkbox" name="group[<?php echo $i?>][check][]" value="道徳" />道徳 <hr /> <? } ?> <input type="submit" value="登録" /> </form> これで、それぞれのPOSTデータが含まれることを確認してください。(print_rの部分) name値を配列表記すれば、$_POSTで取得する値も配列になります。 serialize関数で、配列を文字列にする件に関しては、PHP以外の言語でデータベースから値取得するときに面倒が起きますので、CSVデータなどに加工して保存したほうがいい気もしますが、いかがでしょう。

atlantic32
質問者

お礼

ありがとうございます!name値を配列表記にすればいいんですね。 こんなこと考えもしなかったです…。

atlantic32
質問者

補足

一晩やってすぐに諦めるのもまずいことだと思いますが… いくら考えても配列要素を一個づつ取り出すのが自分には考えつきませんでした。いっそのこと5つを登録するのではなく、1つづつ登録するようなものに変えようと思います。自分の実力に見合わない構文を使おうとするのは役不足だと思いました。

  • yambejp
  • ベストアンサー率51% (3827/7415)
回答No.1

何をやりたいかよくわかりません・・・ この構文だと5x5=25の表示をしたいということ? nameがかぶるしvalueを設定していないしどうしたいのでしょうか? おそらく、nameとvalueを調整するだけでなんとかなりそうですが・・

atlantic32
質問者

補足

ソースめちゃくちゃになってました。 申し訳ございません。 $context=<<<EOF <input type="text" name="name" /><br /> <input type="checkbox" value="国語[]" />国語 <input type="checkbox" value="算数[]" />算数 <input type="checkbox" value="理科[]" />理科 <input type="checkbox" value="社会[]" />社会 <input type="checkbox" value="道徳[]" />道徳 <hr /> EOF; for($i=0;$i<5;$i++) {print $context;} -------------------------------------------------------- 名前と好きな教科を登録する画面を作りたいと思います。 チェックボックスを配列で受け取る方法は上記コードの 登録欄が1つの場合(名前と科目1つづつ)は登録可能な ところまでこぎつけたのですが、これを一気に5つないし より多くを登録しようとするにはどうすればいいのかわかりません。

関連するQ&A