・単一のドメイン用のアクセスカウンタです
(あえてドメインを無視してパスで記録しています)
・データーベース(MySQL)を使用するので競合の心配がありません
・出力は数字のテキストです
・「HTTP_REFERER」があることを期待しています。
「HTTP_REFERER」がセットされないアクセスは「(unknown)」でカウントされます
・XMLHttpRequest(Ajax)でアクセスすれば期待した動作をします
<?php
// サーバー名,ユーザー名,パスワード,データーベース名 は必ず正しい情報を設定すること
$link = mysql_connect('[サーバー名]', '[ユーザー名]', '[パスワード]');
mysql_select_db('[データーベース名]' ,$link);
$HTTP_REFERER = $_SERVER['HTTP_REFERER'];
$path = $_SERVER['HTTP_REFERER']; // パスのみを抽出
if (strlen($path) > 0){
$path = substr($path, strpos($path, '/', 7));
$temppos = strpos($path, '?');
if ($temppos !== False) $path = substr($path, 0, $temppos);
}
if (strlen($path) == 0) $path = '(unknown)'; // 取得できない場合
$tempDateTime = date('YmdHis');
$query = "select * from AccessCount where Path='".$path."'";
$result = mysql_query($query, $link);
$line = mysql_fetch_array($result, MYSQL_ASSOC);
$count = trim($line['Count']);
if (strlen($count) > 0){ // 目的のpathはあるか?
$query = "update AccessCount set count=count+1,LastUpdate='".$tempDateTime."' where Path='".$path."'";
$result = mysql_query($query, $link); // あれば回数を加算
}
else{
$query = "insert into AccessCount values ('".$path."',1,'".$tempDateTime."')";
$result = mysql_query($query, $link); // 無ければ1回で生成
}
$query = "select * from AccessCount where Path='".$path."'";
$result = mysql_query($query, $link);
$line = mysql_fetch_array($result, MYSQL_ASSOC);
$count = $line['Count']; // 回数を取得
$strcount = substr('0000000000'.$count, -6); // ゼロつき6桁に整形
echo $strcount; // 文字列を出力
?>
・使用するデーターベースは以下のプログラムで作成してください
<?php
// AccessCountテーブルを作成
// アクセスカウンタ用
// サーバー名,ユーザー名,パスワード,データーベース名 は必ず正しい情報を設定すること
$link = mysql_connect('[サーバー名]', '[ユーザー名]', '[パスワード]');
mysql_select_db('[データーベース名]' ,$link);
// 再作成する場合は以下2行のコメントをはずす
// $query = "DROP TABLE IF EXISTS AccessCount";
// $result = mysql_query($query, $link);
$query = "CREATE TABLE AccessCount (".
" Path varchar(128) NOT NULL default '',".
" Count int(11) NOT NULL default '0',".
" LastUpdate varchar(16) NOT NULL default '',".
" PRIMARY KEY (Path)".
") TYPE=MyISAM";
$result = mysql_query($query, $link);
?>
...