CGIでラジオボタンの選択結果を保持する方法

このQ&Aのポイント
  • CGIでラジオボタンの選択結果を保持する方法について説明します。具体的には、質問文章で複数の質問とラジオボタンがあり、それぞれの選択結果に応じて最終ページで表示を変えたい場合の方法について考えます。
  • まず、一つ前のページで選択した結果を次のページに反映させる方法は、<input type='hidden'>を使用することです。質問ページで選択した値を<hidden>タグで次のページに送信し、次のページで受け取った値を表示させることができます。
  • しかし、複数のページを経由して選択結果を保持し、最終ページで表示する場合は、より複雑なロジックが必要になります。例えば、質問によっては次のページが異なる場合や、複数の質問に対して条件分岐する必要がある場合などが考えられます。
回答を見る
  • ベストアンサー

CGIでラジオボタンの選択結果を保持する

http://okwave.jp/qa/q8211303.html 上記質問の続きです。 Q1,Q2,Q3・・・と質問をいくつか用意し、 それぞれで選択したラジオボタンによって、最終ページに表示させる回答を変えたいです。 ひとつ前のページで選択したものを次ページに反映させることはなんとかできたのですが 何ページも前に選択した回答を、最終ページに反映させる方法がわかりません。 <input type="hidden"を使うところまでは教えていただいたのですが 具体的にどうしていいかわかりません。 参考サイト等ありましたら教えていただけますでしょうか。 よろしくお願いいたします! ちなみに作成方法は以下のような感じです。 【Q1】 <form name="q1" action="com.cgi" method="POST"> <input type="hidden" name="stage" value="q1" /> <ol> <li><input type="radio" name="q11" value="q11_a"> 犬がすき</li> <li><input type="radio" name="q11" value="q11_b"> 猫がすき</li> <li><input type="radio" name="q11" value="q11_c"> うさぎがすき</li> </ol> <ol> <li><input type="radio" name="q12" value="q12_a"> 右利き</li> <li><input type="radio" name="q12" value="q12_b"> 左利き</li> </ol> <input type="submit" value="次へ" /> 【Q2】 <form name="q2" action="com.cgi" method="POST"> <input type="hidden" name="stage" value="q2" /> <ol> <li><input type="radio" name="q21" value="q21_a"> 海がすき</li> <li><input type="radio" name="q21" value="q21_b"> 山がすき</li> <li><input type="radio" name="q21" value="q21_c"> 散歩がすき</li> </ol> <input type="submit" value="次へ" /> 【Q3】 <form name="q3" action="com.cgi" method="POST"> <input type="hidden" name="stage" value="q3" /> <ol> <li><input type="radio" name="q31" value="q31_a"> 男性</li> <li><input type="radio" name="q31" value="q31_b"> 女性</li> </ol> <ol> <li><input type="radio" name="q32" value="q32_a"> 既婚</li> <li><input type="radio" name="q32" value="q32_b"> 未婚</li> </ol> <input type="submit" value="判定" /> 【最終ページ】 「あなたは犬がすきで右利きですね」 「あなたは海がすきですね」 「あなたは女性で既婚ですね」 と表示させたいです。 実際には、Q1→Q2→Q3と順番にページが飛ぶのではなく、 この答えだったら次はこのページ、それ以外は別のページ、 といった感じで、様々なページに飛びます。 以下のような感じで条件分岐を書いています。 if ($stage eq "q1") { if ($q11 eq "q11_a") { Q2(); } elsif ($q11 eq "q11_c") { ・・・; } elsif ($q12 eq "q12_b") { Q3(); } else { ・・・; } } よろしくお願いいたします!

  • CGI
  • 回答数12
  • ありがとう数13

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

  • ベストアンサー
  • ORUKA1951
  • ベストアンサー率45% (5062/11036)
回答No.8

