アプリ版:「スタンプのみでお礼する」機能のリリースについて

PHPで配列をPOSTデータで送った場合の取り出し方を教えてください。

知恵袋でも質問したのですか、使い方をよくわかっておらず、補足が追加出来なくって、回答者の方に返事が出来なくなってしまいました。申し訳ありません。
プログラム初心者です。始めたばかりで、自分で考えて知っている範囲で組もうとしているのですが、

例えば

<form method="POST" action="○○○">
<input type="checkbox" name="color[]" value="赤" />赤<br />
<input type="checkbox" name="color[]" value="青" />青<br />
<input type="checkbox" name="color[]" value="緑" />緑<br />
<input type="submit" value="送信" />

とこのように書いてすべてにチェックを付けて送った配列のデータはどのように取り出したら良いのでしょうか?
foreachで下記のように、

$x = $_POST['color'];
foreach( $x as $value ){
echo "色 = ". $value."<br />\n";
}
exit;

$_POST['color']の配列を取り出そうすると

Invalid argument supplied for foreach()

と表示されてしまいます。
var_dumpで配列を表示させると、

string(3) "Array"

と表示され確かに配列として届いていると思います。
確かにチェックはいれて送信もしています。
print "{$_POST['color']}"で表示してみると、"A"と"r"と"r"でした。

チェックボックスを10個に増やして、それぞれ$_POST['color'][0]~[9]まで
表示させてみたところ、はじめの5個はArrayも文字がいつつ表示され、残りは空白でした。

知恵袋のほうで、取り出し方が間違っているとの指摘をいただきましたが、どのように取り出したら良いのでしょうか。
どなたかお手数ですが、教えていただけないでしょうか。
よろしくお願いします。

A 回答 (4件)

ご質問のコードは、合ってる気がします。



その記述のほかに、何か別のロジックかましてないですか?
例えばですが、magic_quotes_gpcの対策コードですとか、文字コードを一括で変換するコードですとかそういうものです。

$_POST['color']に含まれるべき配列を、変な変換処理を行っているために、文字列「Array」に変換されてしまっているようです。

PHPは、
<?php
$arr = array('a', 'b', 'c');

//上記の配列を

echo $arr;

//とすると、出力結果は、「Array」と文字列が表示されます。


?>

一度、ご質問のコード以外の場所を確認してみてください。
    • good
    • 0
この回答へのお礼

回答ありがとうございます!
おっしゃるとおりでした。
switch構文で動かしていたのですが、プログラムの冒頭にある下記の記述が邪魔をしていました。
授業で「xss対策として下記の記述は必ず入れてください。」と言われて、
データに影響を及ぼすとは考えず、気にしていませんでした。
(ということは別途xss対策をしないといけないということでしょうか。。。)

foreach ($_POST as $key => $value){
//前後の空白削除
$value = trim($value);
//XSS対策
$_POST[$key] = htmlspecialchars($value);
}

お礼日時:2010/08/05 07:46

手元の環境ではすべて未チェック以外はエラーにはならず、



色 = 赤
色 = 青
色 = 緑

と表示されます。

> 1行目が$_POST['color'][0]~[2]を表示させたもの、
> A; r; r;

 POSTされてるvalue値が"赤","青","緑"なのだから、$_POST['color'][0]~[2]で取り出される値はこのいずれかの値のはずですが、そうなっていないのは?
    • good
    • 0
この回答へのお礼

回答ありがとうございます!
純粋に質問の部分だけのプログラムを記述したら確かに動きました!

switch構文で動かしていたのですが、プログラムの冒頭にある下記の記述が邪魔をしていました。

foreach ($_POST as $key => $value){
//前後の空白削除
$value = trim($value);
//XSS対策
$_POST[$key] = htmlspecialchars($value);
}

お礼日時:2010/08/05 07:50

>Invalid argument supplied for foreach()



対策は

foreach((array) $x as $value ) ・・・

とすること。これでデータを渡さなかった時のエラー回避ができます。
    • good
    • 0

> Invalid argument supplied for foreach()



 これが出るのってチェックボックスが3つとも非選択だった時じゃないでしょうか。
 チェックボックスが未選択の場合は配列に要素が追加されません。選択されているチェックボックスの項目のみ前詰めで追加されるので、3つとも未選択の場合は配列の要素が無いので、これをforeach文で取り出そうとしてエラーになります。
 どれか選択されている場合はきちんと取り出されます。(意図した順番かどうかはわかりませんが)

この回答への補足

回答ありがとうございます。
質問欄にも書きましたが、確かにチェックを入れています。
下にチェックを入れた場合と入れなかった場合の違いです。エラーの内容は一緒ですね。
1行目が$_POST['color'][0]~[2]を表示させたもの、
2行目がvar_dump($_POST['color'])で表示させてもの、
3行目がforeach( $_POST['color'] as $value ){echo "色 = ". $value."<br />\n";}で表示されるエラーです。

; ; ;
NULL
Warning: Invalid argument supplied for foreach()

A; r; r;
string(5) "Array"
Warning: Invalid argument supplied for foreach()

補足日時:2010/08/03 12:37
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!