#!/usr/local/bin/perl # WebAN v3.3 is Free. # # Scripts Found at: http://www.rescue.ne.jp/ # History # v3.2 29-Aug-98 浮動小数点(小数点1桁固定小数点形式)処理 # v3.3 23-Dec-99 西暦2000年対応 #----------------# # 初期設定 # #----------------# # 日本語コード変換ライブラリの指定(別に用意します) require './jcode.pl'; # タイトル $title = "アンケート集計結果"; # 設置したURL $cgi = 'http://設置したURL/'; # 内容が書き込まれる記録ファイルのパスを設定 # (このCGIと同じディレクトリに設置する場合は、'./an.dat'でよい) $file = './an.dat'; # 書き込み件数の最大登録数の設定です。この件数を超えると、古いものから削除されていきます。 # これを'0'に設定すれば記録され続けます。 $max = '1000'; # グラフの「+」印は割合に応じた数だけ表示されますが、例えば90%の場合には90個 # 表示されてしまいます。次の値を 2 にすれば45個、3 にすれば30個、という様に # 個数を次の値で割った数だけ表示されます。 $gyao = "3"; ########################################################################################### ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = localtime(time); # 2000年対応 $year += 1900; # 時分秒を2桁に統一する処理 if ($sec < 10) { $sec = "0$sec"; } if ($min < 10) { $min = "0$min"; } if ($hour < 10) { $hour = "0$hour"; } # 上記の$monには0から11までの数字が入るので修正処理 $month = ($mon + 1); if ($month < 10) { $month = "0$month"; } # 時刻フォーマット $date = "$hour\:$min\:$sec $month\:$mday\:$year"; $date_now = "$year年$month月$mday日 $hour時$min分$sec秒"; # フォーム入力されたデータを$bufferに格納する # getかpostかによって取得方法が異なる if ($ENV{'REQUEST_METHOD'} eq "POST") { read(STDIN, $buffer, $ENV{'CONTENT_LENGTH'}); } else { $buffer = $ENV{'QUERY_STRING'}; } ®ist; &html; sub html { $accesses = @lines; if ($lines[($accesses - 1)] =~ /(.*)\,(.*)/) { $first_date = $1; ($clock,$day) = split(/ /,$first_date); ($hour,$minute,$second) = split(/:/,$clock); ($month,$mday,$year) = split(/:/,$day); if ($year < 100) { $year += 1900; } $first_date = "$year年$month月$mday日 $hour時$minute分"; } if ($lines[0] =~ /(.*)\,(.*)/) { $last_date = $1; ($clock,$day) = split(/ /,$last_date); ($hour,$minute,$second) = split(/:/,$clock); ($month,$mday,$year) = split(/:/,$day); if ($year < 100) { $year += 1900; } $last_date = "$year年$month月$mday日 $hour時$minute分"; } foreach $line (@lines) { ($dummy,$an) = split(/\,/,$line); push(@AN, $an); } foreach (@AN) { $ans{($_)[0]}++; $j++; } print "Content-type: text/html\n\n"; print "$title\n"; print "\n"; print "

$title

\n"; print "$date_now 現在の集計結果です。
\n"; print "これらは[$first_date]から[$last_date]までのアンケート集計結果です。
\n"; print "最大アンケート集計件数: $max 件分(これを超えると最新 $max 件分の集計になります)

\n"; print "

$an_title

\n"; print "$sub_title

\n"; print "回答数:$j

\n"; print "\n"; print "\n"; foreach (sort { $ans{$b} <=> $ans{$a} } keys %ans) { print "\n"; $total_ans += $ans{$_}; $percent_ans = int(10000 * ($ans{$_} / $j)) / 100; $percent_ans = sprintf("%2.1f",$percent_ans); $ww=($percent_ans / $gyao);$kome = '+' x $ww; print "\n"; print "\n"; } print "
選択回答名回答数割合割合の目安
$_
$ans{$_}$percent_ans\% $kome
\n"; print "

\n"; if ($tnx eq "1") { print "

ありがとうございました。

\n"; } #著作表示(削除禁止) print '

WebAN v3.3
' . "\n"; print '' . "\n"; } sub regist { # 記録ファイルを読み出しオープンして、配列<@lines>に格納する if (!open(DB,"$file")) { &error('エラー','データファイルを読み出せません.'); } @lines = ; close(DB); # $bufferに格納されたFORM形式のデータを取り出す @pairs = split(/&/,$buffer); foreach $pair (@pairs) { ($name, $value) = split(/=/, $pair); $value =~ tr/+/ /; $value =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg; # 掲示板に書き込まれたくないタグが含まれる内容を消去する $value =~ s//>/ig; # 記録するデータはsjisに統一する &jcode'convert(*value,'sjis'); if ($name eq "regist" && $value ne '') { push(@REG,$value); $tnx = 1; } elsif ($name eq "view") { return; } } if (@REG) { &wcheck; } $h = @REG; foreach $reg (@REG) { $value = "$date\,$reg\n"; unshift(@lines,$value); } $i = 0; foreach $line (@lines) { $i++; push(@new,$line); if ($i == $max) { last; } } # 記録ファイルを上書きオープンして、配列<@lines>を書き出す if (@REG) { @lines = @new; undef(@new); if (!open(DB,">$file")) { &error('エラー','データファイルに記録できません.'); } print DB @lines; close(DB); } } sub error { print "Content-type: text/html\n\n"; print '$title' . "\n"; print '' . "\n"; print "

$_[0]

\n"; print "$_[1]\n"; print '

' . "\n"; exit; } sub wcheck { #(簡易)複数回投稿防止処理 @pairs = split(/;/,$ENV{'HTTP_COOKIE'}); foreach $pair (@pairs) { ($name, $value) = split(/=/, $pair); $name =~ s/ //g; $COOKIE{$name} = $value; } if ($COOKIE{$cgi} eq 'repost_check') { &error('複数投票できません','あなたは既に投票されました.'); } print "Set-Cookie: $cgi=repost_check;\n"; }