• ベストアンサー

同じ変数名で値がいくつかある場合の処理

http://oshiete1.goo.ne.jp/kotaeru.php3?q=731400の質問の続きなのですが、変数名もいくつデータが送られてくるかもわからない状態なのですが、同じ変数名で違う値が送られてくる場合(例えばチェックボックスとかセレクトボックスのマルチプル)はどのようにすればすべての値を拾えるでしょうか。 また、変数名をすべて日本語にしたいのですが、何か問題などあるでしょうか。 よろしくお願いいたします。

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

  • ベストアンサー
  • sisya
  • ベストアンサー率39% (97/244)
回答No.3

すいません、postは標準入力からでしたね。 前回の例の下の部分を変更してみてください。 postとgetは受け渡し方法が違うだけで 中の書式は同じですのでこれで問題無いはずです。 $foo = $_SERVER["QUERY_STRING"];     ↓ if($_ENV{'REQUEST_METHOD'} == "post"){ $foo = array_shift(file("php://input")); }else{ $foo = $_SERVER["QUERY_STRING"]; } 日本語に関してですが、 PHPは入力、内部処理、外部ですべて別の文字コードを 設定できるようになっているのですが、 自分で設定したサーバでPHPを使用なさるならともかく レンタルサーバなどを使用した場合、 内部処理に使用する言語設定は業者が設定してしまっているので、 こちらから変更する手段がなくはないですが、 普通に使った場合やはり文字化けしてしまいます。 後、元々1バイト文字(半角英数)をベースに使っている方が開発された言語ですので、 日本語などの2バイト文字を使用する事はあまり想定されていません。 (実際古いバージョンのPHPでは日本語を使用する為には日本語化パッチが必要でした) そういった意味でも使用しないほうが無難と言った所です。

umioyo
質問者

お礼

ご丁寧にありがとうございました。 php://inputがよくわからなかったですが、だいたいわかりました。 ありがとうございます。

すると、全ての回答が全文表示されます。

その他の回答 (2)

  • sisya
  • ベストアンサー率39% (97/244)
回答No.2

GuruGuru22さんの仰るとおり、 <select name="test[]" multiple> など、「name="test[]"」と言った感じで []をname属性に付加した場合、 $_POST['test'][0],$_POST['test'][1]と 言った感じで内容を参照できますが、 name要素を変更できない場合は $_SERVER["QUERY_STRING"] にフォームから送られた値が入っているので 自力で分解すれば取得する事もできるはずです。 例: $foo = $_SERVER["QUERY_STRING"]; $array = explode("&", $foo); foreach($array as $ber){ list($key, $value) = explode("=", $ber); #すでに存在する属性の値の時 if(isset($post[$key])){ array_push($post[$key], $value); } #初めて取得する属性の時 else{ $post[$key] = array($value); } } testと言う属性で3つ値を取得したい場合、 このルーチンで値を取得しますと $post['test']に配列で値が格納されます (一つしかない値も配列になってしまうのが難点ですね…) あと、日本語の変数名は止めておいたほうが無難です。 日本語の表現方法はJisやEUCなど複数あり、 PHPの内部で使用されているのがどちらなのかは サーバによって違い、JISで書いた日本語変数名が EUCのサーバにアップロードされた時など 文字化けして変数とみなされない場合がある為です。

umioyo
質問者

お礼

ご回答ありがとうございます。 ちょっと初心者質問で恐縮ですが、これを見るとPOSTで渡された場合もhoge1=hoge&hoge2=hoge という書式で渡されているようなのですが、$_SERVER["QUERY_STRING"]は、変数部分だけそのように受け取れるものなのでしょうか。 それと、これは別な質問として立てるべきだったと後悔しておりますが、日本語変数名に関してですが、すべてeucで記述するようにしてもダメでしょうか。

すると、全ての回答が全文表示されます。
回答No.1

配列で渡せばよいかと。 <select name="test[]" multiple>

umioyo
質問者

お礼

ご回答ありがとうございます。 しかし、変数名をこちらで決めることができないのです・・・ やはりこれは無理でしょうか。

すると、全ての回答が全文表示されます。

関連するQ&A