SQLiteを使ったアクセスカウンタ

例1

あなたは 30536 人目のお客様です。

上のソース:

<?php
  try {
    $db = new PDO("sqlite:データベースファイル名");
    $r = $db->exec("update counter set cnt=cnt+1;");
    $a = $db->query("select cnt from counter;")->fetch();
    $db = null;
  } catch (PDOException $e) {
    echo "<p>エラー:", $e->getMessage(), "</p>";
  }
?>

<p>あなたは <?php echo $a[0]; ?> 人目のお客様です。</p>

「データベースファイル名」は,絶対パスで指定しても,PHPファイルのある場所からの相対パスで指定してもかまいません。拡張子は不要ですが,もし拡張子を付けたいなら .db を付ければいいでしょう。

データベースファイルの置き場所は,セキュリティに配慮して,public_htmlの外,例えば自分のホームディレクトリ直下に専用のフォルダを作っておきます。このフォルダは httpd プロセスがアクセスできるようなパーミッションにしておきます。

データベースファイルだけでなく,その入ったフォルダも,httpd がアクセスできるようにする必要があります。これは,データベース更新(insert や update)時に,データベースファイルと同じフォルダに一時ファイルを作るために必要なようです。

あらかじめサーバにログインして,このファイル名のデータベースを作っておきます:

cd データベースファイルの置き場所
sqlite3 データベースファイル名
create table counter(cnt int);
insert into counter values(0);
.exit

細かいこと

sqlite3 は update counter set cnt=cnt+1; をアトミックに(途中で休まず)実行しますが,select cnt from counter; を実行するまでに他のプロセスがカウンタの値を更新するかもしれません。これが問題な場合は,次のように begin;commit; で囲んでおけば,実際の更新は commit; した時点で生じます。その間,他のプロセスはデータを読むことしかできなくなります。

begin;
update counter set cnt=cnt+1;
select cnt from counter;
commit;

Last modified: