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

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

締切り済みの質問

PHPのチェックボックスでforeachの警告出る

UbuntuにXPMPPを入れてPHPの勉強してます。複数選択可能なチェックボックスの値を取得しようとしているのですが送信して受信側のページを開くと「Warning: Invalid argument supplied for foreach()」が出ます。正しく複数選択のチェックボックスの値を送受信する方法を教えてください。なお、入力ミスかと思い、http://www.7key.jp/hp/php/memo5.htmlのコピペをしてみましたが警告が出続けます。以下にそのページのソースを示します。

送信側のページのソースは次のようになっています。
<?php echo '<?xml version="1.0" encoding="UTF-8"?>
'; ?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="ja" lang="ja">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<title>送信</title>
</head>
<body>
<form action="response.php" method="post">
<input type="checkbox" name="sample" value="1" checked="checked">
<input type="checkbox" name="sample" value="2">
<input type="checkbox" name="sample" value="3">
<input type="submit" value="sending" />
</form>
</body>
</html>

受信側のソースは次のようになっています。
<?php echo '<?xml version="1.0" encoding="UTF-8"?>
'; ?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="ja" lang="ja">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<title>受信</title>
</head>
<body>
<?php
foreach($_POST['sample'] as $key => $val){
echo "$key : $val \n";
}
?>
</body>
</html>

投稿日時 - 2011-02-20 16:48:53

QNo.6537446

困ってます

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

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

回答(2)

ANo.2

#1さんの回答にもありますがsample[]というnameをつければ解決します。
(そうしたくないなら別名をつけてください)
データがない場合も以下のようにすれば姑息ですが簡単な解決します

<?php
foreach((array) $_REQUEST['sample'] as $key => $val){
echo "$key : $val \n";
}
?>

もちろんデータを検証する作業はやって置く方が精度はたかくなります。

投稿日時 - 2011-02-21 09:28:15

ANo.1

POSTされてきた内容を確認すれば一目瞭然ですが、$_POST["sample"]は配列ではありません。
同じname属性を付けている場合、後にPOSTした内容で上書きされます。
たとえば、value:1とvalue:3にチェックを入れていた場合、
$_POST["sample"] = 1;
$_POST["sample"] = 3;
という感じの処理をしているってことです。
これだと見てのとおり、最終的には「$_POST["sample"] = 3」ということになり、配列ではないのでforeachは動きません。

じゃ、どうするか。
<input type="checkbox" name="sample[]" value="1" checked="checked">
<input type="checkbox" name="sample[]" value="2">
<input type="checkbox" name="sample[]" value="3">
とすると、$_POST["sample"]を配列で取得することができます。

もちろん、なにもチェックされていないとエラーが出ますので、$_POST["sample"]の存在を確認する必要はあります。

投稿日時 - 2011-02-20 17:24:59

あなたにオススメの質問