#! /usr/local/bin/perl # # 投票 (クッキーを使わないので連続投票ができてしまうもの) # # id=tohyo.cgi # # update=00.6.2 # 日本語コード変換ライブラリ(v2.0)の指定 # &ReadParse命令で、$in{ }の変数にフォーム入力データが格納される require 'cgi-lib.pl'; require 'jcode.pl'; &ReadParse; # 設置するURLを設定 $reload = 'http://www0.kumagaya.or.jp/cgi-bin/users/chichibu/tohyo.cgi'; $bkhmpg = "http://www.kumagaya.or.jp/~chichibu/cgi1.html"; $file = "/dialup/chichibu/cgi-bin/tohyo.dat"; # 最大登録件数 $max = 100; # 投票へ新規登録したら管理者へメール通知するならON $send="on"; $sendmail = '/usr/lib/sendmail'; # メールの送り先 $myaddress = 'chichibu@po.kumagaya.or.jp'; # デバッグモード $test=""; #################################### # # # メインルーチン(処理の分岐) # # # #################################### if ($in{'action'} eq 'first') { &first; } elsif ($in{'action'} eq 'tohyo') { &tohyo; &display } elsif ($in{'action'} eq 'tuika') { ✓ &display } else { &first; } ###################################### # # # ファイルから登録データを読む # # # ###################################### sub fileread { # 登録件数 $kensu=0; if (!open(DB,"$file")) { &error(2); } # 投票データを読み連想配列にセットする flock(DB,2); $cnt=0; while () { chop($_); #キー 内容、投票数、最終投票日 ($dt1,$dt2,$dt3,$dt4) = split(/\t/,$_); # データ全体を保存する配列 $data{$dt1}=$_; # 投票数の配列 $hyo{$dt1}=$dt3; $kensu++; # 全体投票数 $cnt=$cnt + $dt3; } # end of while flock(DB,8); close(DB); } # end of fileread ############################################# # # # データを読む(全件)         # # # ############################################# sub read3 { open(DB,"$file"); flock(DB,2); @data=; flock(DB,8); close(DB); } # end of read3 ########################## #            # # 項目分解ルーチン   # #            # ########################## sub bunkai { ($dt1,$naiyo,$hyosu,$dt4) = split(/\t/,$bundt); # 日付時刻分解 $yy=substr($dt4,0,4); $mm=substr($dt4,4,2); $dd=substr($dt4,6,2); $ji=substr($dt4,8,2); $fun=substr($dt4,10,2); $byo=substr($dt4,12,2); $nichiji=$yy.$mm.$dd.$ji.$fun.$byo; $hizuke="$yy年$mm月$dd日$ji時$fun分"; } # end of bunkai ########################## # 年月日時分秒セット # ########################## sub jikan_set { # 登録日時セット ($byo,$fun,$ji,$dd,$mm,$yy,$yobi) = localtime; $mm++; # 2桁化 $mm = sprintf("%.2d",$mm); $dd = sprintf("%.2d",$dd); $ji = sprintf("%.2d",$ji); $fun = sprintf("%.2d",$fun); $byo = sprintf("%.2d",$byo); # 西暦4桁処理 if ($yy < 70) { $yy = $yy + 2000;} else { $yy = $yy + 1900;} # 最終投票日時 $nichiji=$yy.$mm.$dd.$ji.$fun.$byo; } # jikan_set ############################################# # # # 最初に表示する画面          # # # ############################################# sub first { &display ; } ############################################# # # # 投票内容を表示する処理        # # # ############################################# sub display { &jikan_set; &fileread; # もし、データがなければ投票可にする if ($kensu == 0) { $sw=0 } # 投票数の多い順に並べる if ($kensu > 0) { @sorthyo = sort by_hyo keys(%hyo) } # 表示出力処理 print "Content-type: text/html\n\n"; print < 人気投票

人気投票


EOM # データがあったら if ($kensu == 0) { print '
'."\n"; print 'はじめまして、投票データは何もありません'; print '

'."\n"; print 'あなたの投票が最初の1票になります、よろしく!'; print '
'; } # if else { print ""; print ""; print '"; print '"; print '"; # 連続投票 if ($sw == 0) { print '"; } # if print '"; print '"; print '"; print ""; # 順位 $no=0; # 1位の投票数 $hyosu1=0; # 1件前の投票数 $svsu=0; foreach (@sorthyo) { # 内容分解 $bundt=$data{$_}; &bunkai; # 同順か調べる if ($svsu != $hyosu) { $no++; } # 1件前の投票数セット $svsu = $hyosu; # 1位は青 if ($no == 1) { $iro="#0000FF" ; $hyosu1=$hyosu } else { $iro="#000000" ; } print ''; print ''."\n"; print ''."\n"; print ''."\n"; # 投票ボタン # 連続投票 if ($sw == 0) { print '' . "\n"; print '' . "\n"; print '"; print ''; } # if # 構成比 if ($cnt > 0) { $a=$hyosu * 100 / $cnt; $b=sprintf("%.1f",$a); } else { $b="" } print ''."\n"; # グラフ #print ''."\n"; # 1位の投票数を100%として計算する if ($hyosu1 > 0 ) { $a=$hyosu * 100 / $hyosu1; $b=sprintf("%.0f",$a); } if ($b > 100) {$b=100} print ''; # 最終投票日 print ''."\n"; print ''; } # end of foreach print "
'."\n"; print ''."\n"; print '順位'; print ''; print "'."\n"; print ''."\n"; print '内 容'; print ''; print "'."\n"; print ''."\n"; print '得票数'; print ''; print "'."\n"; print ''."\n"; print '投票'; print ''; print "'."\n"; print ''."\n"; print '得票率'; print ''; print "'."\n"; print ''."\n"; print 'グラフ'; print ''; print "'."\n"; print ''."\n"; print '最終投票日'; print ''; print "
'.$no.''.$naiyo.''.$hyosu.'
'."\n"; print ''; # 処理番号を渡す print '' . "\n"; print "'.$b.'*****'."\n"; print ''."\n"; print ''; print ''."\n"; print ''; print '
'; print '
'.$hizuke.'
\n"; } # else print '

