2,739 views
この記事は最終更新から 413日 が経過しています。
やってみたいこと
簡易データベースとしてSQLiteはとっても便利。
データベースなので、データアクセス時の排他制御をやってくれる。
よってSQLiteを使うと容易にアクセスカウンタを実装できる。
実行サンプルはこちらです。
http://www.dogrow.net/php/sample/00006/
プログラム作成
カウンタプログラムを別ファイルでクラス実装してみた。
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8" />
<title>SQLiteサンプル</title>
</head>
<body>
<?php
require_once("CCounter.php");
$cCnt = new CCounter();
$cCnt->connect_db(); // DB接続
$cnt = $cCnt->count_up(); // カウントアップ&値取得
$cCnt->disconnect_db(); // DB切断
echo "counter : ".$cnt; // カウント値を表示
?>
</body>
</html>
<?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);
// DB接続
$this->m_db = new SQLite3($this->m_db_fpath);
$this->m_db->enableExceptions(TRUE);
// DBは新規作成?
if($isDbExist === FALSE){
try {
// テーブルを作成し、カウント値を0で初期化
$this->m_db->exec("CREATE TABLE `mytbl` (`cnt` INTEGER);");
$this->m_db->exec("INSERT INTO `mytbl` (`cnt`) VALUES(0);");
}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){
try {
// カウンタをインクリメント
$this->m_db->exec("UPDATE `mytbl` SET `cnt`=`cnt`+1;");
// カウンタの値を取得
$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;
}
}
?>
実行サンプルはこちらです。
http://www.dogrow.net/php/sample/00006/
アクセス数(直近7日): ※試験運用中、BOT除外簡易実装済2026-06-14: 1回 2026-06-13: 0回 2026-06-12: 2回 2026-06-11: 2回 2026-06-10: 0回 2026-06-09: 0回 2026-06-08: 0回