PHP+MySQLホームページアクセス解析ツール

製作: 小川 邦久

ご意見・ご感想

プライバシーポリシー

Copyright (C) 2010 KUNISAN.JP.
All Rights Reserved.


プログラム

プログラム(PHP)を一部公開します。モジュール等、他のプログラムについてはトップページからファイルセットをダウンロードして確認してください。


データ蓄積用プログラム(メイン部 Ver1.1)

<?php
//ホームページアクセス解析ツール - (C)KUNISAN.JP 2010
//アクセスデータ追加処理プログラム

//カウンターのフィールド名一覧(括弧内はデータ型)
//0.PV(INT/auto_increment) 1.TIME(INT) 2.IP(TEXT) 3.USERAGENT(TEXT) 4.UV(INT) 5.REFERER(TEXT) 6.PAGEURL(TEXT)
//7.EX1(TEXT) 8.EX2(TEXT)

//使用言語とエンコードの指定
mb_language("ja");
mb_internal_encoding("SJIS");
mb_regex_encoding("SJIS");

$version = $_GET[V]; //バージョンの取得

$qe = $_SERVER['QUERY_STRING'];
$data1 = mb_split('&ID=',$qe);
$data2 = mb_split('&&&',$data1[1]);
$id = $data2[0]; //IDの取得

$data1 = mb_split('&D1=',$qe);
$data2 = mb_split('&&&',$data1[1]);
$referer = $data2[0]; //アクセス元取得

$data1 = mb_split('&D2=',$qe);
$data2 = mb_split('&&&',$data1[1]);
$pageurl = $data2[0]; //ページURL取得
$pageurl = str_replace('www.','',$pageurl); //●●●集計時に不具合が出るので、ページURLのwwwは削除

$data1 = mb_split('&D3=',$qe);
$data2 = mb_split('&&&',$data1[1]);
$ex1 = rawurldecode($data2[0]); //付加データ(1)取得

$data1 = mb_split('&D4=',$qe);
$data2 = mb_split('&&&',$data1[1]);
$ex2 = rawurldecode($data2[0]); //付加データ(2)取得

//カウンタ設置ページのアドレス(指定ドメイン以外のページにJavaScriptを仕込んでカウンターを誤作動させることの
//無いようにするため、PHPでも直にページURLを取得する)
$pag_info = $_SERVER['HTTP_REFERER']; 
$check = split('/',$pag_info);
$check_domain = str_replace('www.','',$check[2]);

//●●●指定のドメインに設置したカウンターであれば、カウンター動作
if (($check_domain == 'abc.jp')||($check_domain == 'def.jp')) {

	$time = time(); //タイムスタンプの取得
	$ip = $_SERVER['REMOTE_ADDR']; //クライアントのIPアドレス取得
	$useragent = $_SERVER['HTTP_USER_AGENT']; //ユーザーエージェントヘッダーの取得

	//データベース交信モジュール実行
	require('module_connection.php');

	//UVを抽出
	$sql = 'SELECT max(UV) FROM '.$id;

	//DB結果を取得
	if ($data = mysql_query($sql)) {

		//DB結果セットの表示
		while ($sd = mysql_fetch_array ($data)) {
			
			//UVの最大値取得
			$max_uv = $sd[0];
	
		}

		//同日内に同じIP、USERAGENT、IDから来たアクセスか確認。
		$sql = 'SELECT max(UV), IP, USERAGENT FROM '.$id.' WHERE IP = \''.$ip.'\' AND 
		USERAGENT = \''.$useragent.'\' AND floor((TIME + 32400)/86400) = 
		'.floor(($time + 32400)/86400).' LIMIT 1';

		//DB結果を取得
		$data = mysql_query($sql);

		//DB結果セットの表示
		while ($sd = mysql_fetch_array ($data)) {
			
			//UVの現在値取得(データあれば)
			$current_uv = $sd[0];
	
		}

		//同日内に同じアクセスがある場合にはUVを更新せず、ない場合にはUVに1追加する
		if ($current_uv > 0) {
		
			$uv = $current_uv;	

		} else {

			$uv = $max_uv + 1;

		}	

		//テーブルにレコードを追加する
		$sql = 'INSERT INTO '.$id.'
		(TIME,IP,USERAGENT,UV,REFERER,PAGEURL,EX1,EX2)
		VALUES
		('.$time.',"'.$ip.'","'.$useragent.'",'.$uv.',"'.$referer.'","'.$pageurl.'","'.$ex1.'",
		"'.$ex2.'")';

		if (mysql_query($sql)) {
		
			//print $sd[1].'レコード追加成功<br>';	

		} else {

			//print 'レコード追加失敗<br>';	

		}

	} else {

		//テーブル作成実行
		require('db_create.php');
	
	}

	//自動アーカイブチェック
	$time_recorded = file_get_contents('time_for_archive.cnt');

	//記録されている時刻が1日以上前の場合には自動アーカイブ処理実行
	if ($time_recorded < ($time - 86400)) {
			
		//ゼロの場合にはアーカイブ化しない
		if ($past_date > 0) {
			
			//アーカイブ自動実行
			require('auto_archive.php');

		}

		//新たに時刻を記録
		file_put_contents('time_for_archive.cnt',$time);
		
		//初回に自動消去と時間が重ならないよう2時間ずらす
		$auto_a = 7200;
		
	}

	//自動消去チェック
	$time_recorded = file_get_contents('time_for_delete.cnt');

	//記録されている時刻が1日以上前の場合には自動アーカイブ処理実行
	if ($time_recorded < ($time - 86400)) {
			
		//ゼロの場合にはアーカイブ化しない
		if ($delete_date > 0) {
			
			//アーカイブ自動実行
			require('auto_delete.php');

		}

		//新たに時刻を記録
		file_put_contents('time_for_delete.cnt',($time + $auto_a));
		
	}

	//mySQLとの接続を解除
	mysql_close();

}

