#! /usr/local/bin/perl # # id=cnt3mtn.cgi # # アクセスカウントファイルのカウントデータを # フォーム画面から更新する (サンプル用) # # update. 00.4.14 # 日本語コード変換ライブラリ(v2.0)の指定 # &ReadParse命令で、$in{ }の変数にフォーム入力データが格納される require 'cgi-lib.pl'; require 'jcode.pl'; &ReadParse; # データファイル $file = "/dialup/chichibu/cgi-bin/acscnt3.dat"; $reload = 'http://www0.kumagaya.or.jp/cgi-bin/users/chichibu/cnt3mtn.cgi'; $bkhmpg = "http://www.kumagaya.or.jp/~chichibu/cgi1.html"; $password = "yumiko"; # カウント項目数 $max = 52; # # ファイルを読む # if (!open(DATA,"$file")) { &error(0); } $cnt = ; close(DATA); # もしファイルにデータがなかったらテーブルを0で初期化する if ($cnt eq "") { &syokika; }else{ @cnt = split(/,/,$cnt); } #################################### # # # メインルーチン(処理の分岐) # # # #################################### # 全体の流れを決定する(actionやpwdはフォーム入力されたデータを格納する名前) # action=check --> フォーム入力データのチェック処理へ # その他 --> フォーム入力画面へ if ($in{'action'} eq 'check') { ✓ &html1; } elsif ($in{'action'} eq 'update') { &html2; } else { &html1; } ############################################ #      # # カウントデータ表示画面出力ルーチン # # # ############################################ sub html1 { # HTML出力前に時間帯別合計を求める $a = $cnt[13] + $cnt[14] + $cnt[15] + $cnt[16]; if ($a == 0) { $k1 = 0; $k2 = 0;$k3 = 0;$k4 = 0; } else {$k1 = $cnt[13] * 100 / $a;$k2 = $cnt[14] * 100 / $a;$k3 = $cnt[15] * 100 / $a;$k4 = $cnt[16] * 100 / $a;} # 少数点第1位で揃える $k1 = sprintf("%.1f",$k1); $k2 = sprintf("%.1f",$k2); $k3 = sprintf("%.1f",$k3); $k4 = sprintf("%.1f",$k4); # %を付ける $k1 = $k1."%"; $k2 = $k2."%"; $k3 = $k3."%"; $k4 = $k4."%"; # 2桁にする $cnt[1] = sprintf("%.2d",$cnt[1]); $cnt[2] = sprintf("%.2d",$cnt[2]); $cnt[3] = sprintf("%.2d",$cnt[3]); $cnt[5] = sprintf("%.2d",$cnt[5]); $cnt[6] = sprintf("%.2d",$cnt[6]); $cnt[7] = sprintf("%.2d",$cnt[7]); # HTML出力 print "Content-type: text/html\n\n"; print < カウントファイル更新 2/4

カウントデータ表示


EOM print '
'; print '
' . "\n"; print '' . "\n"; print '' . "\n"; print '
   '; print '' . "\n"; print '   '; # 最初の画面に戻る print '' . "\n"; print '' . "\n"; print ''; print '
'; print '' . "\n"; print '
'; # 累計 print "\n"; print ''."\n"; print ''."\n"; print ''."\n"; print ''."\n"; print "
累計'.$cnt[0].'
本日'.$cnt[4].'
本日日付'.$cnt[1].''.$cnt[2].''.$cnt[3].'
最終更新日'.$cnt[5].''.$cnt[6].''.$cnt[7].'
\n\n

\n\n"; # 時間帯別 print "\n"; print "\n"; print ''."\n"; print ''."\n"; print ''."\n"; print ''."\n"; print "
時間帯件数構成比
朝6時〜12時'.$cnt[13].''.$k1.'
12時〜18時'.$cnt[14].''.$k2.'
18時〜24時'.$cnt[15].''.$k3.'
夜0時〜 6時'.$cnt[16].''.$k4.'
\n\n

\n\n"; # 7日間記録 print ''."\n"; print "\n"; print ''."\n"; print ''."\n"; print ''."\n"; print ''."\n"; print ''."\n"; print ''."\n"; print ''."\n"; print '
日付件数
'.$cnt[39].''.$cnt[40].'
'.$cnt[41].''.$cnt[42].'
'.$cnt[43].''.$cnt[44].'
'.$cnt[45].''.$cnt[46].'
'.$cnt[47].''.$cnt[48].'
'.$cnt[49].''.$cnt[50].'
'.$cnt[51].''.$cnt[52].'
'; # 月別 print "\n"; print "\n"; print ''."\n"; print ''."\n"; print ''."\n"; print ''."\n"; print ''."\n"; print ''."\n"; print ''."\n"; print ''."\n"; print ''."\n"; print ''."\n"; print ''."\n"; print ''."\n"; print '
件数
 1月'.$cnt[17].'
 2月'.$cnt[18].'
 3月'.$cnt[19].'
 4月'.$cnt[20].'
 5月'.$cnt[21].'
 6月'.$cnt[22].'
 7月'.$cnt[23].'
 8月'.$cnt[24].'
 9月'.$cnt[25].'
10月'.$cnt[26].'
11月'.$cnt[27].'
12月'.$cnt[28].'

'; # ベスト5 print "\n"; print "\n"; print ''."\n"; print ''."\n"; print ''."\n"; print ''."\n"; print ''."\n"; print '
順位日付件数
1位'.$cnt[29].''.$cnt[30].'
2位'.$cnt[31].''.$cnt[32].'
3位'.$cnt[33].''.$cnt[34].'
4位'.$cnt[35].''.$cnt[36].'
5位'.$cnt[37].''.$cnt[38].'
'; print "\n\n"; ### sub html1 end ### } #################################### # # # フォーム入力画面出力ルーチン # # # #################################### sub html2 { # CGIで出力されたデータをHTMLとして認識させるヘッダの出力 print "Content-type: text/html\n\n"; print 'カウントファイルの保守' . "\n"; print ''."\n"; print 'カウントファイルの保守

