- ベストアンサー
CGIでラジオボタンの選択結果を保持する方法
- CGIでラジオボタンの選択結果を保持する方法について説明します。具体的には、質問文章で複数の質問とラジオボタンがあり、それぞれの選択結果に応じて最終ページで表示を変えたい場合の方法について考えます。
- まず、一つ前のページで選択した結果を次のページに反映させる方法は、<input type='hidden'>を使用することです。質問ページで選択した値を<hidden>タグで次のページに送信し、次のページで受け取った値を表示させることができます。
- しかし、複数のページを経由して選択結果を保持し、最終ページで表示する場合は、より複雑なロジックが必要になります。例えば、質問によっては次のページが異なる場合や、複数の質問に対して条件分岐する必要がある場合などが考えられます。
- みんなの回答 (12)
- 専門家の回答
質問者が選んだベストアンサー
ちょっと手を加えてみた。 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>
その他の回答 (11)
- ORUKA1951
- ベストアンサー率45% (5062/11036)
というより、 ⇒CGIで得た内容をHTMlページに代入 - CGI - 教えて!goo( http://okwave.jp/qa/q8217674.html ) ですね。 送られてきたデータは、それがhiddenだろうがradioだろうが、全く区別はありませんから、そのまま得られたデータを、 $FORM{$name}=$value; $hidden .= "<input type=\"hidden\" name=\"$name\" value=\"$value\">"; とでもして代入しておけば、良いですよ。 上記では、60から70行目あたりで $HIDDEN .="<input type=\"hidden\" name=\"Q2\" value=\"$FORM{'Q2'}\"><input type=\"hidden\" name=\"Q1\" value=\"$FORM{'Q1'}\">"; としていますが、それも同様のことをしています。
お礼
ありがとうございます!重複した質問をしてしまって申し訳ありません。 CGIの初心者でよくわかっていないのですが いただいたコードはページは飛ばず、ひとつのページ内に いくつか質問が表示されているものなのかな?と思いました。 (違ってたらすみません) 以下の点について質問させてください。 Q1ページに「次へ」ボタンを設置しQ2へ飛ぶようにしています。 Q2ページでQ1の回答を表示させることはできたのですが、 その後Q2ページからQ3ページに飛んだとき、 Q3ページにQ1ページの回答を表示させることができませんでした。 Q2,Q3ページのCGIは以下のように書きました。 (目で見てデータが飛んでるかわかるように <input type="hidden"でなく<input type="text"を使いました。) print <<Q2; <html> <head> <title></title> </head> <body> ・・・ <input type="text" name="q11a" value="$q11" />★ <input type="text" name="q12a" value="$q12" />★ ・・・ </body> </html> Q2 ↑★部分には、Q1で選択した回答が表示されました。 print <<Q3; <html> <head> <title></title> </head> <body> ・・・ <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" />★ ・・・ </body> </html> Q3 ↑★部分には、Q2で選択した回答が表示されましたが ☆部分は空欄のままでした。 どのようにしたら前の前のページの回答が表示されますか? 引き続きお願いいたします!
- 1
- 2
お礼
すみません・・・最上部のお礼の補足の補足です。 「文字化けして」と書きましたが 正確には 「chromeだと文字化けして、IEとFirefoxでは文字化けせずにそのまま」 でした。 あせってお礼してしまったためすみません。 よろしくお願いいたします!