3. PHP + MySQL によるアクセスカウンタ (テキスト出力) (アクセスログ機能付)

・単一のドメイン用のアクセスカウンタです
 (あえてドメインを無視してパスで記録しています)
・データーベース(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']; // 回数を取得
  
  $query = "insert into AccessLog values ('".$tempDateTime."',".
                                          "'".$path."',".
                                          "'".$HTTP_REFERER."',".
                                          "'".$count."',".
                                          "'".$_SERVER["HTTP_USER_AGENT"]."',".
                                          "'".$_SERVER['REMOTE_ADDR']."',".
                                          "'".gethostbyaddr($_SERVER['REMOTE_ADDR'])."')";
  $result = mysql_query($query, $link); // アクセスログを記録
  
  $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);
?>
<?php
// AccessLogテーブルを作成
// アクセスログ用

  // サーバー名,ユーザー名,パスワード,データーベース名 は必ず正しい情報を設定すること
  $link = mysql_connect('[サーバー名]', '[ユーザー名]', '[パスワード]');
  mysql_select_db('[データーベース名]' ,$link);

// 再作成する場合は以下2行のコメントをはずす
//  $query = "DROP TABLE IF EXISTS AccessLog";
//  $result = mysql_query($query, $link);

  $query = "CREATE TABLE AccessLog (".
           "  DateTime varchar(16) NOT NULL default '',".
           "  Path varchar(64) NOT NULL default '',".
           "  FullPath varchar(255) NOT NULL default '',".
           "  Count int(11) NOT NULL default '0',".
           "  UserAgent varchar(128) NOT NULL default '',".
           "  RemoteAddr varchar(64) NOT NULL default '',".
           "  HostName varchar(64) NOT NULL default '',".
           "  PRIMARY KEY (DateTime)".
           ") TYPE=MyISAM";
  $result = mysql_query($query, $link);
?>
...