カウンターサンプル

(1)キョロちゃんの第1作 

キョロちゃんが初めて作ったスクリプトです。本を見ながらだそうですが、がんばりましたね。拍手
アゲインさんがソースに解説をつけてくれました。
同じディレクトリに counter.log を入れてある都合上、ファイル名を元ファイルから変えてあります。

<p> <?php
//ここで書き込むファイルの指定をしている
$logfile = "./counter1.log";

//$counter変数を初期化して
$counter = 0;

//ここで、./counter.logを開いて、読み込んでる
//で、$fnに./counter.logが代入されてる
if ($fn = @fopen($logfile, 'r')){

//ここで、読み込んだ値を、$counter変数に代入してる。
//trim 前後の空白の除去
//fgets 読み込んだファイル($fn)から1行取得
$counter = trim(fgets($fn));

//開いたファイルを閉じてる
fclose($fn);
}

//で、ブラウザに表示するとき、取得した値に1を足して表示してる
//で、そのまま、$couterの値が1増えてる
print( ++$counter . "人目のお客様です");

//今度は、書き込みモードで./counter.logを開いてる
if( $fn = @fopen($logfile, 'w')){

//で、ここで変更された$counterの値をファイルに書き込んでる
fwrite( $fn, $counter);

//開いたファイルを閉じてる
fclose($fn);
}
?>

(2)リロード対策 

アゲインさんが作成・解説してくださったカウンタースクリプトです。

<?php
$logfile = "./counter2.log";

if ($fn = @fopen($logfile, 'r')){
$str = trim(fgets($fn));
fclose($fn);
}
//ここ少し勉強
//explodeは「<>」で区分された文字列を、分割して変数名に代入するための
//関数です。listは配列に入れるための関数です。
//ここはまた別途勉強しましょう
list($counter,$wDate,$ip)=explode("<>", $str);

//取得した文字列は、下記の通りで
print "取得した文字列:".$str."<BR><BR>";

//これを分割して表示すると
print "前回カウント:".$counter."<BR>";
print "前回IP:".$ip."<BR>";
print "前回日付:".$wDate."<BR><BR>";

//そして新たに比較する情報は
print "今回カウント:".++$counter."<BR>";
print "今回IP:".$_SERVER["REMOTE_ADDR"]."<BR>";
print "今回日付".date("Y/m/d");

//この辺に条件を入れて、カウントするしないかを決める

//で、そのまま今度はファイルに書くための文字列を作成
$str=$counter."<>".date("Y/m/d")."<>".$_SERVER["REMOTE_ADDR"];

//これで書き込み
if( $fn = @fopen($logfile, 'w')){
fwrite($fn, $str);
fclose($fn);
}

?>

 

(3)フラフィックカウンター 

