- ベストアンサー
チェックボックスの値だけが受信できません
フォームメールのチェックボックスで、ユーザーの選択した値が受信メールに反映されず、困っています。 アドバイスを宜しくお願い致します。 ■HTML(抜粋) <input type=checkbox name=color value="赤">赤 <input type=checkbox name=color value="青">青 <input type=checkbox name=color value="白">白 ■CGI(抜粋) # 連想配列に格納 &ReadParse(*data); $color = $data{'color'}; # sendmail open(MAIL, "| $sendmail -t"); $mail .= "好きな色=$color\n"; # まとめて日本語変換 &jcode'convert(*mail,'jis'); # メール送信 print MAIL $mail; 上記のように記述してメールを受信すると、 好きな色= と、肝心の値の部分が空欄になってしまいます。 チェックボックス以外のテキスト入力やラジオボタンの値はメールにもちゃんと反映されています。 同じ内容のフォームメールをFLASHでも作りましたが、FLASHの方ではチェックボックスの値も全て表示できました。 好きな色=赤,白 なぜHTMLの方だけ値を拾えないのでしょうか? HTMLのnameをcolorという同じグループ(?)でくくっているからでしょうか? 送信後の処理以外はFLASHのCGIスクリプトと同じものなのですが・・・。 希望としては、チェックボックスで複数選択した値をカンマでつなげたまま受信したいと思っています。 CGIの勉強は始めたばかりなので、もしかしたらとても初歩的なところでつまづいているのかもしれませんが、アドバイスをどうぞ宜しくお願いいたします。
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
複数チェックを付けている場合、更に結果をデコードする必要があるみたいです。
その他の回答 (2)
- noocyte
- ベストアンサー率58% (171/291)
以前私が実験したブラウザ (どれだったか忘れた) では, 送信される HTTP リクエストパラメータは次のようになりました. ・ON のチェックボックスの name の値だけが送信される. OFF のものは送信されない. ・value の値は送信されない. 例えば, <input type=checkbox name=check1 value="First">First <input type=checkbox name=check2 value="Second">Second で,First=OFF,Second=ON だと,送信されるのは check2= だけでした.ご質問のケースでも,そうなっている可能性があります. ReadParse する前の $data を表示させてみて確認してください. もしそうであれば,対策は次のとおり. ・チェックボックスごとに異なる名前を付ける. ・CGI 側でチェックボックスの name を value に変換する.
お礼
noocyteさま ご回答どうもありがとうございました。 ブラウザによっても結果が異なるんですね。 チェックボックスごとに異なる名前を付ける方法も試しましたが、メールの受信結果を 好きな色=赤,白 としたかったので諦めていました。 カンマで値をつなぎたかったのですが、ヌル文字でのつなぎ表示はできるようになりました。 別途補足の方に書かせてもらいますね。 どうもありがとうございました。
補足
ご回答下さった先輩方、どうもありがとうございました。 ご紹介いただい方法を試してみたかったのですが、難しかったので勉強してから、と思い下記の方法を先に試してみました。 &ReadParse(*data); my $color = $data{'color'}; my @color = &SplitParam($color); メールの受信結果は、 好きな色=赤 白 と、各要素を取り出せるようになりました。 できれば値をカンマでつないだものを表示したかったのですが・・・。 引き続き、カンマで値をつなぐ方法を教えていただけませんでしょうか。 どうぞ宜しくお願いいたします。
- pipipi523
- ベストアンサー率40% (148/365)
ReadParseの中が間違っているのでは? sub ReadParse{ my($data)=@_; my($query_string, $x, $name, $value); if ($ENV{'REQUEST_METHOD'} ne "POST") { $query_string=$ENV{'QUERY_STRING'}; }else{ read(STDIN, $query_string, $ENV{'CONTENT_LENGTH'}); } foreach $x (split(/&/, $query_string)) { ($name, $value) = split(/=/, $x); $value =~ tr/+/ /; $value =~ s/%([0-9a-fA-F][0-9a-fA-F])/pack("C", hex($1))/eg; $$data{$name} .= "," if($$data{$name} ne ""); $$data{$name} .= $value; } } これでどうでしょう?
お礼
pipipi523さま ご回答どうもありがとうございました。 ご教示いただいた方法は難しそうだったので、勉強してみます! CGIっていろいろな方法があるんですね。 入門書は買ったのですが、ほんとに簡単なものだったので、明日にでも本屋さんに行ってきます。 どうもありがとうございました。
お礼
plantarumさま ご回答どうもありがとうございまいした。 ご紹介いただいたサイトも拝見してきました。 cgi-lib.plの\0をカンマに置き換えることができるみたいなので、そちらも試してみます。 どうもありがとうございました。
補足
ご回答くださった皆様、どうもありがとうございました。 &ReadParse(*data); $color = $data{'color'}; $color =~ s/\0/,/g; 上記のように、半角スペースをカンマに置換するだけで希望のかたちになりました。 依然としてFLASHの方の結果には疑問が残りますが、そちらも勉強してみます。 どうもありがとうございました。