CGI内で必須項目のチェックをしたいと思っています。


ラジオボタン(name=電話)が(value=1)を選択された時、
テキストエリア(name=電話1、name=電話2、name=電話3)
がすべて入力されていないとエラーが出るチェックをかけたいと思っています。

入力した後にでる確認画面で、nameを項目名として出しているのでnameを日本語につける必要がありました。
nameの指定を英字にしても良いのですが、チェックをかけた後、日本語に変換をかける方法がわからないのです。

お力をお貸しください!よろしくお願いします。

A 回答 (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値を半角英数に統一するのが完成への近道だと思いますよ?
    • good
    • 0
この回答へのお礼

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

設置もうまくいきました。

お礼日時:2001/11/30 17:49

補足読みました。


なるほど、nameとvalueを、それぞれ別の配列に入れているのですね。
でしたら、次のようにされてはどうでしょうか。

my %LABEL = (caller=>'電話', tel1=>'電話1', tel2=>'電話2', tel3=>'電話3');

としておいて、表示箇所を

<td width=\"150\" nowrap>$LABEL{$NAME[$_]}</td>

# nameに対する表示用文字列をハッシュに入れておくという方法です。
# 他にも表示されるname要素があったら、それに対する表示用文字列を設定して下さい。

この回答への補足

補足を読んでいただきありがとうございます。
説明が足りませんで、申し訳ないです。

leaz024さんがおっしゃるようにしたら、書き換えに成功しました。
しかし、他のnameは日本語なので、置きかえる必要がないのですが、
my %LABEL = ・・・・・
のように書き加えていかなければいけないのでしょうか?

補足日時:2001/11/29 20:34
    • good
    • 0

下の投稿インデントが消えてしまっていますね。


読みにくくて申し訳ありません。
    • good
    • 0
この回答へのお礼

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

お礼日時:2001/11/30 17:50

ハッシュ%FORMにデータが格納されていると仮定して…



if ($FORM{'電話'} == 1)
{
if ($FORM{'電話1'} eq "" || $FORM{'電話2'} eq "" || $FORM{'電話3'} eq "")
{
エラー処理
}
}

という感じでどうでしょう?

この回答への補足

お答えありがとうございます。

>ハッシュ%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); }
    }
 }
}


長々とすいません。
宜しくお願いいたします。

補足日時:2001/11/29 20:13
    • good
    • 0

直接書いてはいけないのでしょうか?


【前提】
・ラジオボタン:name=caller
・電話1:name=tel1  以降、2,3
・フォーム内容を受け取るハッシュ:%FORM
【ソース】
print <<_HTML_;
電話1:$FORM{tel1}<BR>
電話2:$FORM{tel2}<BR>
電話3:$FORM{tel3}<BR>
_HTML_

# そもそも「nameを項目名として出している」というのが、よく分かりませんが。。

何か聞きたいことと違っていたら、補足下さい。

この回答への補足

お答え頂きありがとうございます。

確認画面の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;

分かりづらい書き方ですみません。

補足日時:2001/11/29 19:37
    • good
    • 0

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


このカテゴリの人気Q&Aランキング

おすすめ情報

カテゴリ