ラジオボタンのnameの値を受け渡したい - PHPプロ!Q&A掲示板

2617

  • 0P

ラジオボタンのnameの値を受け渡したい

質問日時 / 2010年3月11日 10:10    回答数 / 21件

Questioner:  mugitaro  このエントリーをはてなブックマークに追加 

キーワード / ラジオボタン    $_POST   

いつもこちらで勉強させていただいております。
今回は色々と試行錯誤を重ねていましたがついに解決に至りませんでした。
是非、力を貸してください。

APIでデータを取得するコードを書きまして以下の処理で上手くいっています。
しかし【test.php】で「$radio = $_POST["foods"];」を実行していますが直接name="foods"の
値を手入力しているから上手くいっているのですが本来であればnameの値が自動的に入って欲しいところです。
「$radio = $_POST[name];」等とやってみましたがどれも失敗でした。
どうやればnameの値を受け渡せるのでしょうか。
よろしくお願いします。


food.php
  1. <form id="form1" name="form1" method="post" action="test.php">
  2.   <p>
  3.     <label>
  4.       <input type="radio" name="foods" value="1101" id="foodsGroup_0" />
  5.       ドイツ </label>
  6.     <br />
  7.     <label>
  8.       <input type="radio" name="foods" value="1102" id="foodsGroup_1" />
  9.       アメリカ</label>
  10.     <br />
  11.     <label>
  12.       <input type="radio" name="foods" value="1103" id="foodsGroup_2" />
  13.       フランス</label>
  14.     <br />
  15.     <label>
  16.       <input type="radio" name="foods" value="1104" id="foodsGroup_3" />
  17.       イタリア</label>
  18.     <br />
  19.           <input type="radio" name="foods" value="1199" id="foodsGroup_5" />
  20.       その他</label>
  21.   </p>
  22.   
  23.   <p>
  24.     <label for="kakutei"></label>
  25.     <input type="submit" name="bottun1" id="kakutei" value="確定" />
  26.     <label for="reset"></label>
  27.     <input type="reset" name="reset" id="reset" value="リセット" />
  28.  </p>

test.php
  1. $radio = $_POST["foods"];  //foods.phpから受け渡し

この質問への意見の募集は締め切られ、ポイントは既に配分されました。
意見を投稿することはできますが、ポイントを受け取ることはできません。



ツリー一覧

┣A01orpheus回答します。質問の意味が理解できていないかもしれま
┃┗A01-1mugitaroご返答有難うございます。 >■food.php >1.<form
┃ ┗A01-1-1shimix>food.phpと同列のプログラムが数個ありまして前の処
┣A02kaitau私も質問の内容がいまいち理解できないけど、 (まさ
┃┗A02-1mugitaro有難うございます。 >$keys=array_keys($_POST);
┃ ┗A02-1-1mugitaro少し分かりかけてきました。 コードの途中に >>CO
┃  ┗A02-1-1-1kaitauんー。 必要な情報が必ず、「foods」か「life」の
┃   ┗A02-1-1-1-1mugitaroコードを提示していただき有難うございます。 >規
┃    ┣A02-1-1-1-1-1mugitaroすみませんでした。あわてて間違っていました。 抜き
┃    ┃┣A02-1-1-1-1-1-1shimix>foodsだけを取り出すことが出来ませんでした。 前
┃    ┃┃┗A02-1-1-1-1-1-1-1mugitaro有難うございます。 再度見直しました。少し前進し
┃    ┃┗A02-1-1-1-1-1-2kaitauこの意見は投稿者によって削除されました。
┃    ┣A02-1-1-1-1-2orpheus質問に対しての回答ではないのですが失礼します。
┃    ┃┗A02-1-1-1-1-2-1mugitaro有難うございます。 本当に感動しました! 大変見
┃    ┗A02-1-1-1-1-3kaitauちょっと待って、その提示コードだと$valueにarray_sp
┃     ┗A02-1-1-1-1-3-1mugitaro有難うございます。 それで、皆様にアドバイスして
┃      ┗A02-1-1-1-1-3-1-1shimix>任意の変数にfoodsが入ればよいのですがまだ上手くい
┃       ┗A02-1-1-1-1-3-1-1-1mugitaroshimixさん ソースまでご提示いただき有難うございま
┃        ┗A02-1-1-1-1-3-1-1-1-1shimix>ところが、今度はこの文字列例えば"foods"でデータが
┃         ┗A02-1-1-1-1-3-1-1-1-1-1mugitaroなりました! 完璧です。涙が出る位うれしいです。
┗A03magicflute2foods.phpが食に関するページだと言う事で、飛んで来
 ┗A03-1mugitaromagicflute2さん 違った観点からのアドバイス本当
  ┗A03-1-1magicflute2この意見は投稿者によって削除されました。

回答一覧

並び替え:

A01
answererorpheus [3月11日 11:53]

回答します。質問の意味が理解できていないかもしれませんが...

>しかし【test.php】で「$radio = $_POST["foods"];」を実行していますが直接name="foods"の
>値を手入力しているから上手くいっているのですが本来であればnameの値が自動的に入って欲しいところです。

「手入力」、「自動的に入る」とはどういう意味なのでしょうか?
選択したラジオボタンの値が取得したいという意味ですかね?

例)$radio = $_POST["foods"];
・ドイツの時 → $radioには 1101 が入る
・アメリカの時 → $radioには 1102 が入る

