フォームの書式設定に関する質問|入力規則をまとめて定義する方法は?

このQ&Aのポイント
  • cgi/perlを使用してフォームを作成しています。フォームの一部に製品入力欄を設けており、一度の登録申請で10個分の製品が登録可能です。ただし、製品ごとに販売先や販売日などの詳細項目を入力する必要があります。
  • 現在、販売日の書式を「yyyy/mm/dd」で入力しないとエラーが発生するように設定しています。ただし、10個の製品全てに対して同じ書式チェックを記述すると、コードが冗長になります。
  • 製品は最低1つの入力が必須であり、それ以外は任意となっています。入力がある場合にのみ書式チェックを行いたい場合、どのように記述すれば良いでしょうか。
回答を見る
  • ベストアンサー

入力規則をまとめて定義

お世話になります。 cgi/perlを使用してフォームを作成しています。 フォームの一部に製品入力欄を設けており、 一度の登録申請で1-10まで10個分製品が登録可能です。 それぞれの製品に、販売先、販売日など詳細項目を入力するようになっています。 同じ部分で別の問題も抱えているのですが、 今回は書式設定についてうかがわせてください。 上記販売日をyyyy/mm/ddの書式で入力しないとエラーを返すように以下のように記述しました。 if (($form{'kounyuu_01'} !~ /[\d\d\d\d]+\/[\d\d]+\/[\d\d]/){ &error('販売日の書式が間違っています。'); } ただこれを10個分書くと01,02,03と末尾を変えただけの記述を何度もしなくてはならず、cgiが長くなってしまうため、まとめて定義したいと考えました。 そこで以下のようにしてみたのですが、 1つ目の製品以外の販売日が入力されていないと上記「'販売日の書式が間違っています。'」のエラーが返ってきてしまいます。 if (($form{'kounyuu_01'} !~ /[\d\d\d\d]+\/[\d\d]+\/[\d\d]/) | ($form{'kounyuu_02'} !~ /[\d\d\d\d]+\/[\d\d]+\/[\d\d]/) | ($form{'kounyuu_03'} !~ /[\d\d\d\d]+\/[\d\d]+\/[\d\d]/) | ($form{'kounyuu_04'} !~ /[\d\d\d\d]+\/[\d\d]+\/[\d\d]/) ....) { &error('移管日の書式が間違っています。'); } 製品は最低1つの入力は必須ですが、それ以外は任意なので、 入力があった場合だけ書式をチェックするようにしたいのですがこの場合はどのようにすれば良いのでしょうか。 説明が悪くて申し訳ないですがアドバイスをお願い致します。m(__)m

  • CGI
  • 回答数2
  • ありがとう数2

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

  • ベストアンサー
  • Ethersky
  • ベストアンサー率71% (168/235)
回答No.2

別の一例をば。 ところで、日付のチェックを厳格に行うなら先頭と最後も指定してやりましょう。 このままだと、 a2006/02/06b とか 2006/02/060 なんてのも"マッチ"するので書式が違うとはなりません。 そこで、^ で先頭 $ で後方を指定します。 $n = 0; for(1..10){ $i = sprintf("%02d",$_); if($form{'kounyuu_'.$i} ne ""){ $n++; if($form{'kounyuu_'.$i} !~ /^\d{4}\/\d{2}\/\d{2}$/){ &error('販売日の書式が間違っています。'); } } } if(!$n){&error('最低一つ、販売日の入力が必要です。');}

Karin2006Karin
質問者

お礼

Etherskyさん、 ありがとうございます。こんなにも短い記述で同じ指示ができるんですね! 他の必須項目なども直したくなってきました。。(^^; 今回は入力項目が非常に多いのでEtherskyさんの書き方を流用させていただく事にしました。 ありがとうございました。

その他の回答 (1)

  • galluda
  • ベストアンサー率35% (440/1242)
回答No.1

がると申します。 んっと…色々な手法はあるのですが、一例としてって感じで。 # チェック関数 # 第二引数が1なら必須 sub is_sale_date { my ($data, $flg) = @_; unless (defined $flg) { $flg = "0"; } # データが空の場合 if ($data eq "") { # 必須フラグに1がたっていなければ(必須でないなら) if ($flg ne "1") { # 正常終了 return "OK"; } } # データチェック if ($data =~ /[\d\d\d\d]+\/[\d\d]+\/[\d\d]/){ # OKなので正常終了 return "OK" } # 問題があったのでNG終了 return undef; } my $flg = "OK"; unless ( is_sale_date($form{'kounyuu_01'}, "1") ) { $flg = "NG"; } unless ( is_sale_date($form{'kounyuu_02'} ) ) { $flg = "NG"; } unless ( is_sale_date($form{'kounyuu_03'} ) ) { $flg = "NG"; } # 以下続く # 最終チェック if ("NG" eq $flg) { &error('移管日の書式が間違っています。'); }

Karin2006Karin
質問者

お礼

がるさん、 早速のアドバイスありがとうございます。 アドバイス頂いた通りに作成したら上手く作動しました!

関連するQ&A

  • 何れかが入力されていれば全て入力

    お世話になっております。 http://odn.okwave.jp/kotaeru.php3?q=1948331 の質問に一部関連しているので続けてお伺いしておけばよかったのですが、 締め切ってしまいましたので申し分けありませんが新たに質問させて頂きました。 cgi/perlを使用したメールフォームで製品登録を行えるものを作成中です。 一つの製品についてkounyuu_01,shouhin_01,price_01という3つの入力項目があり、 何れかの項目が入力されていれば他の項目も必須。 という条件を設けたいと思っています。上記「入力規則をまとめて定義」(リンク)の質問でがるさんにアドバイスいただいた記述を少し変えればできるかなと思い試したのですが力及ばずでした。 置き換えなどが良くわからないので直に以下のようにも書いてみたのですが、全て入力してもエラーが返ってきてしまいます。 if(($form{kounyuu_01} eq "") && ($form{shouhin} eq "") && ($form{price_01} eq "")){ &error('機器#2の情報を入力してください'); }elsif(($form{kounyuu_01} eq "") | ($form{shouhin} eq "") | ($form{price_01} eq "")){ &error('機器#2の何れかの情報が未入力です'); } また、 「入力規則をまとめて定義」(リンク) でEtherskyさんに(共通項目_数字)の場合まとめて定義する方法をご教授頂いたので、 応用して上記を「(xxxx_01)だった場合」 のように今度は01をキーにまとめて定義できたらと思うのですがこちらもさっぱりです。。 どうぞアドバイスのほどよろしくお願いいたします。m(__)m

    • ベストアンサー
    • CGI
  • 未入力のチェックをするには?

    「とほほのwww入門」さんのwwwmailというメールフォームcgiを使わせてもらっています。 このメールフォームに未入力のチェックをさせたいのですが、どうしてもうまくいきません。 例えば「名前」を入力必須項目にしたいので、未入力だった場合、エラーを表示させたいのです。 他のサイトなどを参考に、 #名前がないときの処理 if ($FORM{'NAME'} eq "") { &err('名前が記入されていません。'); } と入れてみたりしたのですが、Internal Server Error がでてしまいます。 また、現在配布されているものと違ったりするようです。 CGIに関してはあまり詳しくなく、本当に簡単な改造をしたことがある程度です。どなたかご存知の方がいらっしゃいましたらぜひ宜しくお願いいたします!

    • ベストアンサー
    • CGI
  • cgiのカスタマイズが上手く行きません

    http://www.rescue.ne.jp/ のサイトにあります 「簡易データベース」http://www.rescue.ne.jp/cgi/database/ のカスタマイズが上手く行きません。 登録の項目を「名前」「星座」「血液型」に絞り登録をし、 「星座」「血液型」の項目選択で両方が一致した人の 「名前」を検索結果に出そうと思っています。 「改造箇所 index.html・・・フォームのカスタマイズ regist.html・・・フォームのカスタマイズ regist.cgi・・・#入力チェック部分、{'EMAIL'}の削除(未使用のため) search.cgi・・・      ($d,$NAME,$BLOOD,$BIRTH) = split(/\,/,$data);      とし、それぞれ $data = $data2 = $BASE[$num]; &jcode'convert(*data,'euc');      ($d,$NAME,$BLOOD,$BIRTH) = split(/\,/,$data); # 血液型 if ($FORM{'BLOOD'} ne 'all') { if ($BLOOD eq $FORM{'BLOOD'}) { ; } else { next; } } # 誕生日 if ($FORM{'BIRTH'} ne 'all') { if ($BIRTH eq $FORM{'BIRTH'}) { ; } else { next; } } と改造。と、最小限のカスタマイズをしたつもりですが、どうしても ●ご指定の条件では見当たりませんでした. となり、検索に引っかかりません。 データ自体はcsvedit.cgiで確認しても、登録はされているようです。 原因、お分かりになりますでしょうか? 何卒!何卒!よろしくお願いいたします。

    • ベストアンサー
    • CGI
  • フォームデータの処理について

    フォームで入力された FORM{'deny'} = アホ バカ http ←半角空白で区切り というデータを受け取ったら、それをdeny.cgiへ @deny=('アホ','バカ','http'); という形で記録したいとおもっています。 そこで、 $setfile = "./deny.cgi"; open(IN,"$setfile") || &error("システムエラー","ファイル「$setfile」を開くことができません。"); @data = <IN>; close(IN); $maxdate = 1; if ($maxdate ne "") { while ($maxdate <= @data) { pop(@data); } } unshift (@data,\@deny=\('$FORM{'deny'}';\n"); と書いてみたものの、これでは deny.cgiに@deny=('アホ バカ http'); と記録されてしまいます。 そこで@deny =join('\',\'',$FORM{'deny'});を追加記述してみたのdすが まったくうまくいきません。 どうしたら良いのかご教授ください。 どうかよろしくお願いいたします。

  • 入力がないのにユーザー定義で定義した文字列が常に表示されてしまう。

    入力がないのにユーザー定義で定義した文字列が常に表示されてしまう。 VLOOKUP関数とIF関数を組み合わせて「=IF(A1="","",VLOOKUP(A1,D2:C5,2,FALSE))」という関数を入力しています。 念のため申し上げますと、 VLOOKUP関数で「D2:C5」の表からデータを検索し、そのデータに該当した行の指定列からデータを取り出しているわけです。 IF関数は、「#N/A」エラーを表示させたくないためです。 この計算式を入力しているセルの書式設定を、ユーザー定義で、「"○""○""○""○""○""○""○"@」としたのですが、 A1セルに入力が無く入力の無いはずのセルに「○○○○○」が常に表示されてしまいます。 どこが間違っているのでしょうか? お知恵を拝借させてください。

  • 入力フォームに全角・半角スペースがある場合

    入力フォームに全角・半角スペースがある場合に、 データを受け取ったCGIのほうで、エラーメッセージを出そうとおもうのですが、 if ($name_l eq ' ' or $name_l eq ' '){ $errMsg .= ',Name'; $errNum++; $e_name_l = 1; } 上記のやり方だと、複数フォームにスペースが入力された時に、エラーの指事がでないのです。 どなたかご教授お願いいたします。

    • ベストアンサー
    • CGI
  • AccessVBAで入力有無のチェック

    こんにちは。 AccessでVBAを記述していたところわからないことがでてきてしまいましたので 質問させて頂きます。(ネットでいろいろと調べてみたのですが、それでも解決しませんでした・・・) バージョンは2003です。 サブフォームのある親フォームの[閉じる]ボタンを押すとサブフォームにある 指定したテキストボックスの値をチェックするという動作を実施したい意向です。 今回問題になってしまったのは、ある[A]というテキストボックスに値が入力されているか どうかのチェックをしようとしたのですが、記述が間違っているのか [オブジェクトはこのプロパティまたはメソッドをサポートしていません。] というエラーメッセージが表示されてしまいます。 いろいろ調べたとこ、IsNull関数を使用するということはわかったのですが 上手く動作しません。 現在使用している記述は以下に記載しますので宜しければどう記述を 修正すれば上手く動作するのかお教え頂ければと思います。 'Aが空白の場合 If IsNull(Forms![F_親フォーム].[F_サブフォーム].Form.[A].Value) Then '背景をイエローに Forms![F_親フォーム].[F_サブフォーム].Form.[A].BackColor = vbYellow Else '背景をマゼンダに Forms![F_親フォーム].[F_サブフォーム].Form.[A].BackColor = vbMagenta End If

  • ExcelVBA入力規則・条件付き書式の設定確認

    環境 Windows7 Excel2010 セルに入力規則・条件付き書式が設定されているかを判定する方法をお教え願います。 試した方法は If Not Intersect(Range("A1").SpecialCells(xlCellTypeAllValidation), Range("A2")) Is Nothing Then  MsgBox "入力規則が設定されていています。" End If If Not Intersect(Range("A1").SpecialCells(xlCellTypeAllFormatConditions),Range("A2")) Is Nothing Then  MsgBox "条件付き書式が設定されていています。" End If 上記だと1つも設定されていないシート上で行うと実行時エラーとなります。 調べるとこのようなものを見つけました。 On Error Resume Next Range("A1").Validation.Type Err.Number <> 0 Then→エラーなら未設定となる。 できればエラーを使わず、判定を行いたいです。 ご教授をお願いいたします。

  • Perlでの複数行にわたるコメント

    Perlにおいて複数行コメントを記述するには =for comment コメントを記述 =cut と書けるとのことですが =for commentと=cutの間に 以下のように1行のコメントが記述されていても問題ありませんか? =for comment #名前をチェック if ($FORM{'name'} eq "") { $error .= "「名前」が入力されていません。$br"; } #タイトルをチェック if ($FORM{'title'} eq "") { $error .= "「タイトル」が入力されていません。$br"; } #コメントをチェック if ($FORM{'comment'} eq "") { $error .= "「コメント」が入力されていません。$br"; } =cut

    • ベストアンサー
    • Perl
  • エクセルの入力規則で数式を使うとうまく動かない

    エクセル2010で、例えばD列に入力値が100以下だとメッセージが出るようにしたいときに、「次の値以下」や「次の値の間」で設定するとうまくいくのですが、「ユーザー設定」で(D:D<100)やD列を選択しておいて単に(>100)だと何を入力してもエラーメッセージが出てくるのですが、数式を使う場合どうすれば設定できるのでしょう?

専門家に質問してみよう