'."\n"; # 2回目は表示しない if ($sw == 0) { # 最大登録件数に達した場合は表示なし if ($kensu < $max) { print '
' . "\n"; print '' . "\n"; print '表にない場合は、ここに入力して送信をクリック --> ' . "\n"; print '

'."\n"; print '' . "\n"; print '
'."\n"; print '
'."\n"; } # end of if } # end of if print '
' . "\n"; print '' . "\n"; print '
' . "\n"; } # end of display ############################### # タグの無効化サブルーチン ############################### sub tagck { $ckdt =~ s//>/ig; $ckdt =~ s///ig; $ckdt =~ s/\,//g; } ############################### # 投票数ソート ############################### sub by_hyo { if ($hyo{$b} != $hyo{$a}) { $hyo{$b} <=> $hyo{$a}; } else { $a cmp $b; } } # end of sort ########################################## # # # 追加されたデータのチェックルーチン # # # ########################################## sub check { # なにも入力がない場合 if ($in{'sinki'} eq "" ) { &error(0); } # 短すぎる場合 if (length($in{'sinki'}) < 6 ) { &error(3); } # タグの無効化 $ckdt=$in{'sinki'} ; &tagck ; $in{'sinki'}=$ckdt; # 2重登録チェック # ファイルから登録データを読む &read3; foreach (@data) { # 内容分解 $bundt=$_; &bunkai; if ($in{'sinki'} eq $naiyo) { &error(1); } } # end of foreach # チェック通過 &update; $sw=1; # 新規登録メール連絡を知らせるなら if ($send eq "on") { &sendmail } } # check #############################################   # # # チェックエラー表示画面ルーチン     #  # #  ############################################# sub error { # &error(xx); で呼び出されたルーチンは、()内の数字が $error に代入される。 $error = $_[0]; if ($error eq "0") { $error_msg = '入力データが何もありません。'; } if ($error eq "1") { $error_msg = '入力データはすでに登録されています。'; } if ($error eq "2") { $error_msg = 'ファイル入出力でエラーが発生しました。'; } if ($error eq "3") { $error_msg = '入力データが短すぎます。'; } print "Content-type: text/html\n\n"; print '人気投票' . "\n"; print '

'; print '' . "\n"; print '

人気投票の入力で下記のエラーが発生しました

' . "\n"; print '

'; print "$error_msg\n"; print '

'; ################################### 98.2.18 if ($error eq "2") { # 存在チェック if (-e $file) { print '・ファイルの存在チェック OK' . "\n";} else { print '・ファイルが存在しません、ファイル名やディレクトリの確認' . "\n";} print '
'; # 読み込み許可チェック if (-r $file) { print '・ファイルは読み出し可能になっています' . "\n";} else { print '・ファイルが読み出し可能になっていません、パーミッション確認' . "\n";} print '
'; # 書き込み許可チェック if (-w $file) { print '・ファイルは書き込み可能になっています' . "\n";} else { print '・ファイルが書き込み可能になっていません、パーミッション確認' . "\n";} print '
'; } # end of if ################################### # リロードでもどると入力データが消えてしまうので print 'ブラウザ画面の戻るをクリックする'."\n";; print '
'; print '入力の確認表示

' . "\n"; print '
'; print '入力データ: '.$in{'sinki'}.''."\n"; print '' . "\n"; # エラー処理で抜けるので必要 exit; } ########################################## # # # ファイル追加処理           # # # ########################################## sub update { # ファイルから登録データを読む &read3; # 登録日時セット ($byo,$fun,$ji,$dd,$mm,$yy,$yobi) = localtime; $mm++; # 2桁化 $mm = sprintf("%.2d",$mm); $dd = sprintf("%.2d",$dd); $ji = sprintf("%.2d",$ji); $fun = sprintf("%.2d",$fun); $byo = sprintf("%.2d",$byo); # 西暦4桁処理 if ($yy < 70) { $yy = $yy + 2000;} else { $yy = $yy + 1900;} # 登録日時 $nichiji=$yy.$mm.$dd.$ji.$fun.$byo; # 新規は1件をセット $value = "$nichiji\t$in{'sinki'}\t1\t$nichiji\n"; push(@data,$value); # ファイル登録 if (!open(WRITE,">$file")) { &error(2); } print WRITE @data; close (WRITE); } # end of update #################### # # # 投票ルーチン # # # #################### sub tohyo { # チェック通過 &update2; $sw=1; } ########################################## # # # 投票数加算処理            # # # ########################################## sub update2 { # ファイルから登録データを読む &read3; $i=0; foreach (@data){ $bundt=$_; &bunkai; # 該当データを捜し、あったら投票数1加算 if ($dt1 eq $in{'tohyo'}) { # 投票数に1加算 $hyosu++; # 登録日時セット &jikan_set; # 1行入れ替え $data[$i] = "$dt1\t$naiyo\t$hyosu\t$nichiji\n"; # 該当するものは1件だけなので繰り返しから出る last; } # if # 添え字1加算(0から始まる) $i++; } # end of foreach # ファイル登録 if (!open(WRITE,">$file")) { &error(2); } print WRITE @data; close (WRITE); } # end of update2 ############################################# # # # メール送信ルーチン           # # # ############################################# sub sendmail { $message = <