- ベストアンサー
全角、半角の区別をする。
年齢を入力した際に、現在の設定であればアルファベットやひらがなを入力したとしてもそのままcsvにおちてしまいますが、半角数字に限定し完了できるようにするにはどうすればよろしいのでしょうか?また、半角英数にした際も教えていただければ幸いです。 #! /usr/bin/perl require "./mimew.pl"; require "./cgi-lib.pl"; &ReadParse(); # form.htmlより受取ったデータを変数に代入 $d[0]=$in{'name'}; $d[1]=$in{'sex'}; $d[2]=$in{'age'}; # 未入力チェック if($d[0] eq ""){$error[0]="お名前を入力して下さい";} if($d[1] eq ""){$error[1]="性別を入力して下さい";} if($d[2] eq ""){$error[2]="年齢を入力して下さい";} #エラーメッセージを全部つないで $error=$error[0].$error[1].$error[2]; # エラーが無いときの処理 if($error eq ""){ # データをカンマ区切りにしてdata.csvに保存 $data=join(",",$d[0],$d[1],$d[2])."\n"; open(FH,">>./data.csv"); print FH $data; close FH;
- yohei4649
- お礼率25% (1/4)
- CGI
- 回答数2
- ありがとう数1
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
>わたしがあまりCGIを詳しくなくというかほとんど素人で設置くらいしかできなくこの記述もほとんどつくっていただいたようなもので…。 その作ってもらった人に今回も頼むのがいいでしょうね。 素人がいじるには難しい >ですので、不明な点がアウト時の処理となっている箇所は具体的にどのように記述すればよろしいのでしょうか? 未記入時にしている処理のような事をする。 >また、if~の記述はどの場所へ記述する必要がありますか?ご回答よろしくお願いいたします。 好きなところに まぁチェックルーチンはまとめた方が後々も楽だろうし 未記入チェックの処理の後でしょうね。 あと今回の場合、半角チェックを入れずに 全角を半角に自動で変換するプログラムに するのも手ですね。 Jcode.pmまたはjcode.plを用いて 後は年齢の部分を選択リストで選択する形にするとか 十の桁と一の桁を別々にして
その他の回答 (1)
- Ethersky
- ベストアンサー率71% (168/235)
変数$valueに値が入っているとする 例1 数字限定(半角数字以外が含まれていたらアウトとすれば) if($value =~ /[^0-9]/){アウト時の処理} 例2 上記と同じ意味(\d は 0-9 と同義) if($value =~ /[^\d]/){アウト時の処理} 例3 上記と同じ意味(\D は [^0-9] と同義) if($value =~ /\D/){アウト時の処理} 例4 数字限定(半角数字だけで構成されていなければアウトとすれば) if($value !~ /^\d+$/){アウト時の処理} 例5 半角英数限定(半角英数以外が含まれていたらアウトとすれば) if($value =~ /[^A-Za-z0-9]/){アウト時の処理} 例6 上記と同じ意味 ※アンダーバー(_)も含む(\w は [A-Za-z0-9_] と同義) if($value =~ /[^\w]/){アウト時の処理} 例7 上記と同じ意味 ※アンダーバー(_)も含む(\W は [^A-Za-z0-9_] と同義) if($value =~ /\W/){アウト時の処理} ところで、せっかく配列に入れているなら join(",",$d[0],$d[1],$d[2]) ではなく join(",",@d) の方がスマートです。 また、変数$dataを再利用しないなら print FH $data; ではなく print FH join(",",$d[0],$d[1],$d[2])."\n"; も可能。
補足
早々にご回答ありがとうございます。具体的に説明いただいているのですが、わたしがあまりCGIを詳しくなくというかほとんど素人で設置くらいしかできなくこの記述もほとんどつくっていただいたようなもので…。ですので、不明な点がアウト時の処理となっている箇所は具体的にどのように記述すればよろしいのでしょうか?また、if~の記述はどの場所へ記述する必要がありますか?ご回答よろしくお願いいたします。
関連するQ&A
- アンケートフォームの設定について
質問が1-1、1-2、1-3とあるのですが、その1-1質問中で「はい」と答えた方のみ1-2へ、更に1-2でも「はい」と答えた方が1-3まで回答いただく設定にし、1-1で「いいえ」と答えれば、次の1-2以降は答えなくても良いようにするにはどのようにすればよいのでしょうか?※csvデータ「いいえ」の回答の際は1-1 いいえ、1-2、1-3はブランクとなるような設定が理想ですが。 省略 # form.htmlよりデータを変数に代入 $d[0]=$in{'name'}; $d[1]=$in{'sex'}; $d[2]=$in{'age'}; $d[3]=$in{'q1-1'}; $d[4]=$in{'q1-2'}; $d[5]=$in{'q1-3'}; $d[6]=$in{'q2-1'}; $d[7]=$in{'q2-2'}; $d[8]=$in{'q2-3'}; # 未入力チェック if($d[0] eq ""){$error[0]="名前入力";} if($d[1] eq ""){$error[1]="性別を入力";} if($d[2] eq ""){$error[2]="年齢を入力";} if($d[3] eq ""){$error[3]="質問1-1を入力";} if($d[4] eq ""){$error[4]="質問1-2を入力";} if($d[5] eq ""){$error[5]="質問1-3を入力";} if($d[6] eq ""){$error[6]="質問2-1を入力";} if($d[7] eq ""){$error[7]="質問2-2を入力";} if($d[8] eq ""){$error[8]="質問2-3を入力";} # データをカンマ区切りにしてdata.csvに保存 $data=join(",",$d[0],$d[1],$d[2],$d[3],$d[4],$d[5],$d[6],$d[7],$d[8])."\n"; open(FH,">>./data.csv"); print FH $data; close FH; 省略
- 締切済み
- CGI
- 入力フォームに全角・半角スペースがある場合
入力フォームに全角・半角スペースがある場合に、 データを受け取ったCGIのほうで、エラーメッセージを出そうとおもうのですが、 if ($name_l eq ' ' or $name_l eq ' '){ $errMsg .= ',Name'; $errNum++; $e_name_l = 1; } 上記のやり方だと、複数フォームにスペースが入力された時に、エラーの指事がでないのです。 どなたかご教授お願いいたします。
- ベストアンサー
- CGI
- データを読み込んだ時・・・・
すいません。初心者です。以下のようにデータを読み込んだとき、ifの条件部分 $form{'user'} eq $userid と、 $form{'kojimail'} eq $mail は、 ちゃんと判定してくれるのですが、 「$hantei eq $hanteiari」 は、判定しません. たぶん何かが違うんだと思いますが・・・・(>_<) 読み込んだデータ $hanteiari は、データベース内で、hanteiari と入力されています。何卒よろしく御願いします。 ★データベース情報 登録ID:名前:メールアドレス:性別:年齢:hanteiari:認証ID ★CGI #!/usr/local/bin/perl require 'cgi-lib.pl'; &ReadParse(*form); require 'jcode.pl'; &jcode'convert(*form, 'sjis'); open(ENQ, "<enquete.dat") || die "File 'enquete.dat' Open Error."; @dad= <ENQ>; $hanteiari= "hanteiari" foreach(@dad){ ($userid, $name, $mail, $sex, $age, $hantei, $kuuhaku )=split(/:/, $_); #ここです↓ if( $form{'user'} eq $userid && $form{'kojimail'} eq $mail && $hantei eq $hanteiari) {$ari =+10;} } if($ari< 5 ){ $atari =20;} close(ENQ);
- ベストアンサー
- CGI
- 半角カタカナ→全角カタカナ変換がうまくいきません。
お世話になっております。 フォームから入力された文字を、 「半角カタカナ→全角カタカナ」変換したいのですがうまくいきません。 コーディングは以下の通りですが、問題の箇所がわかりません。 どなたかご教授ください。 なお、jcode.plは、最新のものを使っています。 #↓=============================================== ##### フォームデータ受け取り if ($ENV{'REQUEST_METHOD'} eq 'POST') { read( STDIN , $buffer , $ENV{'CONTENT_LENGTH'} ); } else { $buffer = $ENV{'QUERY_STRING'}; } # 文字コードを正確に取得するために,全ての送信データをいったん文字コードチェックする $buffer1 = $buffer; $buffer1 =~ s/%([0-9a-fA-F][0-9a-fA-F])/pack("C", hex($1))/eg; $kcode = &jcode::getcode(*buffer1); @pairs = split(/&/ , $buffer); ##### フォームデータのデコード、漢字コードをsjisに変換 foreach $pair (@pairs) { ($k,$v) = split(/=/,$pair); $v =~ tr/+/ /; $v =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C",hex($1))/eg; &jcode'convert(*v,"sjis",$kcode); # 半角カナを全角に変換 if($kcode eq 'sjis') { &jcode::h2z_sjis(\$v); } if($kcode eq 'euc') { &jcode::h2z_euc(\$v); } if($kcode eq 'jis') { &jcode::h2z_jis(\$v); } $in{$k} = $v; } #↑=============================================== (なお、全角スペースは、半角スペースなどに変更願います。) よろしくお願いします。
- 締切済み
- Perl
- jcode.pl と &ReadParse()
CGIファイルの先頭は #!/usr/local/bin/perl require './cgi-lib.pl'; require './jcode.pl'; &ReadParse(); という感じになっています。 ここでのの require は、日本語を使うためのもの だと思っています。合っていますか? &ReadParse() というのは何ですか? require と関係があるみたいです。 require を書かずに &ReadParse() を書くとCGIエラーになります。
- ベストアンサー
- CGI
- Perlでuse strictと %inの共存
use strictを使うと、変数の使用に厳密にチェックしてくれるので、便利だと思い使いましたが、ReadParse後の%inを利用する場合に宣言されていないエラーが表示されます。意味的には正しいですが、$in{'test'}など CGIで受け取った内容が扱えなくなるので、困っております。何か解決方法は有るのでしょうか? use strict; require 'cgi-lib.pl'; require 'jcode.pl'; &ReadParse; my $x = $in{'md'};
- ベストアンサー
- Perl
- mkdirでのファイルロック
私はCGIの経験がほとんどなく超初心者です。下記のようなファイルを作りましたがファイルのロックをしなければデータが書き込まれないようなので困ってしまっています。flockはつかえないようなのでmkdirでロックをかけたいのです。 #! /usr/local/bin/perl $| = 1; require './jcode.pl'; require './mimew.pl'; require './cgi-lib.pl'; &ReadParse(*FORM); $thisfile = 'mother'; $countfile = './mother.txt'; $predatadir ='./mom'; $fromname = "sabra net"; $fromemail = '***@****.co.jp'; $act = $FORM{'act'}; #### main始動 #### if($act eq "indata"){ &getnumber; &datamod; &inputDB; &mailsend; &view; } else{ &datamod; &kakunin; } #### main終了 #### #### メッセージ番号設定 #### sub getnumber { open(COUNTER,"$countfile") || &error('countfileが開けない'); $this_num = <COUNTER>; close(COUNTER); $this_num++; open(COUNTER,">$countfile") || &error('countfileに書きこめない'); print COUNTER "$this_num"; close(COUNTER); if( length($this_num) == 1 ){ $this_num ="000000" . $this_num; } elsif( length($this_num) == 2 ){ $this_num ="00000" . $this_num; } } #### datafileへ入力 #### sub inputDB { $datafile = "$predatadir/userdata01.csv"; open(DB,">>$datafile") || &error('datafileに書きこめない'); print DB "$yourname,$email\n"; close(DB); }
- 締切済み
- CGI
- cgi-lib.plのReadParse関数
あるパールからcgi-libを呼び出して、ReadParse関数を使おうとするとInternal Server Errorがでてしまいます。 パールの中身は #!/usr/local/bin/perl require 'cgi-lib.pl'; require 'jcode.pl'; &ReadParse(*in); です。 そこで3行目と5行目の行頭に#をつけて飛ばすとパールは正常に動きます。 これってcgi-lib.plのReadParse関数がいけないんでしょうか? ダウンロードしたまま何も変更していないのに..... ちなみにサーバーのパールのバージョンは5.004のようです。
- ベストアンサー
- CGI
- 該当項目表示についての追加質問
csvデータの列に%で区切った項目があります。 例) 1行目:aaa%bbb%ccc 2行目:aaa&bbb%ddd 3行目:aaa%bbb csvデータ内にはaaaは3個だけですが下記コードで実行すると aaaが6個と計算されます。bbb、ccc、dddの個数は正確に計算されます。 $find = 0; for($d = 0 ; $d < @TEST ; ++$d) { (@ITEM) = split(/\,/, $TEST[$d]); @T = split(/\%/, @ITEMD[2]); #csvデータ内項目%区切り if($in{'item'} eq @T[0]) #@T[0]にaaaが入ります { if(($in{'item2'} eq "") or ($in{'item2'} eq "全て")) { @FIND[$find] = $TEST[$d]; $find++; } elsif($in{'item2'} eq @T[2]) { @FIND[$find] = $TEST[$d]; $find++; } if($in{'item2'} eq @T[1]) { if(($in{'item3'} eq "") or ($in{'item3'} eq "全て")) { @FIND[$find] = $TEST[$d]; $find++; } elsif($in{'item3'} eq @T[2]) { @FIND[$find] = $TEST[$d]; $find++; } } } } ご教授お願いいたします。
- ベストアンサー
- Perl
- 確認のメールアドレスの比較の方法
フォームメールなどで、メールアドレスを入力違いを防ぐため、2回入力させ、違う場合はエラーメッセージを表示させたいのですが、どのように 記述すればよいでしょうか? ちなみに今使っているのでは、以下のような形で入力項目をチェックしています。どうぞよろしくお願いします。 if ($namae eq "") { &error("名前が入力されていません");} if ($post eq "") { &error("郵便番号が入力されていません");} if ($pref eq "") { &error("県名が入力されていません");} if ($address eq "") { &error("住所が入力されていません");} if ($phone eq "") { &error("電話番号が入力されていません");} if ($phone!~ /^\d{2,5}-\d{1,4}-\d{4}$/) { &error("電話番号は半角数字でハイフォンで区切って入力して下さい"); } if ($email eq "") { &error("メールアドレスが入力されていません");} if ($email =~ /\s|\,/) { &error("メールアドレスの入力が不正です");} if ($email !~ /\b[-\w.]+@[-\w.]+\.[-\w]+\b/) { &error("メールアドレスは半角で正しくご入力ください");} #if ($email !~ /(.+)\@(.+)\.(.+)/) { &error("メールアドレスの入力が不正です");}
- ベストアンサー
- Perl
お礼
ご連絡が遅くなりましたが、確かに素人には難しそうです。選択形式を変更することで解決しようと思います。どうもありがとうございました。