#! /usr/local/bin/perl # # id=cntmtn4.cgi # # 新アクセスカウントファイルのパラメータとカウントデータを # フォーム画面から更新する  # # update. 98.1.31 # 日本語コード変換ライブラリの指定 # &ReadParse命令で、$in{ }の変数にフォーム入力データが格納される require 'cgi-lib.pl'; require 'jcode.pl'; &ReadParse; $file = "/dialup/chichibu/cgi-bin/acscnt2.dat"; $reload = 'http://www0.kumagaya.or.jp/cgi-bin/users/chichibu/cntmtn4.cgi'; $reload2 = 'http://www0.kumagaya.or.jp/cgi-bin/users/chichibu/cntmtn3.cgi'; $password = "password"; $bkhmpg = "http://www.kumagaya.or.jp/~chichibu/cgi1.html"; # 1レコード:パラメータ # ID=0,タイトル,何日前,上位数,下位数,通過日件数, # 0 1 2 3 4 # 累積される(クリアしない) # ID=a,累積,開始日,本日件数,本日日付, # ID=b,累積時間帯別数 # ID=c,累積曜日別数 # ID=d,累積月別数 # ID=e,1日前の日付と件数,2日前,3日前,4日前,5日前,.... # ID=f.上位件数の上位から,日付,件数,日付,件数,, # ID=g,下位件数の下位から,日付,件数,日付,件数,, # ID=h,通過件数,通過日,通過件数,通過日,通過件数,通過日,,,,,最大20まで # 設定によりクリアされる # ID=i,開始日,終了日, 時間帯別件数 # ID=j,開始日,終了日, 時間帯別件数の前回 # ID=k,開始日,終了日, 時間帯別件数の前々回 # ID=l,開始日,終了日, 曜日別件数 # ID=m,開始日,終了日, 曜日別件数の前回 # ID=n,開始日,終了日, 曜日別件数の前々回 # ID=o,開始日,終了日, 月別件数 # ID=p,開始日,終了日, 月別件数の前回 # ID=q,開始日,終了日, 月別件数の前々回 # 範囲(最小と最大) $min1=0; $max1=10; $min2=0; $max2=10; $min3=0; $max3=10; $min4=0; $max4=1000; # 時間帯の単位 $mei5[1]='1時間毎'; $mei5[2]='2時間毎'; $mei5[3]='3時間毎'; $mei5[4]='4時間毎'; $mei5[6]='6時間毎'; $mei5[12]='12時間毎'; # 時間帯別件数のゼロリセット $mei6[1] = '1週間毎'; $mei6[2] = '1ヶ月毎'; $mei6[3] = '1年毎'; # 曜日別件数のゼロリセット $mei7[1] = '1週間毎'; $mei7[2] = '1ヶ月毎'; $mei7[3] = '1年毎'; # する、しない $yn[1]='する'; $yn[2]='しない'; # 曜日名 @yobimei = ('日','月','火','水','木','金','土'); #################################### # # # メインルーチン(処理の分岐) # # # #################################### # 全体の流れを決定する # パラメータ設定画面 # カウント表示画面 # カウント修正画面 # エラー表示画面 if ($in{'action'} eq 'check') { ✓ } else { &html2; } ##################### # ファイルを読む # ##################### sub read { if (!open(DATA,"$file")) { &error(0); } @record = ; close(DATA); # 各レコードを@cntdataにセット foreach (@record) { chop($_); # パラメータIDとデータ部に分ける ($id,$value) = split(/\:/,$_); # IDを変数名に入れて各項目に分解する $cntdata{$id} = $value; } # end of foreach # ID=0はパラメータ @cnt0 = split(/\,/,$cntdata{0}); # ID=a,累積,開始日,本日件数,本日日付,曜日 @cnta = split(/\,/,$cntdata{'a'}); # ID=b,累積時間帯別数 @cntb = split(/\,/,$cntdata{'b'}); # ID=c,累積曜日別数 @cntc = split(/\,/,$cntdata{'c'}); # ID=d,累積月別数 @cntd = split(/\,/,$cntdata{'d'}); # ID=e.履歴 @cnte = split(/\,/,$cntdata{'e'}); # ID=f.上位件数の上位から,,,,,, @cntf = split(/\,/,$cntdata{'f'}); # ID=g,下位件数の下位から,,,,,, @cntg = split(/\,/,$cntdata{'g'}); @cnth = split(/\,/,$cntdata{'h'}); @cnti = split(/\,/,$cntdata{'i'}); @cntj = split(/\,/,$cntdata{'j'}); @cntk = split(/\,/,$cntdata{'k'}); @cntl = split(/\,/,$cntdata{'l'}); @cntm = split(/\,/,$cntdata{'m'}); @cntn = split(/\,/,$cntdata{'n'}); @cnto = split(/\,/,$cntdata{'o'}); @cntp = split(/\,/,$cntdata{'p'}); @cntq = split(/\,/,$cntdata{'q'}); } # end of read #################################### # # # フォーム入力画面出力ルーチン # # # #################################### sub html2 { &read; # CGIで出力されたデータをHTMLとして認識させるヘッダの出力 print "Content-type: text/html\n\n"; print 'カウントファイルの保守 1/31' . "\n"; print ''."\n"; print 'カウントファイルの保守