ちょっと手を加えてみた。 1) ./html/NQ3.htmlは./html/FQ3.htmlに名称変更 2) ERRORを補足するためBIGIN{}を加えた。 3) きちんとHTMLが出力されることを確認したら必ず削除 #!/usr/local/bin/perl BEGIN{ $| = 1; print "Content-type: text/plain\n\n"; open(STDERR, ">&STDOUT"); } use strict; my $SECTION = "\t<section>\n"; read(STDIN, my $buffer, $ENV{'CONTENT_LENGTH'}); my $HTML ="/index.html"; my $PATH = '/Q1.html'; my @pairs = split(/&/,$buffer); my $meter_value ="1"; my %FORM = (); my ($pair,$STYLE,$MESSAGE,$INFORM); foreach $pair (@pairs) { _my ($name, $value) = split(/=/, $pair); _$FORM{$name}=$value; _$INFORM .= "\t\t\t<input type=\"hidden\" name=\"$name\" value=\"$value\">\n"; } if($FORM{'Q3'} && $FORM{'Q2'} && $FORM{'Q1'}){ _$MESSAGE="回答です。"; _$STYLE = "section p{font-size:2em;text-indent:1em;padding:0.5em 1em;"; } else{ _$MESSAGE="下記の質問にお答えください。"; _$STYLE = "section{background-color:silver;"; } if($FORM{'Q3'} eq "W"){ _if($FORM{'Q2'} eq "M"){ __$SECTION .=qq^\t\t<p>あなたは、西日本生まれの既婚男性です。</p>\n^; __$STYLE .= "background-color:blue;color:white;}"; _} _else{$SECTION .= qq^\t\t<p>あなたは、西日本生まれ未婚男性です。</p>\n^; __$STYLE .= "background-color:aqua;"; _} } elsif($FORM{'Q3'} eq "E"){ _if($FORM{'Q2'} eq "M"){ __$SECTION .=qq^\t\t<p>あなたは、東日本生まれの既婚男性です。</p>\n^; __$STYLE .= "background-color:green;"; _} _else{ __$SECTION .= qq^\t\t<p>あなたは、東日本生まれ未婚男性です。</p>\n^; __$STYLE .= "background-color:lime;"; _} } elsif($FORM{'Q3'} eq "F"){ _if($FORM{'Q2'} eq "M"){ __$SECTION .=qq^\t\t<p>あなたは、太った既婚女性です。</p>\n^; __$STYLE .= "background-color:yellow;"; _} _else{ __$SECTION .= qq^\t\t<p>あなたは、太った未婚女性です。</p>\n^; __$STYLE .= "background-color:orange;"; _} } elsif($FORM{'Q3'} eq "S"){ _if($FORM{'Q2'} eq "M"){ __$SECTION .=qq^\t\t<p>あなたは、痩せた既婚女性です。</p>\n^; __$STYLE .= "background-color:red;"; _} _else{ __$SECTION .=qq^\t\t<p>あなたは、痩せた未婚女性です。</p>\n^; __$STYLE .= "background-color:fuchsia;"; _} } else{ _if($FORM{'Q2'} eq "M" || $FORM{'Q2'} eq 'N'){ __$meter_value = '0.67'; __$PATH = '/answer.html'; __if($FORM{'Q1'} eq 'M'){$HTML = 'MQ3.html';} __else{$HTML = 'FQ3.html';} _} _elsif($FORM{'Q1'} eq "M" || $FORM{'Q1'} eq "F"){ __$meter_value = '0.33'; __$HTML = 'Q2.html';$PATH = '/Q3.html'; _} _elsif($FORM{'Q0'} eq "ok"){ __$meter_value = '0.2'; __$HTML = 'Q1.html';$PATH = '/Q2.html'; _} _else{ __if($FORM{'Q1'} eq ""){$MESSAGE .= "</p>\n\t\t\t<p>データがありません\n";} __$meter_value ="0"; __$PATH = '/Q1.html'; _} } my $FORM = "\t\t\t<form action=\"$ENV{'SCRIPT_NAME'}$PATH\" method=\"post\">\n$INFORM"; open(IN,"<./html/$HTML"); while(my $line = <IN>){$FORM .= "$line";} close IN; if($FORM{'Q0'} eq ""){$FORM .= "\t\t\t<p><input type=\"submit\" value=\"つづける\"></p>\n\t\t</form>\n";} elsif($FORM{'Q3'} ne ""){$FORM ="";} else{$FORM .= "\t\t\t<p><input type=\"submit\" value=\"送信\"></p>\n\t\t</form>\n";} $SECTION .= $FORM."\t\t</section>\n"; my $METER = "\t\t\t<p class=\"meter\"><meter value=\"$meter_value\">$meter_value</meter></p>"; print "content-type:text/html\n\n"; while(<DATA>){ _s/<!-- meter -->/$METER/; _s/\/\* style \*\//$STYLE/; _s/<!-- Message -->/$MESSAGE/; _s/<!-- Section -->/$SECTION/; _print; } __END__ <!doctype html> <html> <head> <meta charset="utf-8"> <title>サンプル</title> <style media="screen"> <!-- html,body{margin:0;padding:0;background-color:gray;} header,section,footer{width:50%;margin:0 auto;padding:5px 10px;background-color:white;} p.meter{font-size:2em;text-align:center;} /* style */ --> </style> </head> <body> _<header> __<h1 id="title">Your title</h1> __<p><!-- Message --></p> <!-- meter --> _</header> <!-- Section --> _<footer> __<h3>A nice footer</h3> _</footer> </body> </html>

masunona
質問者

お礼

すみません・・・最上部のお礼の補足の補足です。 「文字化けして」と書きましたが 正確には 「chromeだと文字化けして、IEとFirefoxでは文字化けせずにそのまま」 でした。 あせってお礼してしまったためすみません。 よろしくお願いいたします!

その他の回答 (11)

  • ORUKA1951
  • ベストアンサー率45% (5062/11036)
回答No.12

>TESTファイルに.cgiとつけてみたら正常に動きました!  と言うことは、CGIは動作する。  そのディレクトリに Options に +ExecCGI  が指定されていて、かつ、 AddHandler cgi-script .cgi  が指定されている。ということです。 この場合.htaccessに AddType application/x-httpd-cgi TEST; で、TESTというファイルはCGIとして動作するはずです。 ひょっとして、TESTの実行権限が666のままとか?? あるいは、 SetHandler cgi-script を書く必要があるのかも/??  いずれにしても、拡張子は動作には関係ないのです。Windowsとは異なり、すべての動作は設定ファイルでディレクトリごとファイル名ごと、拡張子こどに指定できる物なのですよ。  拡張子の呪縛から解放されると良いですね。

masunona
質問者

お礼

ありがとうございます! ひとつひとつ確認していってみたいと思います。 長々とお付き合いいただき、丁寧にお返事くださって本当に助かりました。 ありがとうございました!

  • ORUKA1951
  • ベストアンサー率45% (5062/11036)
回答No.11

