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

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

締切り済みの質問

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を使用しています。

どうかどなたかお時間御座いましたらご教授お願いします。

投稿日時 - 2009-07-05 08:11:49

QNo.5099512

困ってます

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

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

回答(2)

ANo.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データなどに加工して保存したほうがいい気もしますが、いかがでしょう。

投稿日時 - 2009-07-06 02:10:19

補足

一晩やってすぐに諦めるのもまずいことだと思いますが…

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

投稿日時 - 2009-07-08 09:36:20

お礼

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

投稿日時 - 2009-07-07 18:18:04

ANo.1

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

おそらく、nameとvalueを調整するだけでなんとかなりそうですが・・

投稿日時 - 2009-07-05 13:27:34

補足

ソースめちゃくちゃになってました。
申し訳ございません。

$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つないし
より多くを登録しようとするにはどうすればいいのかわかりません。

投稿日時 - 2009-07-05 20:43:51

あなたにオススメの質問