• ベストアンサー

複数選択の項目をPHP側でArrayで受け取る方法。

PHPで開発の際、HTMLのフォームで複数選択の項目を、PHP側でArrayで受け取る際、フォームの項目のnameを、例えば、<input type="checkbox" name="hoge[]"> のように [] を入れないとダメなんですか? 以前、Perlをやっていまして、ちょっとショッキングです。他にも方法はありますか?もしあるなら、一番標準てきな方法はどういった方法でしょう。 [] と書くと、その項目が単数か複数かという情報をHTML側に依存させてしまう印象を受けます。 (どちらにせよ、checkboxやradioと書いている時点で、単数複数の情報をもたせてしまってますが・・・)

  • PHP
  • 回答数3
  • ありがとう数3

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

  • ベストアンサー
  • wp_
  • ベストアンサー率54% (132/242)
回答No.2

>PHPで開発の際(snip) [] を入れないとダメなんですか? ダメ、と言うことはありません。 「name属性に[]をつけると配列で渡る」というのがPHPの仕様です。 >以前、Perlをやっていまして、(snip)一番標準てきな方法はどういった方法でしょう。 「PHPでは」name属性をname="hoge[]"とするのが一般的ですね。 phpで構成されている商用サイトのソースを覗いてみると良いかもしれません。 >[] と書くと、その項目が単数か複数かという情報をHTML側に依存させてしまう印象を受けます。 逆に考えると、MVCの精神からすれば送信パラメータはHTMLに依存させた方が都合が良いのですよ。 見た目が分かりやすくなるとか、資料を作りやすいとか。 ロジカルな問題で配列に渡した方が都合よい場合もあります。 <form action="送信先" method="POST"> <input type="radio" name="test[]" value="hoge" checked /> <input type="text" name="test[]" value="nyo-n" /> <textarea name="test[]"></textarea> <input type="submit" value="go" /> </form> これを受け取ると [test] => Array (  [0] => hoge  [1] => nyo-n  [2] => (テキストエリアで送った値) ) こうなります。

sweepea
質問者

お礼

ありがとうございます。 [] ←これは、snipというのですか? 記号はググれないので、調べるのが大変で・・・。 > phpで構成されている商用サイトのソースを覗いてみると良いかもしれません。 あ、本当ですね。このQ&Aサイトの関心カテゴリー(複数登録可)を見てみると、name="u_ct[]" になってました。 > MVCの精神からすれば・・・ ということは、CakeやSymphonyといったメジャーなフレームワークもそうなんでしょうか? 僕が驚いたのは、[]とすることで、PHPで書かれているということがバレるということよりも、開発言語によってHTMLへの出力が変わってしまうということにあります。 でも、みんな便利だというので、便利であれば何も問題ないのですが・・・。

その他の回答 (2)

  • wp_
  • ベストアンサー率54% (132/242)
回答No.3

>[] ←これは、snipというのですか? snipは(略)の意味ですよ^^; []は普通に「角括弧」と読みます。 http://jp.php.net/manual/ja/language.types.array.php >ということは、CakeやSymphonyといったメジャーなフレームワークもそうなんでしょうか? Cake,Symphonyのソースを見たことがないので確固としたことは分かりませんが、おそらくそうなのではないかと推測します。 ただ、フレームワークの場合は添え字を明示的に指定したりnameそのものをcontrollerに依存させている場合もあるので一概には言えません。 >僕が驚いたのは、(snip)開発言語によってHTMLへの出力が変わってしまうということにあります。 そのへんは「CGIとして動作」と「apacheのmoduleとして動作」の差異なので、同列として考えること自体がナンセンスだったりします。 HTMLはシステムに合わせて設計されるべきであり、システムが(サーバ・クライアントどちらでも)変われば構築されるべきHTMLも変化するのが当然なのです。 //最たる例が携帯などのモバイル系ですね。 まぁ作成者側から見れば使いまわせる方が助かるは助かるのですが^^; perl→phpの移行を何も知らないお偉いさんが勝手に決定して泣くのは末端ですからねぇ・・・

sweepea
質問者

お礼

> snipは(略)の意味ですよ^^; おぉ。お恥ずかしい。今、alcで調べました。 > ただ、フレームワークの場合は添え字を明示的に・・・ どこかで、 <input type="checkbox" name="data[hoge][fuga]"> みたいなのを見ました。うーん、便利かもですね。 > そのへんは「CGIとして動作」と「apacheのmoduleとして動作」の差異なので・・・ その通りですね。もう、[]に慣れちゃいました。(笑) ありがとうございました。

回答No.1