AddType application/x-httpd-cgi TEST; とは、TESTというファイルをCGIとして解釈しろと言う意味です。 httpd.confを直接変更するのではなく。httpd.confには、 AllowOverride All を指定して、.htaccessで上書きが出来るようにしておかなければなりません。  ⇒Apache チュートリアル: .htaccess ファイル - Apache HTTP サーバ( https://httpd.apache.org/docs/2.4/ja/howto/htaccess.html ) [例] <Directory "G:/usr/local/apache/cgi-bin"> AllowOverride All Options ALL Includes ExecCGI Order allow,deny Allow from all </Directory>  なお、自前のサーバーであれば、httpd.confで直接しています。 >できれば.cgiでやりたいなーと今更思っているのですが・・・  これは、あなたの質問の一番最初に「たくさんのHTMLファイル・・」「最後に回答を」と書かれていたので、それに従ったのですよ。  アクセスされると ****/cgi-bin/TEST  になり、ボタンを押すと ****/cgi-bin/TEST/Q1.html ****/cgi-bin/TEST/Q2.html ****/cgi-bin/TEST/Q3.html ****/cgi-bin/TEST/answer/html とURLが変わって行く筈です。もちろんデータなしで直接URLを指定しても、****/cgi-bin/TEST・・・あるいは****/cgi-bin/TEST/index.htmlと同じ内容に代わっているはずです。  概観上、CGIであることを隠す・・というか、 ****/cgi-bin/TEST.cgi/Q1.html  じゃなく  QERY_STRINGSを表に出さないというか・・

masunona
質問者

お礼

ありがとうございます! おしえていただいたことを元に httpd.conf をひらいて見てみたところ <Directory /> Options FollowSymLinks AllowOverride None Order deny,allow Deny from all </Directory> という記述があったので、このへんかなーと思い、これを <Directory /> AllowOverride All Options ALL Includes ExecCGI Order allow,deny Allow from all </Directory> と書き直して上書き保存し、パソコンを再起動して 再度ページを見てみましたが、変化ありませんでした。。 >これは、あなたの質問の一番最初に 「たくさんのHTMLファイル・・」「最後に回答を」 と書かれていたので、それに従ったのですよ。 大変失礼しました! URLが ****/cgi-bin/TEST.cgi/Q1.html となっていても別に問題なかったのですが・・・ ってことで、TESTファイルに.cgiとつけてみたら正常に動きました! すっごくうれしいです!!! コードじっくり見せていただき勉強します! また質問させていただくことあると思いますが・・・ ありがとうございました!!!

  • ORUKA1951
  • ベストアンサー率45% (5062/11036)
回答No.10

>TESTファイルに書かれたコードが文字化けして出てきました! エラーがテキストで出力されてきますから、UTF対応のブラウザなら文字コード、テキストエディタならUTFで見れば・・  そしたら、BEGIN{}の行を削除するとOKのはずです。

masunona
質問者

お礼

早速ありがとうございます! 「文字化けして」と書きましたが 正確には 「chromeだと文字化けして、IEとFirefoxでは文字化けせずにそのまま」 でした。 とりあえずchromeの文字化け問題はおいといて、 IEで進めていきたいと思います。 BEGIN{ $| = 1; print "Content-type: text/plain\n\n"; open(STDERR, ">&STDOUT"); } 上記コードを削除しても、 TESTのコードがそのまま出力されてしまいました。 ためしに TEST2というファイルを同じ要領で作成し #!/usr/local/bin/perl print "Content-type: text/html\n\n"; print "Hello, World."; と書いてアップロードしても、 コードがそのまま表示されてしまいました。 TEST2ファイルをTEST2.cgiと名前を変更すると、 Hello, World. と表示され、正常に動作しました。 「.cgi」でないファイルをCGIとして動作させるのをやったことがないので どこが悪いのかさっぱり理解できません・・・。 お手数おかけしますが、またお手すきのときにお願いいたします!

masunona
質問者

補足

何度もすみません。 自分なりに調べてみて、以下の作業をしてみました。 %ProgramFiles%/Apache Software Foundation/Apache2.2/conf/httpd.conf をひらいて なにやら英語だらけだったのですが、 真ん中へんに適当に <FilesMatch "^[^\.]+$"> SetHandler cgi-script </FilesMatch> と書き込み、 「httpd.confの再起動」の方法がよくわからなかったので パソコンをそのまま再起動して また見てみたのですが、やはりコードがそのまま表示されてしまいました・・・。 .cgiにしないのと、.cgiとするのでは、 何か違いがあるんでしょうか? 私の理解の範疇を超えてしまっているので、 できれば.cgiでやりたいなーと今更思っているのですが・・・ またお手すきのときにお願いいたします!

  • ORUKA1951
  • ベストアンサー率45% (5062/11036)
回答No.9

その時点でエラーがでるということは perlへのパスが間違っているのでは??  telnet が使えれば、 > which perl  UTFにした時に、BOMが付いてしまった???  ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

masunona
質問者

お礼

何度もありがとうございます! perlへのパスは、 #!/usr/local/bin/perl です。 このパスでほかのcgiは正常に動作しています。 >UTFにした時に、BOMが付いてしまった??? まさにこのとおりでしたので、 漢字コードをUTF-8Nにして保存しなおしました! しかしやはり Internal Server Error です・・・。 もしまたお気づきの点ありましたら教えてください!

masunona
質問者

補足

すみません! .htaccessファイルの漢字コードを修正するのを忘れていて こちらも修正してアップロードし直して http://***/TEST にアクセスしたところ、 Internal Server Error ではなく、 TESTファイルに書かれたコードが文字化けして出てきました! お手数おかけして申し訳ありません。 引き続きよろしくお願いいたします!

  • ORUKA1951
  • ベストアンサー率45% (5062/11036)
回答No.7

No.4です。 違います。 ★ディレクトリ名は、htmlです。 ★CGI実行ファイル名は、TEST です。拡張子はありません。 |-- cgi-bin    |-- .htaccess  テキストファイル    |-- TEST    実行ファイル    |-- html/    ディレクトリ       |-- index.html  HTML断片ファイル       |-- MQ3.html       |-- NQ3.html       |-- Q1.html       |-- Q2.html  再度、よく読んで・・・ perlののパスの下に #!/usr/local/bin/perl BEGIN{ $| = 1; print "Content-type: text/html\n\n"; open(STDERR, ">&STDOUT"); } と書いておくと、エラー内容がブラウザから確認できます。  面白いし、使えそうなのでもう少し手を入れたものを今夕にでも・・

masunona
質問者

お礼

何度もすみません・・・ TESTは拡張子なしで保存してます。 TEST、.htaccessと同じ階層に作成したhtmlというフォルダのなかに index.html MQ3.hml NQ3.html Q1.html Q2.html を作成したのですが・・・ それから #!/usr/local/bin/perl の下に BEGIN{ $| = 1; print "Content-type: text/html\n\n"; open(STDERR, ">&STDOUT"); } と書き加えましたが Internal Server Error と出てしまいました。 申し訳ありません。 またお返事お待ちしてます!

  • ralf124c
  • ベストアンサー率52% (232/446)
回答No.6

たびたびでスイマセン > すみません、、、「大丈夫」というのの意味がわかりません。。。 > nameのつけかたまずいですか? nameの付け方がまずいわけではなく、CGIにPOSTした際にnameに気を付けてデータ取得していますかということです POSTされたデータをどのようにして変数に配置代入しているのかその部分のリストが提示されていないのであくまで見た目のお話ですが 例えば ・質問のフォームでは「Q1」には「q11」および「q12」がnameとして使われています ・ANo.1さんのお礼欄では、"$q11" および "$q12" というnameに対応した変数に代入して、それぞれ「q11a」「q12a」というnameのinputタグ内のvalueにセッティングしてます ・さらに同じくお礼欄で、その次のステップでは、"$q11" および "$q12" と1順目と同じ変数を使って「q11a」「q12a」というnameのinputタグ内のvalueにセッティングしてますが・・・ もしかしてなんですが、「nameと変数名を同じ」作りにしていて、2巡目では変数 "$q11a"と"$q12a"をinputタグ内のvalueにセッティングしなければいけない作りになっていませんか? という意味の「大丈夫?」というものでした 値が渡されていないのは異なるnameや変数を参照している以外考えられないからです 上記の点をご確認ください

  • ORUKA1951
  • ベストアンサー率45% (5062/11036)
回答No.5

ちょっと変なところがあったので・・ ★文字コードはすべてUTF-8です。 #!/usr/local/bin/perl my $SECTION = "\t<section>\n"; read(STDIN, my $buffer, $ENV{'CONTENT_LENGTH'}); my $HTML ="/index.html"; my $INFORM =""; my $PATH = '/Q1.html'; my @pairs = split(/&/,$buffer); my $STYLE =""; foreach $pair (@pairs) { _my ($name, $value) = split(/=/, $pair); _$FORM{$name}=$value; _$INFORM .= "\t\t\t<input type=\"hidden\" name=\"$name\" value=\"$value\">\n"; } if($FORM{'Q3'} && $FORM{'Q2'} && $FORM{'Q1'}){ _$MESSAGE="回答です。"; _$STYLE = "section p{font-size:2em;text-align:center;"; } else{ _$MESSAGE="下記の質問にお答えください。"; } if($FORM{'Q3'} eq "W"){ _if($FORM{'Q2'} eq "M"){ __$SECTION .=qq^\t\t<p>あなたは、西日本生まれの既婚男性です。</p>\n^; __$STYLE .= "background-color:blue;color:white;}"; _} _else{$SECTION .= qq^\t\t<p>あなたは、西日本生まれ未婚男性です。</p>\n^; __$STYLE .= "background-color:aqua;"; _} } elsif($FORM{'Q3'} eq "E"){ _if($FORM{'Q2'} eq "M"){ __$SECTION .=qq^\t\t<p>あなたは、東日本生まれの既婚男性です。</p>\n^; __$STYLE .= "background-color:green;"; _} _else{ __$SECTION .= qq^\t\t<p>あなたは、東日本生まれ未婚男性です。</p>\n^; __$STYLE .= "background-color:lime;"; _} } elsif($FORM{'Q3'} eq "F"){ _if($FORM{'Q2'} eq "M"){ __$SECTION .=qq^\t\t<p>あなたは、太った既婚女性です。</p>\n^; __$STYLE .= "background-color:yellow;"; _} _else{ __$SECTION .= qq^\t\t<p>あなたは、太った未婚女性です。</p>\n^; __$STYLE .= "background-color:orange;"; _} } elsif($FORM{'Q3'} eq "S"){ _if($FORM{'Q2'} eq "M"){ __$SECTION .=qq^\t\t<p>あなたは、痩せた既婚女性です。</p>\n^; __$STYLE .= "background-color:red;"; _} _else{ __$SECTION .=qq^\t\t<p>あなたは、痩せた未婚女性です。</p>\n^; __$STYLE .= "background-color:fuchsia;"; _} } else{ _if($FORM{'Q2'} eq "M"){ __$HTML = 'MQ3.html'; __$PATH = '/answer.html'; _} _elsif($FORM{'Q2'} eq "N"){ __$HTML = 'NQ3.html'; __$PATH = '/answer.html'; _} _elsif($FORM{'Q1'} eq "M" || $FORM{'Q1'} eq "F"){ __$HTML = 'Q2.html'; __$PATH = '/Q3.html'; _} _elsif($FORM{'Q0'} eq "ok"){ __$HTML = 'Q1.html'; __$PATH = '/Q2.html'; _} } my $FORM = "\t\t\t<form action=\"$ENV{'SCRIPT_NAME'}$PATH\" method=\"post\">\n\t\t\t\t$INFORM"; open(IN,"<./html/$HTML"); while(my $line = <IN>){$FORM .= "$line";} close IN; if($FORM{'Q0'} eq ""){$FORM .= "\t\t\t<p><input type=\"submit\" value=\"つづける\"></p>\n\t\t</form>\n";} elsif($FORM{'Q3'} ne ""){$FORM ="";} else{$FORM .= "\t\t\t<p><input type=\"submit\" value=\"送信\"></p>\n\t\t</form>\n";} $SECTION .= $FORM."\t\t</section>\n"; print "content-type:text/html\n\n"; while(<DATA>){ _s/\/\* style \*\//$STYLE/; _s/<!-- Message -->/$MESSAGE/; _s/<!-- Section -->/$SECTION/; _print; } __END__ <!doctype html> <html> <head> <meta charset="utf-8"> <title>サンプル</title> <style media="screen"> <!-- html,body{margin:0;padding:0;background-color:silver;} header,section,footer{width:50%;margin:0 auto;padding:5px 10px;background-color:white;} /* style */ --> </style> </head> <body> _<header> __<h1 id="title">Your title</h1> __<p><!-- Message --></p> _</header> <!-- Section --> _<footer> __<h3>A nice footer</h3> _</footer> </body> </html>

masunona
質問者

お礼

何度もありがとうございます! いただいた通りに作ってみました。 「test」フォルダのなかに .haccess TEST ファイルを作成し、 いただいたとおりコードを書き込みました。 「test」フォルダのなかに「html」フォルダを作成し、 index.html MQ3.hml NQ3.html Q1.html Q2.html ファイルを作成しました。 ・TESTファイルは属性を755に変更し、 「html」フォルダ内のファイルはすべて644です。 ・TESTファイルの先頭のperlへのパスは書き換えました。 ・すべてのファイルの文字コードをUTF-8にしました。 ・TESTファイルと「html」フォルダ内のファイルの アンダーバーは削除しました。 以上の作業をして http://***/test/TESTにアクセスしたところ、 Internal Server Error になってしまい、正しく表示されませんでした。 修正点をおしえていただけますか? たびたび申し訳ありません。 よろしくお願いいたします!

  • ORUKA1951
  • ベストアンサー率45% (5062/11036)
回答No.4

>いただいたコードはページは飛ばず、ひとつのページ内にいくつか質問が表示されているものなのかな?と思いました。  別々のHTMLだろうが、ページ内だろうがCGIを使う限り、一切関係ないです。 ★下記を実際に試してください。 http://hoge/**/TEST でHTMLが表示されるはずです。  以後は、URLはそれぞれのHTMLとして個別に開きます。 ★実際に試さないと、けっして理解できないですよ。 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^  ごく簡単なサンプルを・・タブは_に置換してあるので戻す。 1)下記内容の[.htaccess]をCGIを置くディレクトリに置く。 AddType application/x-httpd-cgi TEST; 2) そのディレクトリに[html]という名前のディレクトリを作る。 3) 拡張子なしで最後に書いてあるTESTと言うファイルを置く。   先頭のperlへのパスは書き換えること!!   CGIとして実行権限を与えておく。755とか、705です。 4) その中に次のファイル名のテキストファイル(HTMLの断片)をそれぞれのファイル名で入れる。   パーミッションは、644とか。 [index.html] ___<input type="hidden" name="Q0" value="ok"> ___<p>今かな色々質問します。</p> ___<p>よろしかったらクリックしてください。</p> [MQ3.html] ___<p>あなたは西日本出身?それとも東日本出身?</p> ___<p>西日本:<input type="radio" name="Q3" value="W"></p> ___<p>東日本:<input type="radio" name="Q3" value="E"></p> [NQ3.html] ___<p>あなたは太っている?それとも痩せてる?</p> ___<p>太っている:<input type="radio" name="Q3" value="F"></p> ___<p>痩せている:<input type="radio" name="Q3" value="S"></p> [Q1.html] ___<p>あなたは男?それとも女?</p> ___<p>男:<input type="radio" name="Q1" value="M"></p> ___<p>女:<input type="radio" name="Q1" value="F"></p> [Q2.html] ___<p>あなたは未婚?それとも既婚?</p> ___<p>既婚:<input type="radio" name="Q2" value="M"></p> ___<p>未婚:<input type="radio" name="Q2" value="N"></p> [TEST]・・・拡張子なしでTESTというファイル #!/usr/local/bin/perl my $SECTION = "\t\t<section>\n"; read(STDIN, my $buffer, $ENV{'CONTENT_LENGTH'}); my $HTML ="index.html"; my $INFORM =""; my @pairs = split(/&/,$buffer); foreach $pair (@pairs) { _my ($name, $value) = split(/=/, $pair); _$value =~ tr/+/ /; _$value =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg; _$name =~ tr/+/ /; _$name =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg; _if ($value =~ /\r\n/) { $value =~ s/\r//g; } _elsif ($value =~ /\r/) { $value =~ s/\r/\n/g; } _$FORM{$name}=$value; _$INFORM .= "\t\t\t<input type=\"hidden\" name=\"$name\" value=\"$value\">\n"; } if($FORM{'Q3'} && $FORM{'Q2'} && $FORM{'Q1'}){ _$MESSAGE="回答です。"; } else{ _$MESSAGE="下記の質問にお答えください。"; } if($FORM{'Q3'} eq "W"){ _$HTML = 'answer.html'; _if($FORM{'Q2'} eq "M"){$SECTION =qq^\t\t<section>\n\t\t\t<p>西日本生まれの既婚男性</p>\n^;} _else{$SECTION .= qq^\t\t<section>\n\t\t\t<p>西日本生まれ未婚男性</p>\n^;} } elsif($FORM{'Q3'} eq "E"){ _$HTML = 'answer.html'; _if($FORM{'Q2'} eq "M"){$SECTION =qq^\t\t<section>\n\t\t\t<p>東日本生まれの既婚男性です。</p>\n^;} _else{$SECTION .= qq^\t\t<section>\n\t\t\t<p>東日本生まれ未婚男性</p>\n^;} } elsif($FORM{'Q3'} eq "F"){ _$HTML = 'answer.html'; _if($FORM{'Q2'} eq "M"){$SECTION =qq^\t\t<section>\n\t\t\t<p>太った既婚女性</p>\n^;} _else{$SECTION .= qq^\t\t<section>\n\t\t\t<p>太った未婚女性</p>\n^;} } elsif($FORM{'Q3'} eq "S"){ _$HTML = 'answer.html'; _if($FORM{'Q2'} eq "M"){$SECTION =qq^\t\t<section>\n\t\t\t<p>痩せた既婚女性</p>\n^;} _else{$SECTION .=qq^\t\t<section>\n\t\t\t<p>痩せた未婚女性</p>\n^;} } else{ _if($FORM{'Q2'} eq "M"){ __$HTML = 'MQ3.html'; _} _elsif($FORM{'Q2'} eq "N"){ __$HTML = 'NQ3.html'; _} _elsif($FORM{'Q1'} eq "M" || $FORM{'Q1'} eq "F"){ __$HTML = 'Q2.html'; _} _elsif($FORM{'Q0'} eq "ok"){ __$HTML = 'Q1.html'; _} } my $FORM = "\t\t\t<form action=\"$ENV{'SCRIPT_NAME'}/$HTML\" method=\"post\">\n\t\t\t\t$INFORM"; open(IN,"<./html/$HTML"); while(my $line = <IN>){ $FORM .= "$line"; } if($FORM{'Q0'} eq ""){$FORM .= "\t\t\t<p><input type=\"submit\" value=\"つづける\"></p>\n\t\t</form>\n";} elsif($FORM{'Q3'} ne ""){$FORM ="";} else{$FORM .= "\t\t\t<p><input type=\"submit\" value=\"送信\"></p>\n\t\t</form>\n";} $SECTION .= $FORM."\t\t</section>\n"; print "content-type:text/html\n\n"; while(<DATA>){ _s/<!-- Message -->/$MESSAGE/; _s/<!-- Section -->/$SECTION/; _print; } __END__ <!doctype html> <html> <head> <meta charset="utf-8"> <title>サンプル</title> <style media="screen"> <!-- html,body{margin:0;padding:0;background-color:silver;} header,section,footer{width:50%;margin:0 auto;padding:5px 10px;background-color:white;} --> </style> </head> <body> _<header> __<h1 id="title">Your title</h1> __<p><!-- Message --></p> _</header> <!-- Section --> _<footer> __<h3>A nice footer</h3> _</footer> </body> </html>

  • ralf124c
  • ベストアンサー率52% (232/446)
回答No.3

たびたびすいません もしかしてなんですけど 2巡目以降のinputタグ内name、「q11a」とか「q12a」の「a」っていうのは大丈夫なんですか?

masunona
質問者

お礼

何度もありがとうございます! すみません、、、「大丈夫」というのの意味がわかりません。。。 nameのつけかたまずいですか?

  • ralf124c
  • ベストアンサー率52% (232/446)
回答No.2

お礼のリストを見たのですが、黒星印のinputタグは次に送信する<form></form>内にちゃんと収まっているのでしょうか? 次の送信時のFORMタグに囲まれたところに無いので、次のCGI表示に反映されないのでは?

masunona
質問者

お礼

ご回答いただきありがとうございます! コードを省略しすぎてしまって申し訳ありません。 inputはformのなかに入れてます。 Q2の回答は表示されるのに Q1の回答が表示されないんです・・・。 またお気づきの点ありましたら教えてください。 よろしくお願いいたします! <form name="q3" action="com.cgi" method="POST"> <input type="hidden" name="stage" value="q3" /> ・・・ <input type="text" name="q11a" value="$q11" />☆ <input type="text" name="q12a" value="$q12" />☆ <input type="text" name="q21a" value="$q21" />★ <input type="text" name="q22a" value="$q22" />★ <input type="text" name="q23a" value="$q23" />★ ・・・ <input type="submit" value="判定" /> </div> </form>

関連するQ&A

  • ラジオボタンについて

    ラジオボタンのnameにそれぞれ違う名前をつけても 選択の制限を1つだけにできるやり方はありませんか? 例 <input type="hidden" name="a1" value="0151" /> <input name="a" type="radio" value="1" /> <input type="hidden" name="b1" value="0152" /> <input name="b" type="radio" value="1" /> <input type="hidden" name="c1" value="0153" /> <input name="c" type="radio" value="1" /> 私がやりたいことはあるプログラムシステムで使用するため ラジオボタンの上にhiddenでそれぞれ指定してるため このような形で表示できないかと、おもっています。

    • ベストアンサー
    • HTML
  • ラジオボタンでうまくするには・・・・

    初めまして。 現在下記のプルダウン形式で、一つの価格が同じなので問題なく動くのですが <FORM action="cart/sys/cart.cgi" method="post"> <INPUT type=hidden value=005 name=num> <INPUT type=hidden value=●●● name=name> <INPUT type=hidden value=2000 name=tan> <SELECT name=sur> <OPTION value="" selected>購入数量</OPTION> <OPTION value=1>1</OPTION> <OPTION value=2>2</OPTION> <OPTION value=3>3</OPTION> <OPTION value=4>4</OPTION> <OPTION value=5>5</SELECT> <INPUT type=submit value=カートに入れる> </FORM><BR> <FORM action="・・・/cart.cgi" method="post"> <INPUT type=hidden value=005 name=num> <INPUT type=hidden value=●●● name=name> <INPUT type=hidden value=2000 name=tan> </FORM> 同じ商品で1・2・3・4・5のそれぞれに単価が変わる設定をしたいのですが、うまくいく方法が見つからないです。 ラジオボタン形式で作ってみたものの・・・・ <FORM action="・・・/cart.cgi" method="post"> <INPUT type=hidden value=005 name=num> <INPUT type=hidden value=●●● name=name> <INPUT type=submit value=カートに入れる> </FORM> <FORM> <INPUT type="radio" name="name1" value="2000">1袋<BR> <INPUT type="radio" name="name1" value="3900">2袋<BR> <INPUT type="radio" name="name1" value="5800">3袋<BR> <INPUT type="radio" name="name1" value="7500">4袋<BR> <INPUT type="radio" name="name1" value="8500">5袋</FORM> としてみましたがうまくいきません。 なにか方法ございましたら、ご教授いただければと思います。

    • ベストアンサー
    • HTML
  • (jQuery)ラジオボタン選択値を配列で送信

    ちょっと前に別の方の同名の質問があり、正しい回答が出る前に、例によって不適切な回答で閉め切られてしまったため、失礼とは存じますが改めて質問させていただきます。 <form id="enqe" action="/hoge/enqe" method="post"> <label for="group_a">好きなフレームワーク</label> <input type="radio" name="group_a" value="a1">cake php</input> <input type="radio" name="group_a" value="a2">fuel php</input> <input type="radio" name="group_a" value="a3">symphony</input> <label for="group_b">使っているOS</label> <input type="radio" name="group_b" value="b1">windows</input> <input type="radio" name="group_b" value="b2">macintosh</input> <input type="radio" name="group_b" value="b3">linux</input> <label for="group_c">使っているCPU</label> <input type="radio" name="group_c" value="c1">ivy bridge</input> <input type="radio" name="group_c" value="c2">sandy bridge</input> </form> のような選択肢があって、選択値を配列で送信したいです。 配列で受けたい理由は、送信側のフォーム(項目、グループ分け)が逐次追加変更される予定で、それに合わせてDBだけを変更して対応したいからです。 したがって、「毎度サーバサイドで対応しろ」という回答は困ります。 <input type="hidden" name="gval[]" value="a1" /> <input type="hidden" name="gval[]" value="b2" /> <input type="hidden" name="gval[]" value="c3" /> という内容を生成して送信すればいいのはわかりますが、どう記述したらいいかがわかりません。 いちおうjQueryで、 $('form#enqe').submit(function(){ // $(this).find("input[type='radio']"); で、<input type="radio">を取得 }); まではわかりましたが、jQueryに疎く、その先がわかりません。 識者の方々のお力をお借りできれば幸いです。

  • CGIでチェックボックスのエラーチェック

    下記のような感じで チェックボックスをいくつか配置し、CGIで動かしています。 それぞれの質問に関して未選択がある場合、 メッセージボックスで「未選択があります」と表示させたいです。 できればjavascriptでなくCGIでやりたいです。 どのようにコードを書けばいいですか? ためしに以下のように書いてみましたがだめでした。 ・・・ elsif ($q1 eq "" && $q2 eq "") { &error($error = "すべての項目に回答して下さい"); } ・・・ お願いいたします! <form name="q1" action="test.cgi" method="POST"> Q1 <input type="radio" name="q1" value="q1_a"> A <input type="radio" name="q1" value="q1_b"> B <input type="radio" name="q1" value="q1_c"> C Q2 <input type="radio" name="q2" value="q2_a"> D <input type="radio" name="q2" value="q2_b"> E <input type="radio" name="q2" value="q2_c"> F </form>

    • ベストアンサー
    • CGI
  • ラジオボタンの内容を受けてCGIでコメント表示

    あるhtmlページにラジオボタンを設置しています。 このボタンを選択したらこのページ、このボタンの場合はこのページ、 と、CGIを使って、選択したボタンによってさまざまなページにジャンプさせています。 最後に、判定結果を掲載するページとして、 インラインフレームを設置し、そのなかにcgiを読み込ませて 選択したラジオボタンによってそのなかに表示させるコメントを変えたいです。 Q1でaを選んだ場合はこのコメント、 Q2でbを選んだ場合はこのコメント、 と、拾ってくる質問が記載されているhtmlページが複数にわたります。 以下でいう、test2.cgiは、どのように記述したらいいでしょうか? サンプルコードなど掲載されているサイトがあったら教えてください。 <ラジオボタンが設置してあるhtmlページ> <form name="q1" action="test1.cgi" method="POST"> 質問 <input type="radio" name="q1" value="q1_a">回答a <input type="radio" name="q1" value="q1_b">回答b <input type="radio" name="q1" value="q1_c">回答c <input type="submit" value="判定" /> <コメントを表示させるhtmlページ> 判定結果をお知らせします <div id="frame"> <iframe src="test2.cgi" title="判定結果"> </iframe>

    • ベストアンサー
    • CGI
  • Javascriptの結果の出し方で困っています。

    自分のサイトにチェッカーを入れたくて下記の記述を書きました。 <script> function calc(f){ var sum=0; for(var i=0;i<f.length;i++){ if(f[i].type=="radio" && f[i].checked) sum+=parseInt(f[i].value); } f.judge.value=sum; } </script> <form action="chekker/" method="post"> <ol> <li>aaaaaaaaaaaaa<br> <input type="radio" name="Q1" id="Q1_1" value="2"><label for="Q1_1">はい</label> <input type="radio" name="Q1" id="Q1_2" value="0"><label for="Q1_2">いいえ</label> <br><br> <li>aaaaaaaaaaaaa<br> <input type="radio" name="Q2" id="Q2_1" value="2"><label for="Q2_1">はい</label> <input type="radio" name="Q2" id="Q2_2" value="0"><label for="Q2_2">いいえ</label> <br><br> <li>aaaaaaaaaaaaa<br> <input type="radio" name="Q3" id="Q3_1" value="2"><label for="Q3_1">はい</label> <input type="radio" name="Q3" id="Q3_2" value="0"><label for="Q3_2">いいえ</label> <br><br> <li>aaaaaaaaaaaaa<br> <input type="radio" name="Q4" id="Q4_1" value="2"><label for="Q4_1">はい</label> <input type="radio" name="Q4" id="Q4_2" value="0"><label for="Q4_2">いいえ</label> <br><br> <li>aaaaaaaaaaaaa<br> <input type="radio" name="Q5" id="Q5_1" value="2"><label for="Q5_1">はい</label> <input type="radio" name="Q5" id="Q5_2" value="0"><label for="Q5_2">いいえ</label> <br><br> <li>aaaaaaaaaaaaa<br> <input type="radio" name="Q6" id="Q6_1" value="2"><label for="Q6_1">はい</label> <input type="radio" name="Q6" id="Q6_2" value="0"><label for="Q6_2">いいえ</label> <br><br> <li>aaaaaaaaaaaaa<br> <input type="radio" name="Q7" id="Q7_1" value="2"><label for="Q7_1">はい</label> <input type="radio" name="Q7" id="Q7_2" value="0"><label for="Q7_2">いいえ</label> <br><br> <li>aaaaaaaaaaaaa<br> <input type="radio" name="Q8" id="Q8_1" value="2"><label for="Q8_1">はい</label> <input type="radio" name="Q8" id="Q8_2" value="0"><label for="Q8_2">いいえ</label> <br><br> <li>aaaaaaaaaaaaa<br> <input type="radio" name="Q9" id="Q9_1" value="2"><label for="Q9_1">はい</label> <input type="radio" name="Q9" id="Q9_2" value="0"><label for="Q9_2">いいえ</label> <br><br> <li>aaaaaaaaaaaaa<br> <input type="radio" name="Q10" id="Q10_1" value="2"><label for="Q10_1">はい</label> <input type="radio" name="Q10" id="Q10_2" value="0"><label for="Q10_2">いいえ</label> </ol> <center> <p><font size="+1" color="#FF0000"><b>採点!!</b></font></p> <input type="text" name="judge" value="0" SIZE="10"> <input type="button" value="採点する" onClick="calc(this.form)"> </p></center> </form> はいが2点、いいえが0点とします。 この記述方法だと、テキストボックスに点数の合計が記載されてしまいます。 別ページに点数の合計を呼び出したいのですが、どうすればいいのでしょうか。 ※ページの内容で中身が変わるわけではなく、点数の結果を表示したいです。 ※呼び出す際のコードも記載していただけたらありがたいです ※結果のページをkekka.htmlとします。 初心者なのでどうしたらいいのか分かりません。よろしくお願いします。

  • Javascriptの結果の出し方で困っています

    自分のサイトにチェッカーを入れたくて下記の記述を書きました。 <script> function calc(f){ var sum=0; for(var i=0;i<f.length;i++){ if(f[i].type=="radio" && f[i].checked) sum+=parseInt(f[i].value); } f.judge.value=sum; } </script> <form action="chekker/" method="post"> <ol> <li>aaaaaaaaaaaaa<br> <input type="radio" name="Q1" id="Q1_1" value="2"><label for="Q1_1">はい</label> <input type="radio" name="Q1" id="Q1_2" value="0"><label for="Q1_2">いいえ</label> <br><br> <li>aaaaaaaaaaaaa<br> <input type="radio" name="Q2" id="Q2_1" value="2"><label for="Q2_1">はい</label> <input type="radio" name="Q2" id="Q2_2" value="0"><label for="Q2_2">いいえ</label> <br><br> <li>aaaaaaaaaaaaa<br> <input type="radio" name="Q3" id="Q3_1" value="2"><label for="Q3_1">はい</label> <input type="radio" name="Q3" id="Q3_2" value="0"><label for="Q3_2">いいえ</label> <br><br> <li>aaaaaaaaaaaaa<br> <input type="radio" name="Q4" id="Q4_1" value="2"><label for="Q4_1">はい</label> <input type="radio" name="Q4" id="Q4_2" value="0"><label for="Q4_2">いいえ</label> <br><br> <li>aaaaaaaaaaaaa<br> <input type="radio" name="Q5" id="Q5_1" value="2"><label for="Q5_1">はい</label> <input type="radio" name="Q5" id="Q5_2" value="0"><label for="Q5_2">いいえ</label> <br><br> <li>aaaaaaaaaaaaa<br> <input type="radio" name="Q6" id="Q6_1" value="2"><label for="Q6_1">はい</label> <input type="radio" name="Q6" id="Q6_2" value="0"><label for="Q6_2">いいえ</label> <br><br> <li>aaaaaaaaaaaaa<br> <input type="radio" name="Q7" id="Q7_1" value="2"><label for="Q7_1">はい</label> <input type="radio" name="Q7" id="Q7_2" value="0"><label for="Q7_2">いいえ</label> <br><br> <li>aaaaaaaaaaaaa<br> <input type="radio" name="Q8" id="Q8_1" value="2"><label for="Q8_1">はい</label> <input type="radio" name="Q8" id="Q8_2" value="0"><label for="Q8_2">いいえ</label> <br><br> <li>aaaaaaaaaaaaa<br> <input type="radio" name="Q9" id="Q9_1" value="2"><label for="Q9_1">はい</label> <input type="radio" name="Q9" id="Q9_2" value="0"><label for="Q9_2">いいえ</label> <br><br> <li>aaaaaaaaaaaaa<br> <input type="radio" name="Q10" id="Q10_1" value="2"><label for="Q10_1">はい</label> <input type="radio" name="Q10" id="Q10_2" value="0"><label for="Q10_2">いいえ</label> </ol> <center> <p><font size="+1" color="#FF0000"><b>採点!!</b></font></p> <input type="text" name="judge" value="0" SIZE="10"> <input type="button" value="採点する" onClick="calc(this.form);window.open('kekka.html','windowname');"> </p></center> </form> はいが2点、いいえが0点とします。 この記述方法だと、テキストボックスに点数の合計が記載されてしまいます。 別ページのテキストボックス内に点数の合計を呼び出したいのですが、どうすればいいのでしょうか。 出来れば呼び出す際のソースコードなどもすべて記載していただけるとありがたいです。 ※ページの内容で中身が変わるわけではなく、点数の結果を表示したいです。 ※呼び出す際のコードも記載していただけたらありがたいです ※結果のページをkekka.htmlとします。 初心者なのでどうしたらいいのか分かりません。よろしくお願いします。

  • ラジオボタンを選択すると、他のラジオボタンの動きを制御したい

    radio1~radio3のいずれか「はい」を選択すると、 その他が強制的に「いいえ」に切り替わるスクリプトはどのように作成すればよろしいでしょうか? <INPUT TYPE=radio NAME="radio1" VALUE="1">はい <INPUT TYPE=radio NAME="radio1" VALUE="2">いいえ <INPUT TYPE=radio NAME="radio2" VALUE="1">はい <INPUT TYPE=radio NAME="radio2" VALUE="2">いいえ <INPUT TYPE=radio NAME="radio3" VALUE="1">はい <INPUT TYPE=radio NAME="radio3" VALUE="2">いいえ

  • 複数のラジオボタンのチェック

    複数のラジオボタンが全て選択されているかどうかのチェックのJavaScriptをすっきりした形で書くのは、どうしたらいいでしょうか? 下記のようですと、ダラダラと記述するようになってしまいます。 どなたかご教授ください。 --------------------------------------- <script type="text/javascript"> function insert_onClick() { j=0; for (i=0 ;i < document.F1.a11.length ; i++){ if (document.F1.a11[i].checked) { j=1; } } } </script> <form action="check.php" name="F1" onsubmit="return insert_onClick()"> 各valueは0~4まであります <input type="radio" name="a11" value="0"> <input type="radio" name="a12" value="0"> <input type="radio" name="a21" value="0"> <input type="radio" name="a22" value="0"> <input type="radio" name="b11" value="0"> <input type="radio" name="b12" value="0"> <input type="radio" name="b21" value="0"> <input type="radio" name="b22" value="0"> ---------------------------------------

  • ラジオボタンの選択で解答・点数を表示する

    10問のテストを作成しています。 (1)選択肢はラジオボタンで3択(正解は10点、その他0点) (2)採点をクリックすると、テキストボックスに○×の結果を出し、もう一つ別のテキストボックスに×の場合は正しし解答を表示 (3)アラートで「あなたの点数は~~点」と出す (4)FORM1.2のSCOREに点数を表示 以上のようにしたいと思い、下記のように作りました。 まだ初心者のため、長々と同じことを書くことしか分からないので、もっと簡単にまとめられる方法がありましたら、教えてください。 よろしくお願いいたします。 function dispscore() { var score=0; if (document.form1.q0[0].checked) { score += 10; document.form1.r0.value = "○"; } else{ document.form1.r0.value = "×"; document.form1.a0.value = "ナイル川"; } if (document.form1.q1[2].checked) { score += 10; document.form1.r1.value = "○"; } else{ document.form1.r1.value = "×"; document.form1.a1.value = "バチカン市国"; } alert("点数は " + score + " 点 です "); document.form1.score.value=score document.form2.score.value=score } ------------------------------------------------------------ <INPUT type=radio name="q1" value="10">ナイル川 <INPUT type=radio name="q1" value="0">ミシシッピー川 <INPUT type=radio name="q1 value="0">アマゾン川> <INPUT size="3" name="r1" type="text"> <INPUT size="25" name="a1" type="text"> <INPUT type=radio name="q2" value="0">バルカン市国 <INPUT type=radio name="q2" value="0">バルタン市国 <INPUT type=radio name="q2" value="10">バチカン市国 <INPUT size="3" name="r2" type="text"> <INPUT size="25" name="a2" type="text">

専門家に質問してみよう