プログラム(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="//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日以上開いている場合には、日付が空いていることを表す"
// ¦"を表示する
if ((strtotime($d1) + 86400) < strtotime($dateb)) {
//日にちの間隔の計算
$interval = (strtotime($dateb) - strtotime($d1))/86400;
//間隔分点線を表示
for ($i = 1; $i < $interval; $i++) {
print ' ¦<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 ' ¦<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 ' ¦<br>';
}
}
}
print '
</body>
</html>
';
?>