- カウンタ昨日と今日 -

Perlとは

日を取得して、それを.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の「?」以降に格納する文字列の事をクエリ文字列と言う。

Perlとは

#!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);
}

ダウンロード

重複カウント防止の完成版↑