- カウンタその他設定 -
♣重複カウントの防止
重複カウントを防止する方法として、カウンタが前の訪問者のIPアドレスを覚えておき、 同一のIPアドレスからアクセスした場合にはカウントをとらないようにする。
◆IPアドレスの取得
$ipadd = $ENV{'REMOTE_ADDR'};
◆語尾切り取り
chop $str; #文字列の最後の文字を切り取る
chomp $str; #文字列の最後の改行コードを切り取る
※chomp関数で末尾の改行を削除出来る
◆リストの要素を連結して文字列にする
$a = 6;
$b = join("", ("%0", "$a","d"));
print $b;
--------------------------------------
<<結果>>
%06d
◆重複カウントの防止
#!C:\Perl\bin\perl
#====================================================================
# #IPアドレスの取得と重複カウントの防止
#====================================================================
$flg = 0;
$ipadd = $ENV{'REMOTE_ADDR'}; #IPアドレスの取得
#データをすべて配列logdataに読み込む
open (FILE, "<logdata.dat") || die "File Open Err!-logcount.dat\n";
@logdata = <FILE>;
close(FILE);
chomp @logdata; #改行を削除-これをしないと以下の判定が出来ないので注意
#取得したIPアドレスと履歴のIPアドレスを比較======
for($i=0; $i<=$#logdata; $i++){
if($ipadd eq $logdata[$i]){ #新規のIPと過去ログのIPが等しかったら
$flg = 1; #合致するのは1つのアドレスのみ
}
}
#====================================================================
# $flg = 0 だったら、数をカウント
#====================================================================
#カウントデータの読み込み
open(FILE,"<count.dat") || die "File Open Error!-count.dat\n";
$count = <FILE>; #変数countにデータを収納
close(FILE);
if($flg == 0){
$count++; #プラス1をカウント
# ログの更新================================
open(FILE, "+<count.dat") || die "File Open Error!\n";
flock(FILE,2);
seek(FILE, 0, 0); #.datに上書き保存する為にデータの記位置を調整
print FILE $count; #カウントを記録
flock(FILE,8);
close(FILE);
# IPアドレスを更新===========================
open (FILE, ">>logdata.dat") || die "File Open Err!-logcount.dat\n";
print FILE $ipadd,"\n";
close(FILE);
}
print $count; #ディスプレイにカウンタの数字を表示
#====================================================================
# ディスプレイに表示されたカウンタの数字に画像を付ける
#====================================================================
@countdata = split(//, $count); #カウントの数字を配列countに1個ずつ収納する
foreach $cou(@countdata){ #バラバラにされた数字を、変数couに収納
push(@view, "./img/$cou.gif"); #viewと言う配列に画像のソースを追加
}
#==便利なライブラリの呼び出し========================
require "./gifcat.pl"; #requireでgifcat.plと言うファイルを呼び出す
print "Content-type:image/gif\n\n"; #これから出力するのが画像であることを宣言
binmode(STDOUT); #改行の不具合を回避。バイナリモード(画像)で処理する事を宣言
print &gifcat::gifcat(@view); #この文言で画像を表示できる
本にのっているプログラムデータ↑
上記のプログラムデータ↑