OKWAVEのAI「あい」が美容・健康の悩みに最適な回答をご提案!
-PR-
解決
済み

必須項目のチェック

  • 困ってます
  • 質問No.176972
  • 閲覧数223
  • ありがとう数3
  • 気になる数0
  • 回答数5
  • コメント数0

お礼率 40% (2/5)

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


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

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

お力をお貸しください!よろしくお願いします。
通報する
  • 回答数5
  • 気になる
    質問をブックマークします。
    マイページでまとめて確認できます。

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

  • 回答No.5
レベル12

ベストアンサー率 75% (398/526)

> しかし、他の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

お礼率 40% (2/5)

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

設置もうまくいきました。
投稿日時 - 2001-11-30 17:49:15
-PR-
-PR-

その他の回答 (全4件)

  • 回答No.1
レベル12

ベストアンサー率 75% (398/526)

直接書いてはいけないのでしょうか? 【前提】 ・ラジオボタン:name=caller ・電話1:name=tel1  以降、2,3 ・フォーム内容を受け取るハッシュ:%FORM 【ソース】 print <<_HTML_; 電話1:$FORM{tel1}<BR> 電話2:$FORM{tel2}<BR> 電話3:$FORM{tel3}<BR> ...続きを読む
直接書いてはいけないのでしょうか?
【前提】
・ラジオボタン: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

お礼率 40% (2/5)

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

確認画面の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:30
  • 回答No.2
レベル11

ベストアンサー率 42% (103/245)

ハッシュ%FORMにデータが格納されていると仮定して… if ($FORM{'電話'} == 1) { if ($FORM{'電話1'} eq "" || $FORM{'電話2'} eq "" || $FORM{'電話3'} eq "") { ...続きを読む
ハッシュ%FORMにデータが格納されていると仮定して…

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

という感じでどうでしょう?
補足コメント
milk_tea22

お礼率 40% (2/5)

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

>ハッシュ%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:54
  • 回答No.3
レベル11

ベストアンサー率 42% (103/245)

下の投稿インデントが消えてしまっていますね。 読みにくくて申し訳ありません。 ...続きを読む
下の投稿インデントが消えてしまっていますね。
読みにくくて申し訳ありません。
お礼コメント
milk_tea22

お礼率 40% (2/5)

ありがとうございます。
設置もうまくいき、一安心です。
投稿日時 - 2001-11-30 17:50:28
  • 回答No.4
レベル12

ベストアンサー率 75% (398/526)

補足読みました。 なるほど、nameとvalueを、それぞれ別の配列に入れているのですね。 でしたら、次のようにされてはどうでしょうか。 my %LABEL = (caller=>'電話', tel1=>'電話1', tel2=>'電話2', tel3=>'電話3'); としておいて、表 ...続きを読む
補足読みました。
なるほど、nameとvalueを、それぞれ別の配列に入れているのですね。
でしたら、次のようにされてはどうでしょうか。

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

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

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

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

お礼率 40% (2/5)

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

leaz024さんがおっしゃるようにしたら、書き換えに成功しました。
しかし、他のnameは日本語なので、置きかえる必要がないのですが、
my %LABEL = ・・・・・
のように書き加えていかなければいけないのでしょうか?
投稿日時 - 2001-11-29 20:34:25
このQ&Aで解決しましたか?
関連するQ&A
-PR-
-PR-
こんな書き方もあるよ!この情報は知ってる?あなたの知識を教えて!
このQ&Aにはまだコメントがありません。
あなたの思ったこと、知っていることをここにコメントしてみましょう。

その他の関連するQ&A、テーマをキーワードで探す

キーワードでQ&A、テーマを検索する
-PR-
-PR-
-PR-

特集


いま みんなが気になるQ&A

関連するQ&A

-PR-

ピックアップ

-PR-
ページ先頭へ