?>


管理画面トップ用プログラム(メイン部 Ver1.1)

<?php
//ホームページアクセス解析ツール - (C)KUNISAN.JP 2010
//管理トップ画面及び一覧表示処理プログラム

//使用言語とエンコードの指定
mb_language("ja");
mb_internal_encoding("SJIS");
mb_regex_encoding("SJIS");	
	
//データベース交信モジュール実行
require('module_connection.php');

print '<html>
<head>
<meta http-equiv="Content-Language" content="ja">
<meta http-equiv="Content-Type" content="text/html; charset=Shift_JIS">
<link rel="stylesheet" href="basic.css" type="text/css">
<link rel="shortcut icon" href="http://kunisan.jp/k.ico">
<title>サイト管理ページ</title>
</head>
<body>
<!--●●タイトルロゴ開始--><!--●●タイトルロゴ終了--> <b>サイト管理ページ</b> -
'.date('Y/m/d H:i:s',time()).' <!--●●管理用リンク開始--><a href="table.php" 
target="_blank">【テーブル表示設定編集】</a><!--●●管理用リンク終了--><br>
<div style="margin-top: 4px; font-size: 70%;"></div>
';

$sql = 'SELECT * FROM tables WHERE VIEW = 1 ORDER BY PRIORITY, OPENDATE DESC';

//DB結果を取得
$data = mysql_query($sql);

//DB結果セットの表示
while ($sd = mysql_fetch_array ($data)) {

	//表示順を取得
	$priority = $sd[PRIORITY];

	//IDを取得
	$id = mb_convert_encoding($sd[ID],'SJIS','UTF-8');

	//タイトルを取得
	$title = mb_convert_encoding($sd[TITLE],'SJIS','UTF-8');
	
	//URLを取得
	$url = mb_convert_encoding($sd[URL],'SJIS','UTF-8');

	//開設日を取得
	$opendate = mb_convert_encoding($sd[OPENDATE],'SJIS','UTF-8');

	//AC設置日を取得
	$acdate = mb_convert_encoding($sd[ACDATE],'SJIS','UTF-8');
	
	//アラームページを取得
	$alarmpage = mb_convert_encoding($sd[ALARMPAGE],'SJIS','UTF-8');

	//アーカイブ有無を取得
	$archive = $sd[ARCHIVE];

	//付加情報を取得
	$addition = mb_convert_encoding($sd[ADDITION],'SJIS','UTF-8');
	
	//EXTRAを取得
	$extra = mb_convert_encoding($sd[EXTRA],'SJIS','UTF-8');
	
	//表示順が100未満の時には赤いブロック、それ以外の時には青いブロック
	if ($priority < 100) {
		print '<div class="block_r">';
	} else {
		print '<div class="block">';
	}

	//chart_making関数の引数(ID,タイトル,URL,開設日,AC設置日,指定日前までのデータ表示,付加ツール(テキスト),
	//アラームページ,アーカイブありなら1,PV非表示なら1)
	chart_making($id,$title,$url,$opendate,$acdate,$past,$addition,$alarmpage,$archive);
	
	print '</div>';

}

print '<br style="clear:both;">';

print '<div class="block_g">';
zentai_chartexb($past);
print '</div>';


print '