' . "\n"; print '

' . "\n"; print '' . "\n"; print ''; print ''; print '
累計  '."\n"; print '開始日 '; print '年' . "\n"; print '月' . "\n"; print '日' . "\n"; print '
'; print '
'; print ''; print ''; print ''; print ''; print "\n"; print ''; print '
本日件数'."\n"; print '本日日付年' . "\n"; print '月' . "\n"; print '日' . "\n"; print ' $yobimei[$cnta[11]]曜日 区分' . "\n"; print '
'; print '
'; print ''; print ''; print ''; print ''; # 初期化直後はデータがない if ($cnta[9] > 0) { print "\n"; } else { print "\n"; } print ''; print '
前日件数'."\n"; print '前日日付' . "\n"; print ' $yobimei[$cnta[12]]曜日  区分' . "\n"; print '
'; print '
'; ###################################################### # 履歴(区分0の時は表示しない、ここでは最大30件分までとする) if ($cnt0[1] > 0) { print "\n"; print "\n"; $max=$cnt0[1]; if ($max > 30) {$max = 30} for ($i=1; $i <=$max; $i++) { # 日付は0,2,4,6... $a=2 * ($i - 1); # 件数は1,3,5,7... $b=2 * ($i - 1) + 1; print "'."\n"; } # end of for print '
日付件数
\n"; print ''."\n"; print '

'; } # end of if ############################### # 時間帯別 ############################### print ''; print ''; # 前回 print ''; # 前々回 print ''; # 累計(ID=b) print ''; # 外枠 print '
'; print ''."\n"; print "\n"; print ''."\n"; print "\n"; print ''."\n"; print "\n"; for ($i=0; $i <=23; $i++) { $sji=$i; $eji=$sji+1; $jikan="$sji"."時〜"."$eji"."時"; print "\n"; print ''."\n"; } # end of for print '
今回
開始日
終了日
時間帯件数
$jikan
'; print '
'; print ''."\n"; print "\n"; print ''."\n"; print "\n"; print ''."\n"; print "\n"; for ($i=0; $i <=23; $i++) { $sji=$i; $eji=$sji+1; $jikan="$sji"."時〜"."$eji"."時"; print "\n"; print ''."\n"; } # end of for print '
前回
開始日
終了日
時間帯件数
$jikan
'; print '
'; print ''."\n"; print "\n"; print ''."\n"; print "\n"; print ''."\n"; print "\n"; for ($i=0; $i <=23; $i++) { $sji=$i; $eji=$sji+1; $jikan="$sji"."時〜"."$eji"."時"; print "\n"; print ''."\n"; } # end of for print '
前々回
開始日
終了日
時間帯件数
$jikan
'; print '
'; print ''."\n"; print "\n"; print ''."\n"; print "\n"; print ''."\n"; print "\n"; for ($i=0; $i <=23; $i++) { $sji=$i; $eji=$sji+1; $jikan="$sji"."時〜"."$eji"."時"; print "\n"; print ''."\n"; } # end of for print '
累計
開始日
終了日
時間帯件数
$jikan
'; print '
'; ############################### # 曜日別 ############################### print '';print ''; # 曜日別 print ''; # 曜日別 print ''; # 曜日別(ID=c) print ''; # 外枠 print '
'; print ''."\n"; print "\n"; print ''."\n"; print "\n"; print ''."\n"; print "\n"; for ($i=0; $i <=6; $i++) { $yobi=$yobimei[$i]."曜"; print "\n"; print ''."\n"; } # end of for print '
今回
開始日
終了日
曜日件数
$yobi
'; print '
'; print ''."\n"; print "\n"; print ''."\n"; print "\n"; print ''."\n"; print "\n"; for ($i=0; $i <=6; $i++) { $yobi=$yobimei[$i]."曜"; print "\n"; print ''."\n"; } # end of for print '
前回
開始日
終了日
曜日件数
$yobi
'; print '
'; print ''."\n"; print "\n"; print ''."\n"; print "\n"; print ''."\n"; print "\n"; for ($i=0; $i <=6; $i++) { $yobi=$yobimei[$i]."曜"; print "\n"; print ''."\n"; } # end of for print '
前々回
開始日
終了日
曜日件数
$yobi
'; print '
'; print ''."\n"; print "\n"; print ''."\n"; print "\n"; print ''."\n"; print "\n"; for ($i=0; $i <=6; $i++) { $yobi=$yobimei[$i]."曜"; print "\n"; print ''."\n"; } # end of for print '
累計
開始日
終了日
曜日件数
$yobi
'; print '