この結果で良いのであればお書きのソースで正常に動作しましたが。

なお余談ですが、気になったので。

■food.php
1.<form>タグを閉じていないようです
2.<input type="submit" name="buttun1 ~"> → buttun でなく button が正しいスペルです

■test.php
1.ファイルの先頭は<?php>で開始していますか?

この意見に回答する

ツリーへ TOPへ

A01-1
replyermugitaro [3月11日 13:42]

ご返答有難うございます。

>■food.php
>1.<form>タグを閉じていないようです
>2.<input type="submit" name="buttun1 ~"> → buttun でなく button が正しいスペルです

>■test.php
>1.ファイルの先頭は<?php>で開始していますか? 

スペルのご指摘有難うございます。
ほかのソースはOKと思います。

そこで質問したいところですが

>「手入力」、「自動的に入る」とはどういう意味なのでしょうか?
>選択したラジオボタンの値が取得したいという意味ですかね?

food.phpと同列のプログラムが数個ありまして前の処理でたまたま選択したのがfoodです。例えば前処理でlifeを選択したとすると$radio = $_POST["****"];  の****にlifeと入って欲しいのですがtest.phpは
$radio = $_POST["foods"];  と固定しているのでfoodsの value="1101"で次の処理を実行することになります。
うーん、上手く伝えるのが難しいです(汗)

この意見に回答する

ツリーへ TOPへ

A01-1-1
replyershimix [3月11日 15:17]

>food.phpと同列のプログラムが数個ありまして前の処理でたまたま選択したのがfoodです。
>例えば前処理でlifeを選択したとすると$radio = $_POST["****"];  の****にlifeと入って
>欲しいのですがtest.phpは$radio = $_POST["foods"];  と固定しているのでfoodsの 
>value="1101"で次の処理を実行することになります。

基本的には全部スクリプトを分けるべきでしょうね。処理する内容も返すべきHTMLも違ってくるわけですから。

逆に「同じスクリプトで処理する」ならば、

・前処理でfood or lifeのどちらを選択したのかをhiddenなどで持ち回る
array_key_exists('food', $_POST)などでチェックする

それによって処理分けすることになります。

この意見に回答する

ツリーへ TOPへ

A02
answererkaitau [3月11日 13:37] (最終編集:3月11日 13:38)

私も質問の内容がいまいち理解できないけど、
(まさに上で引用されている二行がキーだと思うけどわからない)
APIという単語から察するに、POSTで渡ってくる
パラメータが持ちうるキーが不特定なので、その辺も
コードで把握出来るようにしたい、ということですかね?

だとしたら、
http://www.php.net/manual/ja/faq.using.php#faq.using.anyform
みたいな内容が参考になるかと。
$_POST自体が配列データなので、たとえば
$keys=array_keys($_POST);
パラメータのキーのみが値として格納された配列$keyを
取得できます。

この意見に回答する

ツリーへ TOPへ

A02-1
replyermugitaro [3月11日 14:08]

有難うございます。

>$keys=array_keys($_POST);

今、この辺を勉強しています。

この意見に回答する

ツリーへ TOPへ

A02-1-1
replyermugitaro [3月11日 16:05]

少し分かりかけてきました。
コードの途中に

  1. print_r($_POST);

を挿入したら

Array ( [foods] => 0101 [botton1] => 確定 ) と表示されました。