<br style="clear: both;">
<div style="margin-top: 4px; font-size: 70%;">

<!--●●コメント開始-->

<!--●●コメント終了-->

</div>
';

function chart_making($id,$title,$url,$open,$set,$term,$add='',$guest='',$arc,$pvv=0) {

	//グローバル変数の定義(全体のアクセス数計算用、グラフ処理用)
	global $glv,$glp,$glvexb,$glpexb,$mag_gr;

	if ($guest != '') {
		
		//データ取得の時間的範囲の設定
		$g_time1 = time(); //現在時
		$g_time2 = $g_time1 - 86400; //24時間前
	
		//指定ページへのアクセスがあった時間を確認
		$sql = 'SELECT PAGEURL,TIME FROM '.$id.' WHERE TIME > '.$g_time2.' AND PAGEURL LIKE
		 \'%'.$guest.'%\' ORDER BY TIME DESC LIMIT 1';

		//DB結果を取得
		$data = mysql_query($sql);

		//DB結果セットの表示
		while ($sd = mysql_fetch_array ($data)) {
			
			//データの取得
			$d1 = $sd[TIME]; //時間
			
			if ($d1 > 0) {
			
				//コメント
				$g_com = '<span style="color: #ff0000;">※'.floor(($g_time1 - $d1)/3600).'
				時間前</span>';
	
			}
			
			break;
			
		}
	
	}
	
	//タイトル表示
	print '<b><a href="'.$url.'" target="_blank">'.$title.'</a></b> 
	'.$g_com.'<br>';

	//初期設定
	$dout = 0; //データ出力数
	$gyo = 0; //出力行数
	$dateb = date('Y/m/d',time()+86400); //日付データ保存(明日の日付けにしておくことで、
	今日のデータがない場合に点線を表示できる) 

	//総UV(閲覧者数)を算出・表示
	$sql = 'SELECT max(UV) AS SW1 FROM '.$id;

	//DB結果を取得
	$data = mysql_query($sql);

	//DB結果セットの表示
	while ($sd = mysql_fetch_array ($data)) {
			
		//データの取得
		$uvc = $sd[SW1]; //UV最大値
	
	}

	//総PV(ページ閲覧数)を算出・表示
	$sql = 'SELECT max(PV) AS SW1 FROM '.$id;

	//DB結果を取得
	$data = mysql_query($sql);

	//DB結果セットの表示
	while ($sd = mysql_fetch_array ($data)) {
			
		//データの取得
		$pvc = $sd[SW1]; //UV最大値
			
	}
		
	//公開日、AC設置日、総アクセス数表示
	print '<span class="s">公開:'.$open.' AC設置日:'.$set.' 総UV:'.$uvc.' 総
	PV:'.$pvc.'</span><br>';

	//データ取得の時間的範囲の設定
	$g_time1 = time(); //現在時
	$g_time2 = strtotime(date('Y/m/d',$g_time1)) - ($term * 86400) - 0; //範囲内の一番過去。

	//日付ごとにUV(閲覧者数)を算出・表示
	$sql = 'SELECT floor((SUB.TIME + 32400)/86400) AS SW1, count(*) AS SW2 FROM (SELECT 
	TIME, UV FROM '.$id.' WHERE TIME >= '.$g_time2.' GROUP BY UV ORDER BY TIME) AS SUB 
	GROUP BY SW1 ORDER BY SUB.TIME DESC';

	//DB結果を取得
	$data = mysql_query($sql);

	//DB結果セットの表示
	while ($sd = mysql_fetch_array ($data)) {
			
		//データの取得
		$d1 = date('Y/m/d',$sd[SW1]*86400); //日付取得
		$d2 = $sd[SW2]; //カウント数取得

		//全体のカウンター追加
		$glv[$d1] = $glv[$d1] + $d2; //UV全体
	
		//ブログパーツを除いた全体のカウンター追加
		if (!mb_eregi('【ブログパーツ】',$title)) {
			$glvexb[$d1] = $glvexb[$d1] + $d2; //UV全体
		}

		//本日の日付
		$today_date = date('Y/m/d',$g_time1);
		
		//本日の場合には赤いライン、そうでない場合には黄色のライン
		if ($today_date == $d1) {
			$line_img = 'red.gif';
		} else {
			$line_img = 'yellow.gif';
		}
	
		//ラインの長さは500を最高とする。それ以上の場合も500としてフォントの色を赤くする。
		$line_width = $d2 * $mag_gr;
	
		if ($line_width > 500) { 
			$line_width = 500;
			$font_color = '#ff0000';	
		} else {
			$font_color = '#000000';		
		}

		if ($pvv == 0) {

			//各日付のPVを取得
			$sql2 = 'SELECT count(*) AS SW2 FROM '.$id.' WHERE floor((TIME + 32400)/86400)
			 = '.$sd[SW1];
		
			//DB結果を取得
			$data2 = mysql_query($sql2);
		
			//DB結果セットの表示
			while ($sd2 = mysql_fetch_array ($data2)) {
		
				//データの取得
				$d3 = $sd2[SW2];
				
				//コメント
				$pcom2 = '('.$d3.')';

				//全体のカウンター追加
				$glp[$d1] = $glp[$d1] + $d3; //PV全体
		
				//ブログパーツを除いた全体のカウンター追加
				if (!mb_eregi('【ブログパーツ】',$title)) {
				$glpexb[$d1] = $glpexb[$d1] + $d3; //PV全体	
				}

			}

		}

		//グラフ出力ありで、日付が1日以上開いている場合には、日付が空いていることを表す"
		// U"を表示する
		if ((strtotime($d1) + 86400) < strtotime($dateb)) {
			
			//日にちの間隔の計算
			$interval = (strtotime($dateb) - strtotime($d1))/86400;
			
			//間隔分点線を表示
			for ($i = 1; $i < $interval; $i++) {			
				print ' U<br>';
				
				//出力行数1追加(最後の行合わせ用)
				$gyo = $gyo + 1;
			}
		}

		//日付、グラフ、数字の出力
		print $d1.': <img src="'.$line_img.'" width="'.$line_width.'" height="12"><span
		style="color: '.$font_color.';">'.$d2.$pcom2.'</span><br>';
		
		//データ出力数+1と日付データの保存
		$dout = $dout + 1;
		$dateb = $d1;
		$gyo = $gyo + 1;

	}

	//行数調整
	$chosei = $term - $gyo;

	if ($chosei >= 0) {
		for ($i = 0; $i <= $chosei; $i++) {
			print ' U<br>';
		}
	}
	
	//アーカイブフラグが立っていればアーカイブ統合表示
	$arc_str = '';
	if ($arc == 1) {
		$arc_str = '&ARCHIVE=checked';
	}
	
	$date1 = date('Y/m/d',(time() - (86400 * $term))); //詳細画面の日付設定

	print '<span class="s"><a href="chart.php?TYPE=1&ID='.$id.$arc_str.'&DATE1='.$date1.'" 
	target="_blank">UV詳細</a> <a href="chart.php?TYPE=0&ID='.$id.$arc_str.'&DATE1='.$date1.'" 
	target="_blank">PV詳細</a> '.$add.'</span><br>';
	
	flush();

}