'; ############################################# # 上位(区分0の時は表示しない) print ''; print ''; # 外枠 print '
'; if ($cnt0[2] > 0) { print "\n"; print "\n"; for ($i=1; $i <=$cnt0[2]; $i++) { $juni="$i"."位"; # 日付は0,2,4,6... $a=2 * ($i - 1); # 件数は1,3,5,7... $b=2 * ($i - 1) + 1; print "\n"; print ''."\n"; print ''."\n"; } # end of for print '
上位日付件数
$juni
'; } # end of if print '
'; ###################################################### # 下位(区分0の時は表示しない) if ($cnt0[3] > 0) { print "\n"; print "\n"; for ($i=1; $i <=$cnt0[3]; $i++) { $juni="$i"."位"; # 日付は0,2,4,6... $a=2 * ($i - 1); # 件数は1,3,5,7... $b=2 * ($i - 1) + 1; print "\n"; print ''."\n"; print ''."\n"; } # end of for print '
下位日付件数
$juni
'; } # end of if print '

'; ###################################################### # 通過日(区分0の時は表示しない、ここでは最大20件分までとする) if ($cnt0[4] > 0) { print "\n"; print "\n"; for ($i=1; $i <=20; $i++) { # 件数は0,2,4,6... $a=2 * ($i - 1); # 日付は1,3,5,7... $b=2 * ($i - 1) + 1; print "'."\n"; } # end of for print '
件数日付
\n"; print ''."\n"; print '

'; } # end of if ############################### ############################### # 月別 print ''; print ''; # 前年 print ''; # 前々年 print ''; # 累計(ID=d) print ''; # 外枠 print '
'; print ''."\n"; print "\n"; print ''."\n"; print "\n"; print ''."\n"; print "\n"; for ($i=0; $i <=11; $i++) { $n=$i + 1; $tuki="$n"."月"; print "\n"; print ''."\n"; } # end of for print '
今年
開始日
終了日
件数
$tuki
'; print '
'; print ''."\n"; print "\n"; print ''."\n"; print "\n"; print ''."\n"; print "\n"; for ($i=0; $i <=11; $i++) { $n=$i + 1; $tuki="$n"."月"; print "\n"; print ''."\n"; } # end of for print '
前年
開始日
終了日
件数
$tuki
'; print '
'; print ''."\n"; print "\n"; print ''."\n"; print "\n"; print ''."\n"; print "\n"; for ($i=0; $i <=11; $i++) { $n=$i + 1; $tuki="$n"."月"; print "\n"; print ''."\n"; } # end of for print '
前々年
開始日
終了日
件数
$tuki
'; print '
'; print ''."\n"; print "\n"; print ''."\n"; print "\n"; print ''."\n"; print "\n"; for ($i=0; $i <=11; $i++) { $n=$i + 1; $tuki="$n"."月"; print "\n"; print ''."\n"; } # end of for print '
累計
開始日
終了日
件数
$tuki
'; print '
'; ########################################################3 print '
'; print ''; print '
'; print 'パスワード '."\n"; print ' '; print '' . "\n"; print ' '; print '' . "\n"; print ' '; print '戻る'; print '
'; print '
'."\n"; print '' . "\n"; } ### sub html2 end ### ########################################## # # # 入力されたデータのチェックルーチン # # # ########################################## sub check { &read; $ckdt=$in{'pwd'} ; &tagck ; $in{'pwd'}=$ckdt; # パスワードが合わないと更新しません if ($in{'pwd'} ne $password) { &error(99) } # 月は12、日は31を越えるものはエラー #if ($in{'cnt****'} > 12) { &error(2) } # チェック通過 &update; # 更新後、再読み込みする print "Location: $reload" . '?' . "\n\n"; exit; } # # 数字以外を無効するサブルーチン # sub numck { $ckdt =~ s/[^0-9]//g; } # # タグの無効化サブルーチン(パスワードチャック) # 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 = '累計と月合計が不一致です。'; } elsif ($error eq "99") { $error_msg = 'パスワード不一致エラー'; } print "Content-type: text/html\n\n"; print 'カウントファイルの保守' . "\n"; print '' . "\n"; print '

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