再度、お尋ねですが
この取得した[foods]を以下のコードに挿入するには具体的にどうすればよいのでしょうか。

  1. $radio = $_POST["foods"];

この意見に回答する

ツリーへ TOPへ

A02-1-1-1
replyerkaitau [3月12日 00:02]

んー。

必要な情報が必ず、「foods」か「life」のどっちになるとわかっている、
という状態なら、
  1. $radio = '';
  2. if( isset($_POST['foods']) ) {
  3.   $radio = $_POST['foods'];
  4. } else if( isset($_POST['life']) ) {
  5.   $radio = $_POST['life'];
  6. }

とやれば出来ないことはないですが、ちょっと不恰好になります。
それよりは、ラジオボタンに割り振るnameにもうちょっと
規則性を持たせる事を検討して、判定した方が良いかもしれません。

それと、わたってくるフォームの情報の種類が異なるものを一つの
ロジックの中で処理する、というのはやっぱり一般的に言って
あんまり行儀の良いwebアプリケーションとは言えません。

やりたいことをもう一度整理して、別の手段を考えたほうが
後々苦しまずにすむと思いますが。

この意見に回答する

ツリーへ TOPへ

A02-1-1-1-1
replyermugitaro [3月12日 10:18]

コードを提示していただき有難うございます。

>規則性を持たせる事を検討して、判定した方が良いかもしれません。

そうですね、考えて見ます。

>あんまり行儀の良いwebアプリケーションとは言えません。

>やりたいことをもう一度整理して、別の手段を考えたほうが
>後々苦しまずにすむと思いますが。 

これも仰せのとおりだと感じています。

