#!/usr/bin/perl require 'jcode.pl'; # jcode.plの呼び出し $datafile = "../datadir/ansdat.csv"; # 回答データファイル名 $thankspage = "../htmldir/tnks.html"; # 回答送信後に表示するthanksページのファイル名 ##### # enq.cgi(Ver.1.1:2004/10/28更新版) # アンケートの回答を保存するperlスクリプトの簡単な例. # 先頭の4行については,必要に応じて書き換えて使用して下さい. # 作者は,このスクリプトの正常な動作を保証するものではありません. # このスクリプトに対し,作者は一切のサポートを行いません. # このスクリプトの使用により生じるいかなる結果に対しても作者は責任を負いません. # このスクリプトは,改変,再配布を含め,基本的には用途を問わずご自由にお使い頂いて構いません. # ただし再配布時は,サポート含め作者は一切の責任を負わない旨明記してください. # また,改変したものの再配布はご遠慮ください. # # このスクリプトを呼び出すアンケート用ページは,下記の要件を満たす必要があります. # ・文字コードがShift-JISであること. # ・回答欄要素の名前が"Q1","Q2","Q3"...というように"Q"+"(通し番号)"であること. # ・"Q_num"という名前の要素に全設問の数(最後の回答欄要素の通し番号に一致)が格納されていること. #  例) # # このスクリプトにより表示する「Thanksページ」内にリンクがある場合は絶対URLを使用して下さい. # このスクリプトへのデータの受け渡しは,"post"にて行って下さい."get"には対応していません. # このスクリプトの文字コードはShift-JISです.改行コードはCR+LFです. # # このスクリプトでは,データファイルへのアクセス制御に,"flock"を使用しています. # "flock"については「データの保存」部分をご確認のうえ,適宜コメントアウト等してください. # # このスクリプトで使用している変数は下記. #  $datafile :回答データファイル名 #  $thankspage:回答送信後に表示するthanksページのファイル名 #  $ans :送信されてきた回答データ #  @cutans :回答対(変数名と値の組)ごとに分割された回答データの配列 #  $eachans :分割された回答対 #  $key :回答対の変数名部分 #  $val :回答対の値部分 #  %indata :回答の連想配列 # $sec :回答時間(秒) # $min :回答時間(分) # $hour :回答時間(時) # $day :回答時間(日) # $mon :回答時間(月) # $year :回答時間(年) # $dotw :回答時間(曜日を表す数値) # $days :回答時間(元旦からの日数) # $summer :夏時間の有無 # @youbi :曜日文字列の配列 # $datetime :回答時間 # $uagent :AGENT文字列 #  $linedata :thanksファイルから読み込んだデータ1行分. ##### # 回答データ読み込んで変数「indata」に格納する # ハッシュindataのキーと値をs_jisに変換(jcode.plのconvert関数を利用) # 半角カンマ,ダブルクオーテーションを全角に変換,改行などを削除 if($ENV{'REQUEST_METHOD'} eq "POST"){ read(STDIN,$ans,$ENV{'CONTENT_LENGTH'}); } else{ print "content-type: text/html\n\n"; print ""; exit; } @cutans= split(/&/,$ans); foreach $eachans (@cutans){ $eachans =~ s/\+/ /g; ($key,$val) = split(/=/,$eachans); $key =~ s/%([a-fA-F0-9]{2})/pack("c",hex($1))/eg; $val =~ s/%([a-fA-F0-9]{2})/pack("c",hex($1))/eg; &jcode::convert(*key,'sjis'); &jcode::convert(*val,'sjis'); $val =~ s/,/,/g; $val =~ s/"/”/g; $val =~ s/[\r\n\t\f]//g; $indata{$key} = $val; } # 回答時刻の取得[?年?月?日,(?曜日),?時?分?秒] ($sec,$min,$hour,$day,$mon,$year,$dotw,$days,$summer) = localtime(time); @youbi = ("日","月","火","水","木","金","土"); $year += 1900; ++$mon; $datetime = $year."年".$mon."月".$day."日,(".$youbi[$dotw]."曜日),".$hour."時".$min."分".$sec."秒"; # データの保存 # 日時,IP,host,referer,agentを先頭に付加. # "Q_num"に格納された数だけ,"Q"+"通し番号"という名前の回答の値を保存("Q1","Q2",...). # データの最後に,保存した回答の数を付け加える(チェック用,必ず"Q_num"と同じになるはず) # なお"flock"を2箇所使用しています(ファイルオープンの直後の行・ファイルクローズの直前の行). # "flock"未対応環境ではコメントアウトしてください. #SafariなどAGENT中にカンマが使われている場合に備えあらかじめAGENT中のカンマをセミコロンに置き換え $uagent = $ENV{'HTTP_USER_AGENT'}; $uagent =~ s/,/;/g; open file1, ">>$datafile"; flock (file1,2); print file1 $datetime.","; print file1 $ENV{'REMOTE_ADDR'}.","; print file1 $ENV{'REMOTE_HOST'}.","; print file1 $ENV{'HTTP_REFERER'}.","; print file1 $uagent.","; for($i = 1; $i <= $indata{"Q_num"}; $i++){ print file1 $indata{"Q$i"}.","; } $i = --$i; print file1 "$i\n"; flock (file1,8); close file1; # thanksページの書き出し # いったんthanksページを全て読み込んで,cgiから書き出す. # thanksページにリンクを入れる場合は,絶対URLで記述しておくこと. open(file1,"<$thankspage"); print "content-type: text/html\n\n"; while ($linedata = ){ print "$linedata\n"; } close file1; exit;