' . "\n"; print '

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

'; # リロードでもどると入力データが消えてしまうので print 'ブラウザ画面の戻るをクリックする'."\n";; print '' . "\n"; # サブルーチンからプログラムを抜けるので exit; } ########################################## # # # ファイル更新処理           # # # ########################################## sub update { # $maxは0から始まる配列件数 # ID=a,累積,開始日,本日件数,本日日付,曜日 $id='a'; $max=12; &dataset; # ID=b,累積時間帯別数 $id='b'; # 合計件数再計算 &goukei; $in{cntb26} = $total; $max=26; &dataset; # ID=c,累積曜日別数 $id='c'; $max=8; &dataset; # ID=d,累積月別数 $id='d'; $max=13; &dataset; # ID=e,1日前,2日前,3日前,4日前,5日前,.... $id='e'; $max=$cnt0[1]; &dataset; # ID=f.上位件数の上位から,,,,,, $id='f'; $max=$cnt0[2] * 2;$max--; &dataset; # ID=g,下位件数の下位から,,,,,, $id='g'; $max=$cnt0[3] * 2;$max--; &dataset; # ID=h,通過件数,通過日,通過件数,通過日,通過件数,通過日,,,,,最大20まで $id='h'; $max=39; &dataset; # 設定によりクリアされる # ID=i,開始日,終了日, 時間帯別件数 $id='i'; # 合計件数再計算 &goukei; $in{cnti26} = $total; $max=26; &dataset; # ID=j,開始日,終了日, 時間帯別件数の前回 $id='j'; # 合計件数再計算 &goukei; $in{cntj26} = $total; $max=26; &dataset; # ID=k,開始日,終了日, 時間帯別件数の前々回 $id='k'; # 合計件数再計算 &goukei; $in{cntk26} = $total; $max=26; &dataset; # ID=l,開始日,終了日, 曜日別件数 $id='l'; $max=8; &dataset; # ID=m,開始日,終了日, 曜日別件数の前回 $id='m'; $max=8; &dataset; # ID=n,開始日,終了日, 曜日別件数の前々回 $id='n'; $max=8; &dataset; # ID=o,開始日,終了日, 月別件数 $id='o'; $max=13; &dataset; # ID=p,開始日,終了日, 月別件数の前回 $id='p'; $max=13; &dataset; # ID=q,開始日,終了日, 月別件数の前々回 $id='q'; $max=13; &dataset; ########################### # 登録要配列にデータセット %new=(); $i = 0; @key=keys(%cntdata); foreach (@key) { $value = "$_\:$cntdata{$_}\n"; push(@new,$value); } # ファイル登録 if (!open(DATA,">$file")) { &error(0); } flock(DATA,2); print DATA @new; flock(DATA,8); close (DATA); } ### sub update end ### ###################################### # 記録データレコード作成ルーチン # ###################################### sub dataset { # 入力データをカンマでつないで1行データにする $cnt=""; $a="cnt".$id; for ($n = 0; $n <=$max; $n++) { # 数字以外除く $ckdt=$in{$a.$n} ; &numck ; $in{$a.$n}=$ckdt; if ($in{$a.$n} eq "") {$in{$a.$n} = "0";} $cnt=$cnt.$in{$a.$n}."\,"; } # パラメータ部を入れ替える $cntdata{$id}= $cnt; } # end of sub ###################################### # 時間帯別の合計を求める     # ###################################### sub goukei { $total = 0; $a="cnt".$id; for ($n = 0; $n <=23; $n++) { $total =$total + $in{$a.$n}; } } # end of sub ################### end of script ################