【SQLite+PHP】掲示板を実装する

掲示板 PHP

今回は、SQLiteとPHPを使った掲示板の実装を行います。
掲示板には、投稿、閲覧、削除機能を設け、一度削除した記事も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を作成するSQLは次の通りです。

$ > sqlite3 bbs.db
sqlite > CREATE TABLE posts (id INTEGER PRIMARY KEY, title TEXT, content TEXT, created_at DATETIME)');

SQLを実行すると、bbs.dbというファイルが出力されるので、

/var/www/db/

に移動させて、パーミッションを707に変更しました。

PHPプログラムの作成

次のプログラムをbbs.phpという名前で保存します。

<!DOCTYPE html>
<html>
<head><title>掲示板</title>
</head>
<body>
<h1>掲示板</h1>
<?php
$db = new SQLite3('/var/www/db/bbs.db');
$result = $db->query('SELECT * FROM posts WHERE deleted = 0');
while ($row = $result->fetchArray()) {
    echo "<div>";
    echo "<table><tr><td colspan=2>";
    echo "<h2>" . $row['title'] . "</h2>";
    echo "</td></tr>";
    echo "<tr><td>";
    echo "<p>投稿日時: " . $row['created_at'] . "</p>";
    echo "</td><td>";
    echo "<form style='display:inline;' action='bbs.php' method='post'>";
    echo "<input type='hidden' name='delete_id' value='" . $row['id'] . "'>";
    echo "<input type='submit' value='削除'>";
    echo "</form>";
    echo "</td></tr>";
    echo "<tr><td colspan=2>";
    echo "<p>" . $row['content'] . "</p>";
    echo "</td></tr></table>";
    echo "</div><hr>";
}

// 削除処理
if (isset($_POST['delete_id'])) {
    $id = $_POST['delete_id'];
    $stmt = $db->prepare('UPDATE posts SET deleted = 1 WHERE id = :id');
    $stmt->bindValue(':id', $id, SQLITE3_INTEGER);
    $stmt->execute();
    header('Location: bbs.php');
}

// 投稿処理
if (isset($_POST['title']) && isset($_POST['content'])) {
    $title = $_POST['title'];
    $content = $_POST['content'];
    $created_at = date('Y-m-d H:i:s');
    $stmt = $db->prepare('INSERT INTO posts (title, content, created_at) VALUES (:title, :content, :created_at)');
    $stmt->bindValue(':title', $title, SQLITE3_TEXT);
    $stmt->bindValue(':content', $content, SQLITE3_TEXT);
    $stmt->bindValue(':created_at', $created_at, SQLITE3_TEXT);
    $stmt->execute();
    header('Location: bbs.php');
}
$db->close();
?>
<!-- 投稿フォーム -->
<form action="bbs.php" method="post">
    <input type="text" name="title" placeholder="タイトル"><br>
    <textarea name="content" placeholder="内容"></textarea><br>
    <input type="submit" value="投稿">
</form>
</body>
</html>

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

/var/www/html/php

確認

ブラウザから、「http://192.168.19.128/php/bbs.php」にアクセスすると、次の画面が表示されます。

タイトルと内容を入力して「投稿」ボタンを押下すると、記事が投稿されます。
投稿した記事の削除は記事の右側にある「削除」ボタンを押下してください。
選択した記事だけを削除することができます。
記事を投稿した様子

この掲示板では、投稿記事を削除することができますが、削除フラグを立てただけなので、サーバ上のデータベース上には記事が残っています。

$ > sqlite3 bbs.db
sqlite > select * from posts;

 行末についている「1」が削除フラグです。フラグが「0」の記事だけ表示しています。
 idが3(上から三番目)の記事を復元する場合は、ubuntuから次のSQLを実行してください。

$ > sqlite3 bbs.db
sqlite > update posts set deleted = 0 where id = 3;

掲示板を再表示すると、削除したはずの投稿が復活しています。