路子さんから送っていただいたソースに少し変更を加え、カウンタ画像を表示してみました。
考え方としては、カウンターの長さを取り出して数値を分解し数値と同じ画像ファイルを出力させるという単純なものです。
本に載ってなかったので全部自分で考えました。したがってあっているかどうか定かではありません(^^;
残念ながら今のところはカウントしないようです(^^;

<p> <?php
$logfile = "./counter.log";

if ($fn = @fopen($logfile, 'r')){
$str = fgets($fn);
fclose($fn);
}

list($counter,$wDate,$ip)=explode("<>", $str);
print "いらっしゃいませ。あなたは".$counter."人目のお客様です。";


//いじったのはここからです。
//文字の長さを数える
//長さ分だけ繰り返す
//数値と対応する画像を出力する

$text_len = strlen($counter);
echo "<br><center>";
for ($i = 0; $i < $text_len; $i++) {
$gcount = substr($counter,$i,1);
echo "<img src='$gcount.gif'>";

}
echo "</center>";
//ここまで

$NewIP=$_SERVER["REMOTE_ADDR"];
$NewDate=date("Y/m/d");

if ($ip!=$NewIP OR $wDate!=$NewDate){

}else{

}

$str=$counter."<>".$NewDate."<>".$NewIP;

if( $fn = @fopen($logfile, 'w')){
flock($fn,2);
fwrite($fn, $str);
fclose($fn);
}
?>

 

(4)IPと秒数でカウント 

(2)のサンプル(アゲインさんの解説)を見て作りました。今回は時間計算にチャレンジしてみました。PHPのデータ形式には日付というのはないようなのですが、タイムスタンプを使って計算させることができるようです。strtotime()関数は、日付文字列からタイムスタンプに変換してくれます。

<?php
$logfile = "./count.log";

if ($fn = @fopen($logfile, 'r')){
 $str = trim(fgets($fn));
 fclose($fn);
}

//explodeは「<>」で区分された文字列を、分割して変数名に代入するための関数です。
//listは配列に入れるための関数です。

list($counter,$wDate,$ip)=explode("<>", $str);

//取得した文字列
print "取得した文字列:".$str."<BR><BR>";

//前回のIPと日付
$zenkai_ip = $ip;
$zenkai_hizuke = $wDate;

//今回のIPと日付
$konkai_ip = $_SERVER["REMOTE_ADDR"];
$konkai_hizuke = date("Y/m/d H:i:s");

//日付からタイムスタンプを取得
$d1 = strtotime($zenkai_hizuke);
$d2 = strtotime($konkai_hizuke);
$keika_time = $d2 - $d1;

//間隔を秒で指定
$kankaku = 10;

echo "<br>前回IP: $zenkai_hizuke";
echo "<br>今回IP: $konkai_hizuke";
echo "<br>経過秒: $keika_time";
print "<br>";

//カウントしない条件(同じIPで10分以内)
if ($konkai_ip == $zenkai_ip and ($keika_time <=$kankaku)) {
  echo "<br>同じIPで $kankaku 秒以内です。カウントしません";
}
else{

  echo "<br> 前回アクセスから$kankaku 秒を過ぎているのでカウントアップします。";
  echo "<br>".++$counter;

  //そのまま今度はファイルに書くための文字列を作成
  $str=$counter."<>".date("Y/m/d H:i:s")."<>".$_SERVER["REMOTE_ADDR"];

  //これで書き込み
  if( $fn = @fopen($logfile, 'w')){
  fwrite($fn, $str);
  fclose($fn);
  }

}

//カウンタ表示
echo "<p>";
echo "<center>";
$text_len = strlen($counter);
for ($i = 0; $i < $text_len; $i++) {
  $gcount = substr($counter,$i,1);
  echo "<img src='$gcount.gif'>";
}
echo "</center>";
?>

(5)グラフィックカウンター 

アゲインさんのヘルプのおかげで無事稼動することができました。設置場所は私のトップページです。
仕様は次のようにしましたが、ベースはアゲインさん添削の(2)のスクリプトです。

  1. 同じIPで60秒以内の場合はカウントしないというリロード対策を施しました。
  2. イメージ画像を扱えるようにしました。
  3. 5桁まで表示するようにしました。(%を使った)
  4. SHTMからPHPを呼び出しています。

<?php
$logfile = "./count.log";

if ($fn = @fopen($logfile, 'r')){
 $str = trim(fgets($fn));
 fclose($fn);
}

//explodeは「<>」で区分された文字列を、分割して変数名に代入するための関数です。
//listは配列に入れるための関数です。

list($counter,$wDate,$ip)=explode("<>", $str);

//取得した文字列
//print "取得した文字列:".$str."<BR><BR>";

//前回のIPと日付
$zenkai_ip = $ip;
$zenkai_hizuke = $wDate;

//今回のIPと日付
$konkai_ip = $_SERVER["REMOTE_ADDR"];
$konkai_hizuke = date("Y/m/d H:i:s");

//日付からタイムスタンプを取得
$d1 = strtotime($zenkai_hizuke);
$d2 = strtotime($konkai_hizuke);
$keika_time = $d2 - $d1;

//間隔を秒で設定
$kankaku = 60;

//(同じIPで6$kankaku秒以内はカウントしない
if ($konkai_ip == $zenkai_ip and ($keika_time <=$kankaku)) {

}
else{

  //カウントアップします
  $counter = $counter + 1;

  //そのまま今度はファイルに書くための文字列を作成
  $str=$counter."<>".date("Y/m/d H:i:s")."<>".$_SERVER["REMOTE_ADDR"];

  //これで書き込み
  if( $fn = @fopen($logfile, 'w')){
    fwrite($fn, $str);
    fclose($fn);
  }
}

//カウンタを5桁で表示(%は余りを求める演算子)
echo "<p>";
echo "<center>";
echo "<img src=\"./counter/cimg/",($counter /10000) % 10, ".gif\">";
echo "<img src=\"./counter/cimg/",($counter /1000) % 10, ".gif\">";
echo "<img src=\"./counter/cimg/",($counter / 100) % 10, ".gif\">";
echo "<img src=\"./counter/cimg/",($counter / 10) % 10, ".gif\">";
echo "<img src=\"./counter/cimg/",($counter ) % 10, ".gif\">";
echo "</center>";

?>