2,301 views
この記事は最終更新から 3216日 が経過しています。
やってみたいこと
「(7) SQLiteでアクセスカウンタ作成 #2」 を改造し、同じIPアドレスからのアクセスは1日に1回だけカウントするように変更する。

実行サンプルはこちらです。
//www.dogrow.net/php/sample/00008/
プログラム作成
index.php
「(7) SQLiteでアクセスカウンタ作成 #2」と同じ
counter_img.php
「(7) SQLiteでアクセスカウンタ作成 #2」と同じ
CCounter.php
アクセスログを記録するためのテーブル acclog を新規追加した。
<?php
class CCounter {
private $m_db; // SQLite3 instance
private $m_db_fpath; // DBファイルパス
//////////////////////////////////////////////////////////////////////////////
// コンストラクタ
function __construct( $fpath = "cnt.db" ) {
$this->m_db = NULL;
$this->m_db_fpath = $fpath;
}
//////////////////////////////////////////////////////////////////////////////
// DB接続
function connect_db(){
if($this->m_db == NULL){
// DBファイル存在確認
$isDbExist = file_exists($this->m_db_fpath);
try {
// DB接続
$this->m_db = new SQLite3($this->m_db_fpath);
$this->m_db->enableExceptions(TRUE);
// DBは新規作成?
if($isDbExist === FALSE){
// カウント値用テーブルを作成し、カウント値を0で初期化
$this->m_db->exec("CREATE TABLE `mytbl` (`cnt` INTEGER, `dt_lastacc` INTEGER);");
$this->m_db->exec("INSERT INTO `mytbl` (`cnt`,`dt_lastacc`) VALUES(0, ".time().");");
// アクセスログ用テーブルを作成
$this->m_db->exec("CREATE TABLE `acclog` (`ipaddr` TEXT, `accfrom` TEXT, `acctime` TEXT);");
}
}catch(Exception $e){
echo "[".__LINE__."] Caught exception: ".$e->getMessage();
}
}
}
//////////////////////////////////////////////////////////////////////////////
// DB切断
function disconnect_db(){
if($this->m_db != NULL){
$this->m_db->close();
$this->m_db = NULL;
}
}
//////////////////////////////////////////////////////////////////////////////
// カウンタ更新&更新値を取得
function count_up(){
$cnt = 0;
if($this->m_db != NULL){
// 日付変更ならばアクセスログを削除
$this->clear_acclog_if_date_changed();
try {
// 二重カウントチェック
if($this->is_ipaddr_exist() === FALSE){
$dt_now = time();
// カウンタをインクリメント
$this->m_db->exec("UPDATE `mytbl` SET `cnt`=`cnt`+1,`dt_lastacc`='$dt_now';");
// アクセスログ更新
$this->m_db->exec("INSERT INTO `acclog` (`ipaddr`,`accfrom`,`acctime`) VALUES('".$_SERVER["REMOTE_ADDR"]."','','$dt_now');");
}
// カウンタの値を取得
$rs = $this->m_db->query("SELECT `cnt` FROM `mytbl`;");
$row = $rs->fetchArray();
$cnt = $row['cnt'];
}catch(Exception $e){
echo "[".__LINE__."] Caught exception: ".$e->getMessage();
}
}
return $cnt;
}
//////////////////////////////////////////////////////////////////////////////
// 日付変更時にアクセスログをクリア
function clear_acclog_if_date_changed(){
if($this->m_db != NULL){
$day_now = strftime("%G%m%d", time());
try {
// アクセスログ最終更新日を取得
$rs = $this->m_db->query("SELECT `dt_lastacc` FROM `mytbl`;");
$row = $rs->fetchArray();
$day_last = strftime("%G%m%d", $row['dt_lastacc']);
// 日付変更?
if($day_now != $day_last){
// アクセスログを削除
$this->m_db->exec("DELETE FROM `acclog`;");
}
}catch(Exception $e){
echo "[".__LINE__."] Caught exception: ".$e->getMessage();
}
}
}
//////////////////////////////////////////////////////////////////////////////
// 二重カウントチェック
function is_ipaddr_exist(){
$ret = FALSE;
if($this->m_db != NULL){
try {
$ipaddr = $_SERVER["REMOTE_ADDR"];
$rs = $this->m_db->query("SELECT COUNT(*) FROM `acclog` WHERE `ipaddr`='$ipaddr';");
$row = $rs->fetchArray();
if($row[0] > 0){
$ret = TRUE; // アクセス元IPアドレスが登録済み。
}
}catch(Exception $e){
echo "[".__LINE__."] Caught exception: ".$e->getMessage();
}
}
return $ret;
}
}
?>
実行サンプルはこちらです。
//www.dogrow.net/php/sample/00008/
アクセス数(直近7日): ※試験運用中、BOT除外簡易実装済2026-06-23: 0回 2026-06-22: 2回 2026-06-21: 3回 2026-06-20: 0回 2026-06-19: 2回 2026-06-18: 0回 2026-06-17: 3回