- ベストアンサー
チェックボックスのCGIへの値の受け渡し方
チェックボックスで複数回答があった場合のデータの受け取りをどうしても分からないので教えてください。 別の人が作ったCGIを改造(今回の複数回答可の部分を)しています。以下のような記述だとvalue値が取れず、空白になっています。 【HTML】(チェックを2つ以上出来ないようにするためにJavascriptで制限をかけています。nameを同じにするやり方にしています。) <INPUT type="checkbox" name="q1" value="赤" onclick="return limitation(this,2)">赤<br> <INPUT type="checkbox" name="q1" value="黄" onclick="return limitation(this,2)">黄<br> <INPUT type="checkbox" name="q1" value="青" onclick="return limitation(this,2)">青<br> 【CGI】 use CGI qw(:standard); @check1=param("q1"); $result1=join(',',@check1); print "<td width=300><font size=2>$result1</font> </td>\n"; このPerlは@check1にq1のチェックが付いたものが格納されていると認識しています。では、どうしたらそれをとりだせるのでしょうか?初心者で申し訳ありません。やり方にこだわらず、今回の目標は (1)チェックボックスに規定(2つ)以上のチェックが入るとアラートでチェックしすぎた瞬間に知らせてくれる (2)2つチェックされた場合の値の取出しを可能にする。
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
説明が悪かったかな。 先ほど表記したのは同じcheckboxの場合の受け取り方のテストスクリプトです。 受け取った配列をHIDDENで渡せば問題ありません。 ただ、私のほうでCGI.pmを使用したものをテストしたところ同じnameを使った場合は渡された文字列が連結されてしまうみたいです。 以下テスト用 #!/usr/local/bin/perl use CGI; $query = CGI->new; $on = $query->param('on'); @params = $query->param(); print "Content-type: text/html\n\n"; print "<HTML>\n"; print "<HEAD><TITLE>test</TITLE></HEAD>\n"; print <<HTML; <form action="chk.cgi" method="POST"> <input type="checkbox" name="q1" value="RED">RED<br> <input type="checkbox" name="q1" value="BLUE">BLUE<br> <input type="checkbox" name="q1" value="YELLOW">YELLOW<br> <input type="submit" name="on" value="TEST"> </form> HTML if ($on) { print "<p>変数result1: $result1</p>\n"; print "<p>配列q1<br>\n"; foreach $q1 (@check1) { print "$q1<br>\n"; } foreach $param (@params) { print $param, ":\t", $query->param($param), "<br>\n"; } } print "</BODY>\n"; print "</HTML>\n"; exit; 以上でテストした結果: q1: REDBLUEYELLOW on: TEST
その他の回答 (2)
- steel_gray
- ベストアンサー率66% (1052/1578)
※ 二つ以上チェックを入れてはいけないのでしたら、checkboxを使わずに、radioボタンにするのが普通だと思うです。 値の取り出し方というか、取り出して確認画面のフォーム(checkbox)にチェックを入れたいということでしょうか? べたべたに判定、設定するぐらいしか思いつきません。 ↓多少省いていますが。 my @check1=param("q1"); my ($c,$checked_red,$checked_yellow,$checked_blue); for $c (@check1) { $checked_red = 'checked' if($c eq '赤'); $checked_yellow = 'checked' if($c eq '黄'); $checked_blue = 'checked' if($c eq '青'); } print <<__FORM__; <input type="checkbox" name="q1" value="赤" $checked_red> <input type="checkbox" name="q1" value="黄" $checked_yellow> <input type="checkbox" name="q1" value="青" $checked_blue> __FORM__
- moon_night
- ベストアンサー率32% (598/1831)
(1)はJavascriptでやってください。 (2)はuse CGI qw(:standard);を使ったことがないので違う方法で。。。 #!/usr/local/bin/perl # データデコード処理 if ($ENV{'REQUEST_METHOD'} eq "POST") { read(STDIN, $buffer, $ENV{'CONTENT_LENGTH'}); } else { $buffer = $ENV{'QUERY_STRING'}; } @pairs = split(/&/,$buffer); foreach $pair (@pairs) { ($name,$value) = split(/=/, $pair); $value =~ tr/+/ /; $value =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg; $value =~ s/\n//g; if ($name eq "q1") { push (@check1,$value); } #フォーム変数へ $F{$name} = $value; } print "Content-type: text/html\n\n"; print "<HTML>\n"; print "<HEAD><TITLE>test</TITLE></HEAD>\n"; print <<HTML; <form action="chk2.cgi" method="POST"> <input type="checkbox" name="q1" value="RED">RED<br> <input type="checkbox" name="q1" value="BLUE">BLUE<br> <input type="checkbox" name="q1" value="YELLOW">YELLOW<br> <input type="submit" name="on" value="TEST"> </form> HTML if ($F{'on'}) { print "<p>変数q1: $F{'q1'}</p>\n"; print "<p>配列q1<br>\n"; foreach $q1 (@check1) { print "$q1<br>\n"; } } print "</BODY>\n"; print "</HTML>\n"; exit;
お礼
すいません。やってみましたが #!/usr/local/bin/perl~exit; まで、CGIに丸ごと入れたら、チェックボックスが表示されたCGIが出たんですが・・・。 私の説明が悪く申し訳ありません。 流れは、HTMLで作ったチェックボックスにチェックを入れて「確認」を押すと、入力した内容の「確認画面」が表示され、その「確認画面」にある「送信」ボタンを押して送信実行となるようにしようと思います。 困っているのはHTMLでチェックした複数のvalue値を、CGIの「確認画面」でどのよにして受け取ればいいのでしょうか?Javascriptは解決できました。ただJavascriptの記述上やはりnameは同じで出来る方法を希望します。今一度、よろしくお願いいたします。