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


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

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

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

このQ&Aに関連する最新のQ&A

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と関連する良く見られている質問

Qタグの中のname, value値の取得

ある文字列中に次のほぼ同値なinputタグ、
1:<input type="text" name="A" value="B">
2:<input type='text' name='A' value='B'>
3:<input type=text name=A value=B>

がある場合、この中からtext, A, B を抽出しようと思っています.
(さらに、1,2のA, B に半角スペースが含まれる場合も考慮)

自分なりの方法の概略は、
$_ = $str;
~ /(<input[^>]*?>)/;
$tag = $1;

として、<input・・・>を得て、

$tag =~ /name=[\"']{0,1}([^\"']*?)[\"']{0,1}[\s\t>]/i
$name = $1;

$tag =~ /value=[\"']{0,1}([^\"']*?)[\"']{0,1}[\s\t>]/i
$value = $1;

としていたのですが、nameとvalue値が\sを含む場合や、<input>タグの中の"と"の間に > が含まれる場合に正しく動作しません。
何いい方法はないでしょうか.

ある文字列中に次のほぼ同値なinputタグ、
1:<input type="text" name="A" value="B">
2:<input type='text' name='A' value='B'>
3:<input type=text name=A value=B>

がある場合、この中からtext, A, B を抽出しようと思っています.
(さらに、1,2のA, B に半角スペースが含まれる場合も考慮)

自分なりの方法の概略は、
$_ = $str;
~ /(<input[^>]*?>)/;
$tag = $1;

として、<input・・・>を得て、

$tag =~ /name=[\"']{0,1}([^\"']*?)[\"']{0,1}[\s\t>]/i
$name = $1;

$tag =...続きを読む

Aベストアンサー

正規表現だと面倒そうだし、応用も利くのでHTMLを解析するモジュールを使ってみては?

以下、ちょっと長いけど例。

my $str = <<HTMLDATA;
<input type="text" name="A" value="B">
<input type='text' name='A' value='B'>
<input type=text name=A value=B>
HTMLDATA

use HTML::Parser();
my $parser = HTML::Parser->new(
api_version => 3,
start_h => [\&startTag, "tagname,attr"],
);
$parser->parse( $str );
$parser->eof;
exit;

sub startTag {
my($tagname,$attr) = @_;
if($tagname eq 'input') {
print 'name="',$attr->{name},'" value="',$attr->{value},"\"\n";
}
}

参考URL:http://homepage3.nifty.com/hippo2000/perltips/html/Parser.htm

正規表現だと面倒そうだし、応用も利くのでHTMLを解析するモジュールを使ってみては?

以下、ちょっと長いけど例。

my $str = <<HTMLDATA;
<input type="text" name="A" value="B">
<input type='text' name='A' value='B'>
<input type=text name=A value=B>
HTMLDATA

use HTML::Parser();
my $parser = HTML::Parser->new(
api_version => 3,
start_h => [\&startTag, "tagname,attr"],
);
$parser->parse( $str );
$parser->eof;
exit;

sub startTag {
my($tagname,$attr) = @_;
if(...続きを読む

Qチェックボックスのvalue値の取得について

過去の質問にいくつか似たようなものはあったのですが、解決出来ませんでしたので質問させて頂きます。cgiでページを作成しています。今回処理したい内容は、一覧表の複数のチェックボックスから、オンになっているvalue値を取得し、その値に一致するナンバーを使って別のファイルのデータを削除するといった処理です。

== html一部内容 ==
<form action='update.cgi' method='POST'>
<input type='checkbox' name='del_0' value='0'>
<input type='checkbox' name='del_1' value='1'>
<input type='checkbox' name='del_2' value='2'>
<input type='submit' name='submit' value='削除'>
</form>

== update.cgiの一部内容 ==
for($loop=2,$loop>=0,$loop--)
{
$del[$loop]=$in{'del_$loop'};
}
データ数が多いのでループさせてすべてのチェックボックスのvalue値を取得したいと思っています。チェックボックスがオフの場合の扱いがいまいち分かっていません。一つずつ例えば
$del_1=$in{'del_1'};
と代入していくとonのもののみ取得できます。しかしループにするとonの値も変数に入りません。
どんな方法でも良いので、すっきりとチェックボックスのvalue値を変数に取得する方法を教えてください。お願い致します。M(v_v)M

過去の質問にいくつか似たようなものはあったのですが、解決出来ませんでしたので質問させて頂きます。cgiでページを作成しています。今回処理したい内容は、一覧表の複数のチェックボックスから、オンになっているvalue値を取得し、その値に一致するナンバーを使って別のファイルのデータを削除するといった処理です。

== html一部内容 ==
<form action='update.cgi' method='POST'>
<input type='checkbox' name='del_0' value='0'>
<input type='checkbox' name='del_1' value='1'>
<input type='...続きを読む

Aベストアンサー

>ご指摘の方法ですと、チェックボックスのvalue値ではなくそのまま0,1,2が代入されてという感じになるような気がするのですが・・・

テスト用に代入しているだけです。
説明不足ですいません。
私が言いたかったのは「$in{'del_$loop'}」では「$loop」の変数が展開されずにただの文字列として扱われてしまう点です。
シングルクォーテーションではなくてダブルクォーテーションでないとまずいということです。

Q入力項目を検索項目に反映させたいのですが

CGI初心者です。もともと他のプログラムも組んだ経験がないので、テキストも何冊か購入したのですが、いまいちわかりません。
いま、データベース検索のものを作成(カスタマイズ)しているのですが、入力項目で入力したものを、検索する項目(プルダウンメニューにしたいのです)に反映させるには、どういうふうに作成したらいいのでしょうか?
なにか、ヒントでかまわないので教えてください。
例えば、参加型作品のなかで、作者を記入したら、検索項目にその作者が表示されてひとつの検索絞り込みのキーにしたいのです。
よろしくおねがいします。

Aベストアンサー

 いまのboriさんは希望のCGIに対して自分の能力が空回りしている状態なので、もうちょっと細かいプログラム設計をした方がいいですね(^_^;
 たとえば、「A」というプログラムを完成させるためには、「1」「2」「3」という3つの段階を踏まなければならない。
 「1」をやるためには、どういうプログラミングをすればいい、ということを本を読んで1つ1つ調べていくのです。
 とりあえず、手持ちの本の中から1冊選んで、そこに掲載されているプログラムをみんな入力して実行してみてください(このとき、プログラムは手入力しないと勉強になりません)。
 それをやれば、Perl というものがどんなもので、いったいどういうことが出来るのか、といったことが分かってくると思います。

Q入力された日付けのチェック

ユーザが入力した日付けデータをチェックする
方法をしりたいのですが。

例えば、「2/31」 はNGにする。など

Aベストアンサー

 一発でポンとやってくれるような機能はないので、日付けを年、月、日に分解し、1つ1つ比較する方法が一番でしょう。
 月が1~12の間にあるか、1月なら日が1~31の間にあるか、2月なら1~28の間にあるか(このとき、年がうるう年なら29にする)などの処理をするプログラムを組むわけです。

 配列に月の最終日を入れておけば比較的容易に判定できます。

Q正規表現を使った入力値のチェック

こんにちは、yukimura1024です。

perlでブラウザのフォームに入力された値をチェックしたいのですが、
入力された値が「全角文字のみか」と「全角カタカナのみか」
という2種類のチェックのしかたがわかりません。

「数値のみか」のチェックは正規表現を使ってできたのですが、
これと同じように正規表現を使って、この2つの全角チェックをする
方法はないでしょうか?

数値チェックは以下の方法でやっています↓

if ($str_txt_yuubin =~ /[^0-9]/) {
print "「郵便番号」を半角数字で入力してください。<br>\n";
}

ご存知の方がいましたら教えていただけると助かります。
よろしくお願い致します。

Aベストアンサー

sjisならこんな感じでどですか
/^(?:[\x81-\x9f\xe0-\xfc][\x40-\x7e\x80-\xfc])+$/ #全角文字のみ
/^(?:\x83[\x40-\x96])+$/ # 全角カタカナのみ


おすすめ情報