' . "\n"; print '

' . "\n"; print '' . "\n"; print '累計:
' . "\n"; print '
'; print '本日:
' . "\n"; print '
'; print '本日日付:年' . "\n"; print '月' . "\n"; print '日' . "\n"; print '
'; print '最終更新日:年' . "\n"; print '月' . "\n"; print '日' . "\n"; print '
'; print '朝6時〜12時:
' . "\n"; print '
'; print '12時〜18時:
' . "\n"; print '
'; print '18時〜24時:
' . "\n"; print '
'; print '夜0時〜 6時:
' . "\n"; print '
'; ###################################################### # 7日間の履歴 print "\n"; print "\n"; for ($i=1; $i <=7; $i++) { # 日付は39,41,43,45... $a=2 * ($i - 1) + 39; # 件数は40,42,44,46... $b=$a + 1; print "'."\n"; } # end of for print '
日付件数
\n"; print ''."\n"; print '

'; ##################################################### print ' 1月:
' . "\n"; print ' 2月:
' . "\n"; print ' 3月:
' . "\n"; print ' 4月:
' . "\n"; print ' 5月:
' . "\n"; print ' 6月:
' . "\n"; print ' 7月:
' . "\n"; print ' 8月:
' . "\n"; print ' 9月:
' . "\n"; print '10月:
' . "\n"; print '11月:
' . "\n"; print '12月:
' . "\n"; print ''."\n"; print '*ベスト5' . "\n"; print ''; print '
'; print '1位の日付:
' . "\n"; print '1位の件数:
' . "\n"; print '2位の日付:
' . "\n"; print '2位の件数:
' . "\n"; print '3位の日付:
' . "\n"; print '3位の件数:
' . "\n"; print '4位の日付:
' . "\n"; print '4位の件数:
' . "\n"; print '5位の日付:
' . "\n"; print '5位の件数:
' . "\n"; print '
'; print 'パスワード:
' . "\n"; print '
'; print ''; print ''; print '
'; print '' . "\n"; print '   '; print '' . "\n"; print '   '; print '戻る'; print '
'; print '
' . "\n"; print '' . "\n"; } ### sub html2 end ### ########################################## # # # 入力されたデータのチェックルーチン # # # ########################################## sub check { # タグの無効化 for ($i=0; $i<=$max; $i++) { $ckdt=$in{cnt.$i} ; &tagck ; $in{cnt.$i}=$ckdt; } # end of for $ckdt=$in{'pwd'} ; &tagck ; $in{'pwd'}=$ckdt; # パスワードが合わないと更新しません if ($in{'pwd'} ne $password) { &error(1) } # 月は12、日は31を越えるものはエラー if ($in{'cnt2'} > 12) { &error(2) } if ($in{'cnt3'} > 31) { &error(3) } if ($in{'cnt6'} > 12) { &error(4) } if ($in{'cnt7'} > 31) { &error(5) } # 月合計と累計は同じという条件を入れると #$a=0; #$n=17; #until ($n > 29) {$a=$a+$in{'cnt'.$n.''};$n++;} #if ($in{'cnt0'} != $a) { &error(6) } ######################################## # チェック通過 &update; # 更新後、再読み込みする print "Location: $reload" . '?' . "\n\n"; exit; } # # タグの無効化サブルーチン # sub tagck { $ckdt =~ s//>/ig; $ckdt =~ s///ig; } ############################################# # # # チェックエラー表示画面ルーチン      # # # ############################################# sub error { # &error(xx); で呼び出されたルーチンは、()内の数字が $error に代入される。 $error = $_[0]; if ($error eq "0") { $error_msg = 'ファイルがない、またはOPENできない。'; } elsif ($error eq "1") { $error_msg = 'パスワードが合わないと更新しません。'; } elsif ($error eq "2") { $error_msg = '本日日付の月がおかしい。'; } elsif ($error eq "3") { $error_msg = '本日日付の日がおかしい。'; } elsif ($error eq "4") { $error_msg = '最終更新日の月がおかしい。'; } elsif ($error eq "5") { $error_msg = '最終更新日の日がおかしい。'; } elsif ($error eq "6") { $error_msg = '累計と月合計が不一致です。'; } print "Content-type: text/html\n\n"; print 'カウントファイルの保守' . "\n"; print '' . "\n"; print '

カウントファイルの保守の入力で下記のエラーが発生しました

' . "\n"; print "$error_msg\n"; print '
'; # リロードでもどると入力データが消えてしまうので print 'ブラウザ画面の戻るをクリックする'."\n";; print '
'; print '

' . "\n"; exit; } # テーブルを0で初期化する sub syokika { while ($#cnt + 1 < $max) { @cnt = (0,@cnt); } } ########################################## # # # ファイル更新処理           # # # ########################################## sub update { # 入力データをカンマでつないで1行データにする $n=0; $cnt=""; until ($n > $max) { if ($in{'cnt'.$n.''} eq "") {$in{'cnt'.$n.''} = "0";} $cnt=$cnt.$in{'cnt'.$n.''}.","; $n++;} # ファイル登録 if (!open(DATA,">$file")) { &error(0); } flock(DATA,2); print DATA $cnt; flock(DATA,8); close (DATA); ### sub update end ### } ################### end of script ################