一番基本的なものは name="hoge[]"なんて方式だと思います。 単純にPHPの$_POSTなどで予め配列として取得されるためですね。 <input type="checkbox" name="a"> <input type="checkbox" name="a"> <input type="checkbox" name="a"> <input type="checkbox" name="a"> こんな風にした場合、PHPだと少し工夫をする必要があります。 perlと同じようにQUERY_STRINGやSTDINから値を取得して、foreachなどで配列を取得する必要があります。 単数か複数かは最後に書かれているようにHTML側ですでに決まる物だと思います。 name="hoge[]"で支障が無いのであればそちらの方が簡単でいいと思いますよ。

参考URL:
http://www.php.net/manual/ja/wrappers.php.php
sweepea
質問者

お礼

> 一番基本的なものは name="hoge[]"なんて方式だと思います。 なるほど了解しました。 > perlと同じようにQUERY_STRINGやSTDINから値を取得して、foreachなどで配列を取得する必要があります。 それは面倒ですね。わざわざそうする理由も浮かばないですね。 (Perlでは、CGI.pmを使用していたので、そのような処理をしていたのは遠い昔のことです。) > name="hoge[]"で支障が無いのであればそちらの方が簡単でいいと思いますよ。 確かに。これは、素直に「便利だなぁ」と思っておいたほうがいいのかもしれません。

