【PHP】データベースサーバー不要!SQLiteで作るお手軽ランキングシステム
ブラウザゲームの醍醐味といえば「ランキング」でのスコア競争。
しかし、個人開発でわざわざMySQLなどのデータベースサーバーを構築するのはハードルが高いですよね。
Play Spotでは、「SQLite(エスキューライト)」を使って、ファイル1つで管理できる軽量ランキングシステムを自作しています。その実装コードを公開します。
📂 なぜ SQLite なのか?
SQLiteは、データが「1つのファイル(.sqlite)」として保存されるデータベースです。
通常のデータベースのようにサーバーを立てる必要がなく、PHPからファイルを読み書きする感覚でSQLが使えます。
小〜中規模のゲームサイトならパフォーマンスも十分で、バックアップもファイルをコピーするだけなので非常に管理が楽です。
💻 実装コード解説 (ranking_api.php)
実際に稼働しているAPIの中身です。セキュリティ対策として、PDO(PHP Data Objects)のプリペアドステートメントを使用しています。
1. データベース接続とテーブル作成
// データベースファイルの場所を指定
$db_path = __DIR__ . '/data/ranking.sqlite';
try {
// 接続(ファイルがなければ自動生成される)
$pdo = new PDO('sqlite:' . $db_path);
// エラー時に例外を投げる設定
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
// テーブルがなければ作成するSQL
$pdo->exec("CREATE TABLE IF NOT EXISTS scores (
id INTEGER PRIMARY KEY AUTOINCREMENT,
game_id TEXT,
player_name TEXT,
score REAL,
created_at DATETIME DEFAULT CURRENT_TIMESTAMP
)");
} catch (PDOException $e) {
echo json_encode(['error' => 'DB Error']);
exit;
}
2. スコアの保存(SQLインジェクション対策)
ユーザーからの入力(名前など)をそのままSQLに埋め込むと、データベースを破壊される危険があります。
そこで prepare と ? を使い、安全に値を渡します。
// データを受け取る
$game_id = $_POST['game_id'];
$player_name = $_POST['player_name'];
$score = $_POST['score'];
// 名前をサニタイズ(特殊文字を無害化)
$player_name = htmlspecialchars($player_name, ENT_QUOTES, 'UTF-8');
// 安全に保存
$stmt = $pdo->prepare("INSERT INTO scores (game_id, player_name, score) VALUES (?, ?, ?)");
$stmt->execute([$game_id, $player_name, $score]);
🚀 JSONで返してJavaScriptで表示
このPHPファイルは「API」として機能するため、結果をJSON形式で出力します。
ゲーム側のJavaScript(Fetch API)でこのJSONを受け取り、画面にランキング表を描画しています。
// ヘッダー指定(キャッシュさせない)
header('Content-Type: application/json');
header("Cache-Control: no-store, no-cache, must-revalidate");
// ...処理...
echo json_encode(['status' => 'success']);
👨💻 まとめ
大掛かりなサーバー構築をしなくても、標準的なPHPとSQLiteだけで実用的なランキング機能は作れます。
「スワイプ侍」や「モンスタークリッカー」もこの仕組みで動いています。
個人開発のゲームにランキングをつけたい方は、ぜひSQLiteを試してみてください。