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

例1

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

上のソース:

<?php
  $db = sqlite_open("ファイル名(フルパス)") or die("Error 1");
  sqlite_query($db, "update counter set cnt=cnt+1;") or die("Error 2");
  $a = sqlite_array_query($db, "select cnt from counter;", SQLITE_NUM) or die("Error 3");
  sqlite_close($db);
?>

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

この「ファイル名(フルパス)」については以下で説明します。

上の実習をするために,あらかじめ次の作業をしておきます。

まずサーバにログインし,データベースファイルを入れるためのフォルダを作ります。 このフォルダは Apache プロセスがアクセスできるようなパーミッションにしておきます。

mkdir フォルダ名
chmod 777 フォルダ名

その中に入り,sqlite コマンドでデータベースファイルを作成します。 データベースファイルは Apache プロセスが読み書きできるようにしておきます。

cd フォルダ名
pwd ←自分がどのフォルダにいるか確認
sqlite ファイル名
create table counter(cnt int);
insert into counter values(1);
select cnt from counter;  ←ここで1と表示されればOK
.quit
chmod 666 ファイル名

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

さて,最初に出た「ファイル名(フルパス)」ですが,上の pwd コマンドで出力されるフォルダの名前に,sqlite コマンドで作るデータベースファイル名をアペンドしたものです。 例えば /home/hoge/dbfolder/dbfile のようになります。

解説

$db = sqlite_open("ファイル名") でデータベースを開き,データベースハンドルを返します。 もしエラーが起これば,$dbFALSE という値になりますので,

  $db = sqlite_open("...");
  if ($db == FALSE) {
    echo("エラーです");
    exit();
  }

のようにしてエラーをつかまえます。 これと同じ意味のイディオムとして,

  $db = sqlite_open("...") or die("エラーです");

という書き方をよくします。

データベースをオープンしたら,sqlite_query($db, "SQL文") でSQLの問合せをします。

select文のように表を返す場合は,$a = sqlite_array_query($db, "select * from hoge;", SQLITE_NUM); のようにすると,配列 $a に表が入ります。 $a[$i][$j]$i 行目,$j 列目の値です:

列1列2列3
$a[0][0]$a[0][1]$a[0][2]
$a[1][0]$a[1][1]$a[1][2]
$a[2][0]$a[2][1]$a[2][2]
$a[3][0]$a[3][1]$a[3][2]

例2

ログインしてsqliteコマンドを実行できないときは,次のようにするといいでしょう。 データベースファイルの入るフォルダはあらかじめ作っておき,Apache に読み書き実行できるようにしておきます。

<?php
  $db = sqlite_open("フォルダ名/ファイル名") or die("Error 1");
  $r = sqlite_query($db, "update counter set cnt=cnt+1;");
  if ($r == FALSE) {
    sqlite_query($db, "create table counter(cnt int);") or die("Error 2");
    sqlite_query($db, "insert into counter values(1);") or die("Error 3");
  }
  $a = sqlite_array_query($db, "select cnt from counter;", SQLITE_NUM) or die("Error 4");
  sqlite_close($db);
?>

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

1行目の sqlite_open() をWebサーバが実行すると,データベースファイルがもしなければ自動的に作られます。 2行目は,表counterを操作しようとしますが,まだ表が作られていなければ,失敗します(FALSEが返ります)。 そのときは,4行目と5行目の問合せで,テーブルを作り,値 1 を挿入します。 これは上の「例1」ではログインして sqlite コマンドで行いました。

ただし,このままではセキュリティ上問題があります。 データベースファイルが public_html の中に入っているので,誰からでもアクセスできてしまうからです。 カウンタの場合は問題にならないかもしれませんが,個人情報を扱うような場合にはこれでは困ります。 どうすれば防げるでしょうか。

ヒント: .htaccess


奥村晴彦

Last modified: 2007-05-25 16:06:50