関連するQ&A

  • チェックボックスで複数選択した値をSQLへ

    次のような入力フォームから、SQLのテーブルに登録します。 <?php function connect() { return new PDO("mysql:dbname=★★★;host=★★★","★★★","★★★", array( PDO::MYSQL_ATTR_INIT_COMMAND => "SET CHARACTER SET `utf8`")); } $pdo = connect(); if (@$_POST['submit']) { $hoge = $_POST['hoge']; if (!$error) { $pdo->query("INSERT INTO ★(hoge) VALUES('$hoge')"); header('Location: example.php'); exit(); } } ?> <form action="insert.php" method="post"> <input type="checkbox" name="hoge[]" value="りんご"/>りんご<br> <input type="checkbox" name="hoge[]" value="みかん" />みかん<br> <input type="checkbox" name="hoge[]" value="いちご" />いちご <input class="submit" type="submit" name="submit" value="登録"> </form> これで、例えば「りんご」と「みかん」をチェックして登録ボタンを押すと 受け取りのexample.phpにはArrayと表示され、SQLに反映されません。 よい方法があったら教えてください。

    • ベストアンサー
    • PHP
  • PHPのフォームの複数選択で。。。

    すいません当方PHPかなりの初心者で。。。。 入力→確認→送信のような流れのフォームを作成しているのですが。。。 メールフォームで複数選択が可能な場合フォームの受け取り側のPHPはどのように記載すればいいのでしょうか? □A □B □C □D □E □F ↑のようなフォームを作りチェックされたものを 【フォーム側】 <input type="checkbox" value="A" name="is[]">A <input type="checkbox" value="B" name="is[]">B <input type="checkbox" value="C" name="is[]">C <input type="checkbox" value="D" name="is[]">D <input type="checkbox" value="E" name="is[]">E <input type="checkbox" value="F" name="is[]">F 【確認画面のPHP】 // フォームの値を取得します。 if ($_SERVER["REQUEST_METHOD"] == "POST") { foreach($_POST as $k => $v){ // 「magic_quotes_gpc = On」のときはエスケープ解除 if (get_magic_quotes_gpc()) { $v = stripslashes($v); } $v = htmlspecialchars($v); $$k = $v; } } else { exit(); } //中略// // 確認画面表示箇所 <? $is_value = $_POST["is"]; foreach($is_value as $v){ echo $v ." <br> "; } ?> //中略// // 送信PHPへの受け渡し場所 <input type="hidden" name="service" value="<?= $is_value ?>"> ↑この部分の記載の仕方がわかりません。。。 確認画面で表示させたものを関数に格納して送信PHPの方に受け渡ししたいのですが。。。 どのようにどのあたりに記載したらいいのでしょうか? わかりにくい質問かもしれません。。。 なにとぞなにかお気づきの点がありましたらご教授ねがえると助かります。。。 よろしくお願いします。

    • 締切済み
    • PHP
  • チェックボックスが複数選択できない

    アンケートフォームを作成していますが、チェックボックスで複数項目を選択しても最後のひとつしか表示されずに困っています。 配列での処理にすれば良いという事なので自分なりにやってみたのですが、今度は「Array」と表示されてしまい、具体的にどうしたらいいのか分かりません。 ※html側 <input type="checkbox" name="cat[]" value="abc"> <input type="checkbox" name="cat[]" value="def"> ※php側 <FORM action="<? echo $script; ?>" method="POST"> <? echo $err_message; ?> <?php foreach($_POST as $key=>$var) { $key = strtr($key, $string_from, $string_to); if(get_magic_quotes_gpc()) $var = stripslashes($var); $var = htmlspecialchars($var); print("項目:".$key."選択したのは".$var); ?> <INPUT type="hidden" name="<?= $key ?>" value="<?= $var ?>"> <?php print("です。\n"); } ?> となっています。 また、選択内容をメール送信するようになっており、 foreach($_POST as $key=>$var) { $key = strtr($key, $string_from, $string_to); if(get_magic_quotes_gpc()) $var = stripslashes($var); if($var == "eweb_submit") ; else $rebody.="[".$key."] ".$var."\n"; です。 複数項目をまとめて処理しているようで、どうしたらいいのか分かりません。ちなみに、http://www.eweb-design.com/のフリーのメールフォームを使っています。

    • ベストアンサー
    • PHP
  • 複数選択の方法が分からないのです。

    お世話になります。 現在<input type="checkbox" name="jyusyo" value="豊岡市">豊岡市<br> <input type="checkbox" name="jyusyo" value="養父市">養父市<br> <input type="checkbox" name="jyusyo" value="朝来市">朝来市<br> <input type="checkbox" name="jyusyo" value="神戸市">神戸市<br> <input type="checkbox" name="jyusyo" value="姫路市">姫路市<br> のようにしている為、最期にチェックしたワードでしか検索できません。 これらを複数選択に対応させる為 <input type="checkbox" name="jyusyo[]" value="豊岡市">豊岡市<br> <input type="checkbox" name="jyusyo[]" value="養父市">養父市<br> <input type="checkbox" name="jyusyo[]" value="朝来市">朝来市<br> <input type="checkbox" name="jyusyo[]" value="神戸市">神戸市<br> <input type="checkbox" name="jyusyo[]" value="姫路市">姫路市<br> としてみたものの、この先が分かりません。 受け取る側のphpは現在このような状態であります。 $jyusyo=$_POST["jyusyo"]; $jyusyonum=array("豊岡市","養父市","朝来市","神戸市","姫路市"); $query = "select name,jyusyo,kakaku,gazou,link from ocdda where"; if($jyusyo != "") { $query = $query . " jyusyo like '%$jyusyo%' "; } $result = mysql_query($query); $num_rows=mysql_num_rows($result); if($num_rows== 0){ $message="該当データ無し"; } else $message=$num_rows ."件あります"; echo $message; while($row = mysql_fetch_array($result)){ データベースのカラムもjyusyoになっていますが変えるべきですか? どうか改変ポイント等の御教授お願い申し上げます。

    • ベストアンサー
    • PHP
  • チェックボックスで複数選択する方法教えて下さい

    いつもありがとうございます。 00.PHPというファイルにチェックボックスを配置して複数選択し 同じ00.phpにPOSTで情報送り、表示させたいのですが、 下記の記述では「Array」としか表示されません。 検索結果を最終的にはMYSQLにデータ登録をしたいのですが うまくいきません。御指導お願いします。 <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=EUC-JP"> <title>無題ドキュメント</title> </head> <body> <? echo $_POST["working_days"] ?> <form action="00.php" method="post">  <label>  <input type="checkbox" name="working_days[1]" value="1"> ド短期1日~OK <input type="checkbox" name="working_days[2]" value="2"> 週2、3日程度  <input type="checkbox" name="working_days[3]" value="3"> 月~金曜日 <input type="checkbox" name="working_days[4]" value="4"> 土日祝日のみ <input type="checkbox" name="working_days[5]" value="5"> 毎日オールフリー</label>      <input type="submit" name="Submit" value="登録"> </form> </body> </html>

    • ベストアンサー
    • PHP
  • チェックボックス 複数選択 MYSQL

    PHP習い始めたのですがどうしても分からない問題がありましたので 質問をさせて頂きました。 現在チェックボックスで複数選択された情報をMYSQLに反映させようとしているのですがどうしても複数選択された項目の内、一つしかMYSQLに反映されません。 こちらがスクリプトの一部になります。 <span class="checkbox"><input name="check[]" type="checkbox" value="aaa" />aaa</span> <span class="checkbox"><input name="check[]" type="checkbox" value="bbb" />bbb</span> <span class="checkbox"><input name="check[]" type="checkbox" value="ccc" />ccc</span><br /> //MYSQL $sql = "insert into table values('$check[]')"; 配列を使うとまでは調べて分かったのですが、そこからがどうしても 分かりません。どなたご存知になるかたがおりましたら 是非お伺い出来ませんでしょうか。宜しくお願い致します。

    • ベストアンサー
    • PHP
  • 配列で渡されたチェックボックスの値の処理

    POST元のページから <input type="checkbox" name="hoge[23]" value="1"> <input type="checkbox" name="hoge[31]" value="0"> <input type="checkbox" name="hoge[33]" value="1"> ・・・ のような形でデータが渡されます。 要素一つに付き、ONなのか、OFFなのか、表示されていないのかの判別が必要なため、このような形になっています。 受けるPHP側で、hogeの配列番号と一致したものがあればそれに対する処理を行う必要があります。 $buff=array(20,30,31); となっているとして、 $_POST["hoge"]の配列の値と$buff内の数字が一致したら~ (上記例だと31が一致) の書き方はどう書けばいいでしょうか。 よろしくお願いします。

    • ベストアンサー
    • PHP
  • phpでの複数選択チェックボックスのデータ取得に関して質問です。

    phpでの複数選択チェックボックスのデータ取得に関して質問です。 制作中のWEBサイトにお問い合わせページを作っています。 その項目のひとつに、件名を選択させるチェックボックスを4つ配置しているのですが、 複数選択した際に、一番最後の値しか取得できないという現象が起こっています。 お問い合わせページ⇒確認ページ⇒メールで送信 という動きなのですが、確認ページでは問題なく複数の値を取得して表示できています。 問題はメールで送信する部分なのですが、なぜかここでは一番最後の値しか取得・表示できていません。 以下にソースを載せます。 --------------------------------------------------------- ★HTML側 <p> <label><input type="checkbox" size="40" name="件名[]" value="資料請求">資料請求 </label> <label><input type="checkbox" size="40" name="件名[]" value="入試に関するご質問">入試に関するご質問 </label> <label><input type="checkbox" size="40" name="件名[]" value="本校へのご意見">本校へのご意見 </label> <label><input type="checkbox" size="40" name="件名[]" value="その他ご質問・ご相談">その他ご質問・ご相談</label> </p> ★php側(メール配信) $body="「".$sbj."」からの発信です\n\n"; $body.="-------------------------------------------------\n\n"; foreach($_POST as $key=>$var) { if(is_array($_POST[$key])==true) { foreach($_POST[$key] as $key=>$var) { $key = strtr($key, $string_from, $string_to); if(get_magic_quotes_gpc()) $var = stripslashes($var); if($var == "eweb_submit") ; else $body.="[".$key."] ".$var."\n"; } } else { $key = strtr($key, $string_from, $string_to); if(get_magic_quotes_gpc()) $var = stripslashes($var); if($var == "eweb_submit") ; else $body.="[".$key."] ".$var."\n"; } } ------------------------------------------------------- ネットから取得したフリーのメールフォームをアレンジしてソースを記述しています。 php初心者なので、説明がわかりづらい部分や、載せるソースが足りないかもしれませんので、 ご指摘ください。よろしくお願いします。

    • ベストアンサー
    • PHP
  • チェックボックス複数選択 mysql受け渡し

    PHPを習いはじめたのですが分からない所がありましたので質問をさせて頂きました。 チェックボックスを作り複数選択されたデータをMYSQLに受け渡したいのですがどうしてもうまくいきません。受け渡しが出来たかと思えばARRAYのみ表示されてしまい、重要な内容が一切表示されません。 こちらがスクリプトになります。 <tr> <td>(チェックボックス)<br />順番不問</td> <td> <span class="checkbox"><input name="check1[]" type="checkbox" value="aaa" />aaa</span> <span class="checkbox"><input name="check1[]" type="checkbox" value="bbb" />bbb</span> </tr> </td> //mysql $sql = "insert into table values('$check1')"; 多分この$sql分のなにかが間違ってると思うですがいくらやっても 出来ません、、 mysql の設定はカラムはcheck1となっており、text, 値はnullとなっております。 どのなたか複数チェックボックスで表示された項目をMYSQLのデータベースに移行できる方法をご存知の方お伺い出来ませんでしょうか。 宜しくお願い致します。

    • ベストアンサー
    • PHP
  • 【PHP】「\"」が面倒くさいのですがいい方法ありませんか?

    Perlを勉強したあと、現在PHPを勉強しています。PHPはまだ数日なのでかなり素人です。 例えば、 HTMLの <meta name="Description"… を代入したい場合、 $data = "<meta name=\"Description\"… とするわけですが、「\」があると見にくいので省略できる方法はありませんでしょうか? $data = "<meta name='Description'… という具合に「"」を「'」に置き換えて記述すればいいような気もするのですが、HTML及びCSSで何から何まで「'」に置き換えて問題ないのか不安です。 お詳しい方よろしくお願いいたします。

    • ベストアンサー
    • PHP

専門家に質問してみよう