• ベストアンサー

必須項目のチェック

CGI内で必須項目のチェックをしたいと思っています。 ラジオボタン(name=電話)が(value=1)を選択された時、 テキストエリア(name=電話1、name=電話2、name=電話3) がすべて入力されていないとエラーが出るチェックをかけたいと思っています。 入力した後にでる確認画面で、nameを項目名として出しているのでnameを日本語につける必要がありました。 nameの指定を英字にしても良いのですが、チェックをかけた後、日本語に変換をかける方法がわからないのです。 お力をお貸しください!よろしくお願いします。

質問者が選んだベストアンサー

  • ベストアンサー
  • leaz024
  • ベストアンサー率75% (398/526)
回答No.5

> しかし、他のnameは日本語なので、置きかえる必要がないのですが ええとですね、そもそもnameに日本語を指定すること自体、普通はしないんですよ。日本語は何かと面倒が多いので、通常は半角英数を使用します。 No.2の補足も読みましたが、デコードルーチンがちょっと特殊なんですね。私やyuizuianさんが言っている「%FORMにデータが入っている」というのは、次のような一般的なデコードルーチンを使用している場合の話です。 foreach $pair (@pairs) {   my ($key,$val) = split(/=/,$pair);   $val =~ tr/+/ /;   $val =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C",hex($1))/eg;   $val =~ s/</</g;    # ここから下は、必要に応じて書く   $val =~ s/>/>/g;   $val =~ s/\"/"/g;   $FORM{$key} = $val; } これなら、HTML内の <INPUT type="text" name="tel1"> の値は、$FORM{tel1} とすれば読み出せます。(No.1の私の回答も、No.2のyuizuianさんの回答も、これを前提としているのです。) nameとvalueを別の配列に入れてしまっては、欲しいデータをすぐに取り出すことができないですよね。(何番目にどのデータが入っているのか確定しているなら別ですが。)このまま複雑なプログラムを書くのは大変苦しいと思います。 デコードルーチンの差し替えと、name値を半角英数に統一するのが完成への近道だと思いますよ?

milk_tea22
質問者

お礼

何度もお答えいただいて、ありがとうございました。 とても勉強になり感謝いたしております。 設置もうまくいきました。

その他の回答 (4)

  • leaz024
  • ベストアンサー率75% (398/526)
回答No.4

補足読みました。 なるほど、nameとvalueを、それぞれ別の配列に入れているのですね。 でしたら、次のようにされてはどうでしょうか。 my %LABEL = (caller=>'電話', tel1=>'電話1', tel2=>'電話2', tel3=>'電話3'); としておいて、表示箇所を <td width=\"150\" nowrap>$LABEL{$NAME[$_]}</td> # nameに対する表示用文字列をハッシュに入れておくという方法です。 # 他にも表示されるname要素があったら、それに対する表示用文字列を設定して下さい。

milk_tea22
質問者

補足

補足を読んでいただきありがとうございます。 説明が足りませんで、申し訳ないです。 leaz024さんがおっしゃるようにしたら、書き換えに成功しました。 しかし、他のnameは日本語なので、置きかえる必要がないのですが、 my %LABEL = ・・・・・ のように書き加えていかなければいけないのでしょうか?

  • yuizuian
  • ベストアンサー率42% (103/245)
回答No.3

下の投稿インデントが消えてしまっていますね。 読みにくくて申し訳ありません。

milk_tea22
質問者

お礼

ありがとうございます。 設置もうまくいき、一安心です。

  • yuizuian
  • ベストアンサー率42% (103/245)
回答No.2

ハッシュ%FORMにデータが格納されていると仮定して… if ($FORM{'電話'} == 1) { if ($FORM{'電話1'} eq "" || $FORM{'電話2'} eq "" || $FORM{'電話3'} eq "") { エラー処理 } } という感じでどうでしょう?

milk_tea22
質問者

補足

お答えありがとうございます。 >ハッシュ%FORMにデータが格納されていると仮定 $in{$FORM} = $value;と記述すれば良いのでしょうか? 記入しているのですが、チェックにひっかからないのです。 チェック前に下記のように書いてある所があります。 ここでデータを格納しているのですよね? ______________ foreach $pair (@pairs) { ($name, $value) = split(/=/, $pair); $name =~ tr/+/ /; $name =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg; $value =~ tr/+/ /; $value =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg; &jcode'convert(*name,'sjis'); &jcode'convert(*value,'sjis'); } else { $name =~ s/</&lt;/g; $name =~ s/>/&gt;/g; $name =~ s/"/&quot;/g; $name =~ s/\t//g; $name =~ s/=/&eq;/g; $value =~ s/</&lt;/g; $value =~ s/>/&gt;/g; $value =~ s/"/&quot;/g; $value =~ s/\t//g; $value =~ s/=/&eq;/g; push(@NAME,$name); push(@VALUE,$value); ↓のエラーチェックにつづく ちなみに、他のチェック項目はこうなっています。 関係ないかもしれませんが… ↓ foreach $buff (@CHECK) {  if ($buff eq $name) {    if ($name eq '名前') {     if ($value eq '') { &error(bad_01); }     }    elsif ($name eq '住所') {     if ($value eq '') { &error(bad_01); }     }  } } 長々とすいません。 宜しくお願いいたします。

  • leaz024
  • ベストアンサー率75% (398/526)
回答No.1

直接書いてはいけないのでしょうか? 【前提】 ・ラジオボタン:name=caller ・電話1:name=tel1  以降、2,3 ・フォーム内容を受け取るハッシュ:%FORM 【ソース】 print <<_HTML_; 電話1:$FORM{tel1}<BR> 電話2:$FORM{tel2}<BR> 電話3:$FORM{tel3}<BR> _HTML_ # そもそも「nameを項目名として出している」というのが、よく分かりませんが。。 何か聞きたいことと違っていたら、補足下さい。

milk_tea22
質問者

補足

お答え頂きありがとうございます。 確認画面のHTMLソースを下記のようにしているので 電話だけ直接書くようにする方法がわからないのです。 HTML_WRITE foreach (0..$count-2) { if ($VALUE[$_] ne '') { print "<tr><input type=hidden name=\"$NAME[$_]\" value=\"$VALUE[$_]\"><td width=\"150\" nowrap>$NAME[$_]</td>\n"; $VALUE[$_] =~ s/\r/<br>/g; print "<td>$VALUE[$_]</td></tr>\n"; } } print <<HTML_WRITE; 分かりづらい書き方ですみません。

関連するQ&A