#!/usr/bin/perl #--------------------------------------- # # 公開講座2001用 アンケート回収用CGI # # written by sakura #--------------------------------------- # v1.01a;20000818;boo # # もうちょっと書けば、きちんとしたアンケート回収 # CGI汎用型ができるでしょう。でも私はやらないです。 # 〜〜ひとこと〜〜 # 今年もなんか関わってる。。。 # 出力する日本語は? ( jis | sjis | euc ) #$kanji="euc"; $kanji="sjis"; # データファイルの名前 # CSV(カンマ区切り)形式のファイル # 通常はこちらを使用すればよいでしょう。 $datafile='koukai2001a.dat'; # 送信されてきたデータそのままを記録したファイル # もし文字化けなどしていたら、こちらから復元してください。 $datafileb='koukai2001a-log.dat'; # 処理開始 # 日本語処理をするのでとりあえずいれておく require 'jcode.pl'; # これがないとCGIにならないので忘れないうちに記述 print "Content-type: text/html\n\n"; #print "Content-type: text/plain\n\n"; # アンケーということなので、POSTメソッドを用いましょう。 # GETは扱える長さが限られています。 # 受け取ったデータの種類を取得します(MIME形式)。 # でも今回は使わないのでコメント扱い。 #$types_mime=$ENV{'CONTENT_TYPE'}; # 入力データの取り込み(POSTメソッド用) read(STDIN,$query,$ENV{'CONTENT_LENGTH'}); # 入力データを分解する @query=split(/&/,$query); # Name=Val の入力データを $in{'Name'}='Val'のハッシュに格納する foreach(@query){ tr/+/ /; # +になっているを空白文字を復元 ($key,$val)=split(/=/); # Name=Valを分解する # %HH形式の日本語や特殊文字を元の文字にデコードする $key=~s/%([A-Fa-f0-9][A-Fa-f0-9])/pack("c",hex($1))/ge; $val=~s/%([A-Fa-f0-9][A-Fa-f0-9])/pack("c",hex($1))/ge; # 改行コードを変換します。普通は次の1行を使いますが、 # 今回は改行をいれないで欲しいとの御要望(姉御)がありま # したのでその次の行で改行を消し去ります。 # $val=~s/\r\n/\n/g; $val=~s/\r\n//g; # さらに日本語ならコード変換する(安全策でEUCに変換?) # jis/sjis/eucから選択 jcode'convert(*key,$kanji); jcode'convert(*val,$kanji); #連想配列に格納 $in{$key}=$val; } # ここまででデコード完了のはず。 # 現在時刻の取得 ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst)=localtime(time); $mon=1+$mon; $year=1900+$year; # IPアドレスの取得 $ipadd=$ENV{'REMOTE_ADDR'}; # データの収集完了 # データが抜けていないかチェック # データが入っていなければならないところをチェックします。 # 数字は半角で入力してもらいましょう。 # 本当は全角で入力しても半角で受け取るようにしたかったのですが、 # 時間の関係で半角のみの受理とします。(逃げという話も・・・。) # if($in{'A00'} eq ''){ errors('項目A');exit }; if($in{'A00'} eq 'yes'){ if($in{'A01'} eq ''){ errors('項目B');exit }; if($in{'A02'} eq ''){ errors('項目C');exit }; if($in{'A03'} eq ''){ errors('項目D');exit }; if($in{'A01'} =~/[^0-9]+/){ errors2('項目B');exit }; if($in{'A02'} =~/[^0-9]+/){ errors2('項目C');exit }; if($in{'A03'} =~/[^0-9]+/){ errors2('項目D');exit }; if(($in{'A0401'} eq '')&& ($in{'A0402'} eq '')&& ($in{'A0403'} eq '')&& ($in{'A0404'} eq '')&& ($in{'A0405'} eq '')&& ($in{'A0406'} eq '')&& ($in{'A0407'} eq '')&& ($in{'A0408'} eq '')&& ($in{'A0409'} eq '')&& ($in{'A0410'} eq '')&& ($in{'A0411'} eq '')&& ($in{'A0412'} eq '')){ errors('項目E');exit }; } if($in{'A05'} eq ''){ errors('項目F');exit }; if($in{'A06'} eq ''){ errors('項目G');exit }; if($in{'A06'} =~/[^0-9]+/){ errors2('項目G');exit }; if($in{'A07'} eq ''){ errors('項目H');exit }; if($in{'A08'} eq ''){ errors('項目I');exit }; if(($in{'B0101'} eq '')&& ($in{'B0102'} eq '')&& ($in{'B0103'} eq '')&& ($in{'B0104'} eq '')&& ($in{'B0105'} eq '')){ errors("項目1");exit }; if(($in{'B0201'} eq '')&& ($in{'B0202'} eq '')&& ($in{'B0203'} eq '')&& ($in{'B0204'} eq '')&& ($in{'B0205'} eq '')&& ($in{'B0206'} eq '')){ errors('項目2');exit }; if($in{'B03'} eq ''){ errors('項目3');exit }; if($in{'B04'} eq ''){ errors('項目4');exit }; if($in{'B05'} eq ''){ errors('項目5');exit }; if($in{'B06'} eq ''){ errors('項目6');exit }; if($in{'B07'} eq ''){ errors('項目7');exit }; if($in{'B08'} eq ''){ errors('項目8');exit }; if($in{'B09'} eq ''){ errors('項目9');exit }; if($in{'B10'} eq ''){ errors('項目10');exit }; if($in{'B11'} eq ''){ errors('項目11');exit }; if($in{'B12'} eq ''){ errors('項目12');exit }; if($in{'B13'} eq ''){ errors('項目13');exit }; if($in{'B14'} eq ''){ errors('項目14');exit }; if($in{'B15'} eq ''){ errors('項目15');exit }; if($in{'B16'} eq ''){ errors('項目16');exit }; if($in{'B17'} eq ''){ errors('項目17');exit }; if($in{'B18'} eq ''){ errors('項目18');exit }; if($in{'B19'} eq ''){ errors('項目19');exit }; if($in{'B20'} eq ''){ errors('項目20');exit }; if($in{'B21'} eq ''){ errors('項目21');exit }; # ファイルへの書き込み開始 # ファイルのオープン open(FILE,">>$datafile") || die "Datafile Write error.....\n"; open(FILEb,">>$datafileb") || die "Datafile Write error.....\n"; # ファイルのロック # 手抜きでflockを使う。NFSとかではうま動作しないかもしれないので # 本当はflockが使えない処理もいれておく必要がありそうです。 flock($datafile,2); flock($datafileb,2); # ファイルの最後に移動します。 seek($datafile,0,2); seek($datafileb,0,2); # ファイルへ書き込み # ここで書き込むものを列挙していきます。 # こんな感じ print FILE "test"; #------------------------------------------------- # 記入(カンマ区切りで) #--時刻とIPアドレス print FILE "$year:$mon:$mday:$hour:$min:$sec,"; print FILE "$ipadd,"; print FILEb "$year:$mon:$mday:$hour:$min:$sec\n"; print FILEb $query; print FILEb "\n"; #--データ print FILE "$in{'A00'},"; print FILE "$in{'A01'},"; print FILE "$in{'A02'},"; print FILE "$in{'A03'},"; print FILE "$in{'A0401'},"; print FILE "$in{'A0402'},"; print FILE "$in{'A0403'},"; print FILE "$in{'A0404'},"; print FILE "$in{'A0405'},"; print FILE "$in{'A0406'},"; print FILE "$in{'A0407'},"; print FILE "$in{'A0408'},"; print FILE "$in{'A0409'},"; print FILE "$in{'A0410'},"; print FILE "$in{'A0411'},"; print FILE "$in{'A0412'},"; print FILE "$in{'A0413'},"; print FILE "$in{'A05'},"; print FILE "$in{'A06'},"; print FILE "$in{'A07'},"; print FILE "$in{'A08'},"; print FILE "$in{'B0101'},"; print FILE "$in{'B0102'},"; print FILE "$in{'B0103'},"; print FILE "$in{'B0104'},"; print FILE "$in{'B0105'},"; print FILE "$in{'B0106'},"; print FILE "$in{'B0201'},"; print FILE "$in{'B0202'},"; print FILE "$in{'B0203'},"; print FILE "$in{'B0204'},"; print FILE "$in{'B0205'},"; print FILE "$in{'B0206'},"; print FILE "$in{'B0207'},"; print FILE "$in{'B03'},"; print FILE "$in{'B04'},"; print FILE "$in{'B0401'},"; print FILE "$in{'B0402'},"; print FILE "$in{'B0403'},"; print FILE "$in{'B0404'},"; print FILE "$in{'B0405'},"; print FILE "$in{'B05'},"; print FILE "$in{'B0501'},"; print FILE "$in{'B0502'},"; print FILE "$in{'B0503'},"; print FILE "$in{'B0504'},"; print FILE "$in{'B0505'},"; print FILE "$in{'B06'},"; print FILE "$in{'B0601'},"; print FILE "$in{'B0602'},"; print FILE "$in{'B0603'},"; print FILE "$in{'B0604'},"; print FILE "$in{'B0605'},"; print FILE "$in{'B07'},"; print FILE "$in{'B08'},"; print FILE "$in{'B0801'},"; print FILE "$in{'B0802'},"; print FILE "$in{'B0803'},"; print FILE "$in{'B0804'},"; print FILE "$in{'B09'},"; print FILE "$in{'B0901'},"; print FILE "$in{'B0902'},"; print FILE "$in{'B0903'},"; print FILE "$in{'B0904'},"; print FILE "$in{'B0905'},"; print FILE "$in{'B10'},"; print FILE "$in{'B1001'},"; print FILE "$in{'B1002'},"; print FILE "$in{'B1003'},"; print FILE "$in{'B1004'},"; print FILE "$in{'B1005'},"; print FILE "$in{'B11'},"; print FILE "$in{'B1101'},"; print FILE "$in{'B1102'},"; print FILE "$in{'B1103'},"; print FILE "$in{'B1104'},"; print FILE "$in{'B1105'},"; print FILE "$in{'B12'},"; print FILE "$in{'B13'},"; print FILE "$in{'B1301'},"; print FILE "$in{'B1302'},"; print FILE "$in{'B1303'},"; print FILE "$in{'B1304'},"; print FILE "$in{'B14'},"; print FILE "$in{'B15'},"; print FILE "$in{'B16'},"; print FILE "$in{'B1601'},"; print FILE "$in{'B1602'},"; print FILE "$in{'B1603'},"; print FILE "$in{'B1604'},"; print FILE "$in{'B1605'},"; print FILE "$in{'B17'},"; print FILE "$in{'B18'},"; print FILE "$in{'B19'},"; print FILE "$in{'B20'},"; print FILE "$in{'B21'},"; print FILE "end"; #------------------------------------------------- # 最後に改行をいれましょう print FILE "\n"; # ファイルのクローズ close(FILE); close(FILEb); # ファイルのロック解除 flock($datafile,8); flock($datafileb,8); # 書き込み終了 # 登録しましたというメッセージの表示 print "
"; print "登録日時: $year年$mon月$mday日"; print " $hour時$min分$sec秒
"; print "アンケート記入へのご協力ありがとうございました。
"; print "";
print "
"; print ""; print "2001年度公開講座のホームページへ戻る
"; print ""; # ここでおわり # エラーメッセージ表示1 sub errors { ($error)=@_; print ""; print "";
print "未記入の項目があります($error)。
";
print "半角数値での記入をお願いします($error)。