これを承知で今回だけは切り抜けるためにもう一度ご教示願えませんでしょうか。

  1. $radio=array($_POST);
  2. foreach($radio as $key => $value){
  3.   $a=array_slice($value,0,1);
  4.   print_r($a);

配列変数のところを勉強しましてこのようなコードを書きましたら次のように出力されています。

Array ( [foods] => 0102 ) 

PHPが持つ文字列操作を様々試しましたが0102だけを取り出すことが出来ませんでした。
感覚的には昔のBASIC言語などのstr$関数で抜き取るだけのことと思っていますが
どうやっても出来ません。
よろしくお願いします。

この意見に回答する

ツリーへ TOPへ

A02-1-1-1-1-1
replyermugitaro [3月12日 10:40]

すみませんでした。あわてて間違っていました。
抜き取りたいのはfoodsでした。

PHPが持つ文字列操作を様々試しましたがfoodsだけを取り出すことが出来ませんでした。
感覚的には昔のBASIC言語などのstr$関数で抜き取るだけのことと思っていますが
どうやっても出来ません。
よろしくお願いします。

この意見に回答する

ツリーへ TOPへ

A02-1-1-1-1-1-1
replyershimix [3月12日 11:18]

>foodsだけを取り出すことが出来ませんでした。

前の方のレスで

>>$keys=array_keys($_POST);
>
>今、この辺を勉強しています。

と書かれていますよね?

  http://www.php.net/manual/ja/function.array-keys.php

  1. print_r(array_keys($_POST));

などは試されなかったのでしょうか?

この意見に回答する

ツリーへ TOPへ

A02-1-1-1-1-1-1-1
replyermugitaro [3月12日 13:56]

有難うございます。

再度見直しました。少し前進しました。

この意見に回答する

ツリーへ TOPへ

A02-1-1-1-1-1-2
replyerkaitau [3月12日 12:05] (最終編集:3月12日 12:07)

この意見は投稿者によって削除されました。

ツリーへ TOPへ

A02-1-1-1-1-2
replyerorpheus [3月12日 11:04]

質問に対しての回答ではないのですが失礼します。

配列変数をprint_rで出力しているようですが
個人的には配列はvar_dump関数で出力する方が良いと思います。

例:var_dump($array);

print_rと両方出力すると分かりますが
var_dumpの場合は配列内部の要素数と、要素ごとの型まで出力してくれます。

例:
$ar = array(
"りんご",
"みかん",
"ぶどう",
100,
);

print_r
Array ( [0] => りんご [1] => みかん [2] => ぶどう [3] => 100 )

var_dump
array(4) { [0]=>  string(9) "りんご" [1]=>  string(9) "みかん" [2]=>  string(9) "ぶどう" [3]=>  int(100) }

array(4)の表示から配列の要素は4つであり、stringが3つ、最後にintが1つ。というのが分かるので便利ですよ。

後はどちらの関数にも共通ですが、配列の出力時はhtmlの<pre>タグで挟むと便利です。
<pre>タグは囲まれた中の値を自動的に整形して表示してくれる便利なタグです。
html的には使用がオススメされないタグですが、デバッグ用に使うには役立ちます。

例:
echo '<pre>';
var_dump($array);
echo '</pre>';

やってみると感動しますよ!

この意見に回答する

ツリーへ TOPへ

A02-1-1-1-1-2-1
replyermugitaro [3月12日 13:57]

有難うございます。

本当に感動しました!
大変見やすくなりました。

この意見に回答する

ツリーへ TOPへ

A02-1-1-1-1-3
replyerkaitau [3月12日 12:12]

ちょっと待って、その提示コードだと$valueにarray_spliceが入っていて、
それでその配列構造の出力結果が出てくるのって話が違うんですけど。

その形だと、
$_POST が
array(
'parent_name'=>array('foods'=>'0102'),
...
);

みたいな二階層の配列になっていないといけないはずで、
(当然 parent_name は仮の名前ですが、)
そうなるとラジオボタンのhtmlは

<form id="form1" name="form1" method="post" action="./qa2617.php">
  <p>
    <label>
      <input type="radio" name="parent_name[foods]" value="1101" id="foodsGroup_0" />
      ドイツ </label>
    <label>
      <input type="radio" name="parent_name[foods]" value="1102" id="foodsGroup_0" />
      オランダ </label>
    <br />
<input type="submit" value="確定" />
</form>

みたいになっていないといけないはずですが?

ちなみに、文字列操作の話ではなく、配列操作の話です。

この意見に回答する

ツリーへ TOPへ

A02-1-1-1-1-3-1
replyermugitaro [3月12日 14:00]

有難うございます。

それで、皆様にアドバイスしていただいたのを参考にして現在下記までこぎつけました。
あと一歩です。

  1. $radio=array_keys($_POST);
  2. foreach($radio as $key => $value){
  3. echo '<pre>';
  4. var_dump($value);
  5. echo '</pre>';
  6. }


string(5) "foods"

string(7) "botton1"

任意の変数にfoodsが入ればよいのですがまだ上手くいきません。

この意見に回答する

ツリーへ TOPへ

A02-1-1-1-1-3-1-1
replyershimix [3月12日 14:18]

>任意の変数にfoodsが入ればよいのですがまだ上手くいきません。 

いや、"botton1"ってのはfoodsでもlifeでも共通なんじゃないの?だったら配列から取り除けるじゃん。

  1. $common_name = array('botton1'); // 共通に出てくるnameを配列で保持
  2.  
  3. $radio=array_keys($_POST);
  4. foreach($radio as $val){
  5.     if (in_array($val, $common_name)) { continue; }
  6.     $str = $val;
  7.     break;
  8. }

breakすれば最初の、breakしなければ最後の項目が$strに入るけど、「共通のname」以外はひとつだけ(foods or life)ならどっちでも問題ないでしょ?


で、上記のような用法なら、配列($radio)にキーを抜き出さなくてもいいわけで

  1. $common_name = array('botton1'); // 共通に出てくるnameを配列で保持
  2.  
  3. foreach($_POST as $key=>$val){
  4.     if (in_array($key, $common_name)) { continue; }
  5.     $str = $key;
  6.     break;
  7. }

この意見に回答する

ツリーへ TOPへ

A02-1-1-1-1-3-1-1-1
replyermugitaro [3月12日 15:37]

shimixさん
ソースまでご提示いただき有難うございます。

欲しかった文字列がきちんと取れています。ところが、今度はこの文字列例えば"foods"でデータが取れなくなりました。どうやらvalue="1102"を認識?していないみたいです。
以前試験的にfoodsやlifeを直接記入していたところにshimixさんご提示のソースで確かに入っていますが上手くいきません。
誠にあつかましいお願いですが"1102"を切り取るにはどのように変更すればよろしいのでしょうか。

この意見に回答する

ツリーへ TOPへ

A02-1-1-1-1-3-1-1-1-1 満足
replyershimix [3月12日 15:49] (最終編集:3月12日 15:51)

>ところが、今度はこの文字列例えば"foods"でデータが取れなくなりました。

どういうソースで取得しようとされていますか?

>value="1102"

っていうか$_POST['foods']が"1102"ですよね?で、$strに文字列"foods"を取れたのなら$_POST[$str]で"1102"が取れませんか?

もちろんキーと同時に取得してもかまいませんが・・

  1. $common_name = array('botton1'); // 共通に出てくるnameを配列で保持
  2.  
  3. foreach($_POST as $key=>$val){
  4.     if (in_array($key, $common_name)) { continue; }
  5.     $str = $key;
  6.   $value = $val;
  7.     break;
  8. }
  9. print $str . 'の値は' . $value . 'です';

この意見に回答する

ツリーへ TOPへ

A02-1-1-1-1-3-1-1-1-1-1
replyermugitaro [3月12日 20:24]

なりました!

完璧です。涙が出る位うれしいです。

暗黒の世界をさまよっているような気がしていたので
感激ひとしおです。

どうもありがとうございました。

この意見に回答する

ツリーへ TOPへ

A03
answerermagicflute2 [3月12日 17:36] (最終編集:3月12日 19:02)

foods.phpが食に関するページだと言う事で、飛んで来ていて、
1101といった値が国を指していて、なおかつ一意ならば、
そんなに、foodsという値を重要視せずともいいと思いますが。

以下の様に各パラメータをまとめれば、楽じゃないですかねぇ。
  1. <?php
  2. // defined.php
  3. // value="***"の値でラベルを参照できるようにした。
  4. // 国名がfoodsというのが気持ち悪いので、countriesにした。
  5. $params = array(
  6.                 'categories'=>array(
  7.                                'foods'=>'',
  8.                                'life' =>''
  9.                 ),
  10.                 'countries'=>array(
  11.                                '1101'=>'ドイツ',
  12.                                '1102'=>'アメリカ',
  13.                                '1103'=>'フランス',
  14.                                '1104'=>'イタリア',
  15.                                '1199'=>'その他'
  16.                               ),
  17.                 'hoge'=>array(
  18.                                '2101'=>'?',
  19.                                '2102'=>'??'
  20.                               )
  21.                );

  1. <?php
  2. // index.php
  3. require_once('defined.php');
  4. ?>
  5. <input type="radio" name="categories" value="foods" /> // foods
  6.  
  7. <input type="radio" name="categories" value="life" />  // life

index.phpで、foodsを選択した事にする。
  1. <?php
  2. // foods.php
  3. require_once( 'defined.php' )// defined.phpをインクルード
  4. //
  5. if (isset($_POST['categories']) &&
  6.   array_key_exists($_POST['categories']$params['categories'])) {
  7.     $category       = $_POST['categories'];             // foods
  8.     $category_label = $params['categories'][$category]// 食
  9.     //
  10.     // この後に必要ならhiddenでcategoriesを渡す。
  11.     $html = '<input type="hidden" name="categories" value="';
  12.     $html.= htmlspecialchars($categoryENT_QUOTES).'" />';
  13.     echo $html;
  14.     //
  15.     // countriesパラメータ一覧表示
  16.     // foods.phpに書いているのだから、
  17.     // foodsが選択されたとか気にしなくて良い
  18.     foreach ( $params['countries'] as $key => $value ) {
  19.       echo '<div>'.$key.'=>'.$value.'</div>'// 1101=>ドイツ...以後繰返し
  20.     }
  21. } else {
  22.     // エラー処理など
  23. }

この意見に回答する

ツリーへ TOPへ

A03-1
replyermugitaro [3月12日 20:29]

magicflute2さん

違った観点からのアドバイス本当に有難うございました。

本件が落ち着きましたらじっくり勉強させていただきます。

この意見に回答する

ツリーへ TOPへ

A03-1-1
replyermagicflute2 [3月12日 21:30] (最終編集:3月12日 21:43)

この意見は投稿者によって削除されました。

ツリーへ TOPへ

<<質問一覧へ



Pick Up Q&A

Q
負荷時のmysql_connect()エラー
 このエントリーをはてなブックマークに追加 
A
これはPHPというよりOSまたはMySQLのコミュニティで質問されたほうがいいと思います。 ぱっと思いついた範囲で記すと MySQL等のDBに「ある時点において同時に接続可能なクライアントの最大数」に制限があるよう...

>>続きを読む

今回のような実践的な経験がエンジニアのキャリアに繋がると思います。是非サービスを成功させて下さい!

▲解説者:岡本(アシアル株式会社 教育コーディネーター兼 システムエンジニア)