(6) SQLiteでアクセスカウンタ作成 #1

投稿者: | 2016年10月22日

この記事は最終更新から 809日 が経過しています。

やってみたいこと

簡易データベースとして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/


コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です


日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)