- カウンタ昨日と今日 -
♣関連の関数
日を取得して、それを.datに記憶しておき、読み取る事で昨日と今日のアクセスをカウントする
◆日の取得
$ENV{'TZ'} = "JST-9";
$mday = (localtime(time))[3];
◆CGI に引数を付けて値を渡す
引数を付けて実行すると、それぞれの値を画面上に表示される。
URLに続けて ? を入力、その後 要素(キー) = 値(バリュー) とし、それぞれの要素を & で区切ります。
http://〜スクリプト.cgi?要素1=値1 & 要素2=値2 & 要素3=値3
http://〜スクリプト.cgi?tanaka=11 & takeuti=550
---------------------------------------------------
<<サンプル>>
#GETメソッドの場合は QUERY_STRING から受け取る
$formin = $ENV{'QUERY_STRING'};
@indata = split (/&/,$formin); #受け取ったデータを&で区切り、配列へ
foreach $tmp (@indata) #フォームの要素分(配列分)以下の処理を繰り返す
{
($name,$value) = split (/=/,$tmp); # =記号で区切り、名前 と 値 に分ける
$forminh{$name} = $value; #区切った名前を付けた連想配列に値を入れる
}
#受け取った引数により処理を選択する
if ($forminh{'view'} eq 'aaa') { &aaa; }
elsif ($forminh{'view'} eq 'bbb') { &bbb; }
※URLの「?」以降に格納する文字列の事をクエリ文字列と言う。
♣昨日と今日の表示
#!C:\Perl\bin\perl
#=================================================
# 設定項目
#=================================================
require './gifcat.pl';
# 総カウント数の桁数
$digit1 = 6;
# 本/昨日カウント数の桁数
$digit2 = 2;
$gifdir1 = './gif_total';
$gifdir2 = './gif_day';
$mode = $ENV{'QUERY_STRING'};
$mode =~ s/\W//g;
#=================================================
# カウント
#=================================================
if($mode ne "total"){
select(undef,undef,undef,0.5);
}elsif($mode eq "yesday"){
select(undef,undef,undef,0.5);
}
open(FILE,"+<count.dat") || die "File Open Err!-count.dat\n"; #記録ファイル読み込み
flock(FILE,2);
$data = <FILE>; #データをすべて$dataへ収納
($day, $yesday, $today, $count) = split(/<>/, $data);
#日付<>昨日<>本日<>総カウントに分ける
$ENV{'TZ'} = "JST-9";
($mday) = (localtime(time))[3]; #今日の日にちを取得
if ($mode eq "total"){
if ($day == $mday) {
$today++;
} else {
$yesday = $today;
$today = 1;
}
$count++;
seek(FILE, 0, 0);
print FILE "$mday<>$yesday<>$today<>$count"; #記録ファイル更新
truncate(FILE, tell(FILE));
}
flock(FILE,8);
close(FILE);
# 画像表示
if ($mode eq "total") { &gifview($count, $digit1, $gifdir1); }
elsif ($mode eq "yesday") { &gifview($yesday, $digit2, $gifdir2); }
else { &gifview($today, $digit2, $gifdir2); }
exit;
#-------------------------------------------------
# カウンタ画像出力
#-------------------------------------------------
sub gifview {
local(@view);
local($data, $digit, $dir) = @_;
# 桁数調整
while ( length($data) < $digit ) {
$data = '0' . $data;
}
foreach ( split(//, $data) ) {
push(@view,"$dir/$_.gif");
}
# 画像連結
print "Content-type: image/gif\n\n";
binmode(STDOUT);
print &gifcat::gifcat(@view);
}
重複カウント防止の完成版↑