【SQLite+PHP】カウンタの実装2

PHP

 SQLiteとPHPを使ってホームページ用カウンタを作成します。実装1の問題点(リロード対策、DBセキュリティ対策)についても解決していきます。

環境

 OS ubuntu22.04 
 Webサーバ apache2.4.52(自身のIP 192.168.19.128、公開フォルダ /var/www/html)
 SQLite 3.37.2
 PHP 8.1.2-1ubuntu2.14

DBファイルを配置するフォルダの作成

 DBファイルが外部から丸見えとなっているので、次のフォルダを作成し、DBファイルの置き場所としました。

/var/www/db/

 フォルダのパーミッションは、707にします。
 この場所にDBファイルを配置すれば、通常は外部からアクセスされることはありませんので、大丈夫です。

DBファイルの作成

 同じIPアドレスからは1日1回分しかカウントを増やさないように修正します。
 IPアドレスと来訪日をDBに保管する必要があるので、テーブルを作り直します。今まで使っていたcounter.dbがあれば削除してから、次のSQLを実行します。

$ > sqlite3 counter.db
sqlite > create table counter ( id integer primary key autoincrement, ip_address TEXT, vdate TEXT );

 同じフォルダ上にcounter.dbが作成されますので、/var/www/db/に移動させてパーミッションを707にします。

PHPプログラムの作成

次のプログラムをcounter.phpという名前で作成します。

<?php
$db = new SQLite3('/var/www/db/counter.db');
$ip_address = $_SERVER['REMOTE_ADDR'];
$visit_date = date('Y-m-d');
$query = "SELECT COUNT(*) as count FROM counter WHERE ip_address = '$ip_address' AND vdate = '$visit_date'";
$result = $db->querySingle($query);
if ($result == 0) {
  $query = "INSERT INTO counter (ip_address, vdate) VALUES ('$ip_address', '$visit_date')";
  $db->exec($query);
}
$query = "SELECT COUNT(*) as count FROM counter WHERE vdate = '$visit_date'";
$today_count = $db->querySingle($query);
$keta = 5;  // カウンタの桁数
$str = str_pad($today_count, $keta, '0', STR_PAD_LEFT);
for ($i = 0; $i < $keta; $i++) {
  $num = substr($str, $i, 1);
  echo "$num";  //数字を表示  画像を使うならこっち "<img src='./img/$num.gif' >";
}
?>

作成したファイルは、次の場所に配置してパーミッションを705にしました。

/var/www/html/php

echo “$num”; の部分をコメント行に置き換えると、GIFファイル等の画像を使ったカウンタ表示もできます。
 画像表示を行う場合には、
./img/
フォルダ直下に、
0.gif~9.gif
を配置する必要があります。
 GIF画像は、著作権の絡みがあるので自作するか使用可能なサイトからダウンロードするようにしてください。

確認

ブラウザから、「http://192.168.19.128/php/counter.php」にアクセスすると、

と表示されますが、リロードしても増えていきません。

明日になってからもう一度同じページにアクセスすると訪問者数は2になります。

これで、前回の問題点1,2の修正ができました。