アプリ版:「スタンプのみでお礼する」機能のリリースについて

チェックボックスで複数回答があった場合のデータの受け取りをどうしても分からないので教えてください。
別の人が作った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つチェックされた場合の値の取出しを可能にする。

A 回答 (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
    • good
    • 0

※ 二つ以上チェックを入れてはいけないのでしたら、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__
    • good
    • 0

(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;
    • good
    • 0
この回答へのお礼

すいません。やってみましたが #!/usr/local/bin/perl~exit;
まで、CGIに丸ごと入れたら、チェックボックスが表示されたCGIが出たんですが・・・。
私の説明が悪く申し訳ありません。

流れは、HTMLで作ったチェックボックスにチェックを入れて「確認」を押すと、入力した内容の「確認画面」が表示され、その「確認画面」にある「送信」ボタンを押して送信実行となるようにしようと思います。

困っているのはHTMLでチェックした複数のvalue値を、CGIの「確認画面」でどのよにして受け取ればいいのでしょうか?Javascriptは解決できました。ただJavascriptの記述上やはりnameは同じで出来る方法を希望します。今一度、よろしくお願いいたします。

お礼日時:2005/03/04 14:40

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!