2,176 views
この記事は最終更新から 2700日 が経過しています。
やってみたいこと
簡易データベースとしてSQLiteはとっても便利。
データベースなので、データアクセス時の排他制御をやってくれる。
よってSQLiteを使うと容易にアクセスカウンタを実装できる。
実行サンプルはこちらです。
http://www.dogrow.net/php/sample/00006/
プログラム作成
カウンタプログラムを別ファイルでクラス実装してみた。
index.php
<!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>
CCounter.php
<?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/