電子書籍の厳選無料作品が豊富!

 <input type="checkbox" name="id" value="0">
 <input type="checkbox" name="id" value="1">
 <input type="checkbox" name="id" value="2">
 <input type="checkbox" name="id" value="3">
のようなフォームのキーと値を、CGIの方では%inで受け取ります。

まずCGIモジュールを用いてキーと値を$keyと$valに格納したのち、idというキーは4つの値を受け取るので、

 foreach my $key ($q->param()) {
  my $val=$q->param($val);
  if(defined($in{$key)) {
   $in{$key}.="\0";
  }
  $in{$key}.=$val;
 }

私のイメージでは、この処理で
 $in{'id'}="0\01\02\03";
が得られるつもりでした。

ところが実際には$q->param('id')で取り出せるのは最初の"0"のみで、したがって得られる結果は
 $in{'id'}="0";
となります。

CGIモジュールを使わなければ、
 my $buf;
 if(ENV{'REQUEST_METHOD'} eq "POST") {
  read(STDIN,$buf,$ENV{'CONTENT-LENGTH'});
 }
 else {
  $buf=$ENV{'QUERY_STRING'};
 }
 
 foreach(split(/&/,$buf)) {
  my ($key,$val)=split(/=/);
  
  if(defined($in{$key)) {
   $in{$key}.="\0";
  }
  $in{$key}.=$val;
 }
のようにして、イメージ通り
 $in{'id'}="0\01\02\03";
を得られますが、CGIモジュールは他でも使うので、どうせならCGIモジュールを使った簡便なコーディングが出来ないものかと思案する次第です。

しかしながら私に思いつく方法は
 <input type="checkbox" name="id0" value="0">
 <input type="checkbox" name="id1" value="1">
 <input type="checkbox" name="id2" value="2">
 <input type="checkbox" name="id3" value="3">
として、まずCGIモジュールを用いた上記の方法で$in{'id0'}~$in{'id3'}までを生成し、次に
 if(/(\w+)\d/) {
  if(defined($in{$1})) {
   $in{$1}.="\0";
  }
  $in{$1}.=$val;
 }

とやる方法しか思いつきません。

チェックボックスを用いて複数回答を得るというのはよくある話なので、CGIモジュールにもっと良いコーディングの仕方がありそうな・・・と思ってしまうのですが、これが最善の方法なのでしょうか?

A 回答 (1件)

同じ名前のキー名を使う場合は、param の結果を配列に入れてください。



@values = $q->param('id');
など
    • good
    • 0
この回答へのお礼

ありがとうございます。

うまく複数回答を受け取ることが出来ました。

お礼日時:2009/10/19 15:40

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