function zentai_chartexb($term) {

	//グローバル変数の定義(全体のアクセス数計算用、グラフ用)
	global $glv,$glp,$glvexb,$glpexb,$mag_grz;

	//データ取得の時間的範囲の設定
	$g_time1 = time(); //現在時

	print '<b>全体のアクセス数</b><br>';
	
	//指定日付分繰り返し
	for ($i = 0; $i <= $term; $i ++) {
		
		//要素の指定
		$element = date('Y/m/d',time()-$i*86400); 
		
		//全体のカウンター1追加
		$uvc = $glvexb[$element]; //UV全体
		$pvc = $glpexb[$element]; //PV全体

		//本日の場合には赤いライン、そうでない場合には黄色のライン
		if ($i == 0) {
			$line_img = 'red.gif';
		} else {
			$line_img = 'yellow.gif';
		}
	
		//ラインの長さは800を最高とする。それ以上の場合も800としてフォントの色を赤くする。
		$line_width = $uvc * $mag_grz;
	
		if ($line_width > 800) { 
			$line_width = 800;
			$font_color = '#ff0000';	
		} else {
			$font_color = '#000000';		
		}

		//日付、グラフ、数字の出力
		if ($uvc > 0) {
			print date('Y/m/d',($g_time1 - $i * 86400)).': <img src="'.$line_img.'" 
			width="'.$line_width.'" height="12"><span style="color: '.$font_color.';">'.$uvc.'
			('.$pvc.')</span><br>';
			
			//ログファイルの保存
			$filename1 = 'log/uv_all_exbp_'.date('Ymd',($g_time1 - $i * 86400)).'.cnt';
			$filename2 = 'log/pv_all_exbp_'.date('Ymd',($g_time1 - $i * 86400)).'.cnt';
			file_put_contents($filename1,$uvc);
			file_put_contents($filename2,$pvc);
			
		} else {
			print ' U<br>';
		}

	}

}

print '

</body>		
</html>
';

?>