• ベストアンサー

[]を付けずにcheckboxの値を複数受信

カテゴリをPHPとするか迷いましたが、 こちらに質問させていただきます。 <input type="checkbox" name="hiragana[]" value="a">あ <input type="checkbox" name="hiragana[]" value="i">い <input type="checkbox" name="hiragana[]" value="u">う とした場合、 $checked=$_POST['hiragana']; print_r($checked); などとして使えることはわかるのですが、 角括弧をつけず、 <input type="checkbox" name="hiragana" value="a">あ <input type="checkbox" name="hiragana" value="i">い <input type="checkbox" name="hiragana" value="u">う としたときに、同様に配列として取得する(すべてのチェックされた項目を取得する) 方法はあるのでしょうか? このようにした場合、 $checked=$_POST['hiragana']; print_r($checked); や print_r($_POST); すると、最後にチェックされた値しか入っていないようです。 (上書きされているようですが...) HTTPヘッダを見ると、 hiragana=a&hiragana=i&hiragana=u のように、すべて送信はされているのは確認できるのですが... 後者のような角括弧をつけていないタイプのcheckboxを使って ちゃんとチェックされた値をすべて受信して動作していると 思われるサイトを目にするので どうすればできるのかと思い質問させて頂きました。 よろしくお願いいたします。

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

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

>何かもっと標準的な方法 標準的な・・・という意味では、質問の内容は、データの競合です。 競合した場合は後方優先というのがhttpデータの受け渡しでは 標準的なやり方になるでしょう。 つまり、「競合するけどどうにかしたい」というのは姑息な手段なので 「競合しないようにする」のが賢明なやり方です。 []をつけるのは競合をなんとかさけるための苦肉の手段といえます また標準ではEGPCSルールがあり、GETよりPOSTが優先され同名で 値が渡った場合は$_REQUEST値にはPOSTの最後の値がはいります。 <form method="post" action="?hiragana=x&hiragana=y"> <input type="checkbox" name="hiragana" value="a">あ <input type="checkbox" name="hiragana" value="i">い <input type="checkbox" name="hiragana" value="u">う <input type="submit"> </form> <? if(!empty($_REQUEST["hiragana"])) print "hiragana=".$_REQUEST["hiragana"]; ?>

altrn
質問者

お礼

ありがとうございます。 丁寧な回答を頂き申し訳ないのですが、 解決致しました。 このお礼を書きながら もう一度検索しなおしてみたところ、 PHP以外の言語を使った場合、 []を必要としないですむ場合もあるようでした。 Javaや、 http://code.nanigac.com/source/view/211 Python http://humming.via-kitchen.com/2007/06/27/comparison-between-django-and-php-of-request-post/ などでは、[]がなくても配列で受信できるようでした。 質問文にPHPといってしまい、決めてかかったのが いけなかったのだと思います。 しかし、おかげさまでPHPでは[]なしでは不可能らしい(GETの場合は先の正規表現等も可能ではあると思いますが...)ことがわかりました、ありがとうございます。

その他の回答 (1)

  • koke29
  • ベストアンサー率58% (114/196)
回答No.1

こんにちはー 私もどうしたら出来るのかなーと思って試してみました 1.GETで送信したデータを $_SERVER["QUERY_STRING"] で取る 2.データにsubmitも含まれていたのでstr_replace で抜く 3.&もstr_replaceで抜く 4.チェックボックスのnameが含まれていたら、"name="でexplodeする これで一応、同じ名前で[]つけなくてもデータの配列作れました 絶対もっと効率いい方法あるんでしょうねー 私にはこれが限界でした あと、javascriptで送信前にチェックされたデータを配列にしてから 送信しちゃうとかも出来そうな気がしますよね 私はjavascriptよくわからないのでPHPだけで処理してみました やれば出来るもんですねぇ

altrn
質問者

お礼

回答ありがとうございます。 確かに正規表現等つかえばできそうだとは思うのですが、 何かもっと標準的な方法があるのではないかと思っております。