PHP 掲示板(BBS)を作る — 学習ページ
このページは WordPress 投稿フォームで表示できる学習資料です。
最低限の HTML のみ使用しています。
掲示板の全体像
掲示板は次の 4 要素でできています。
- フォーム入力 … 名前・本文を送る
- 投稿処理 … DB に保存する
- 一覧表示 … 過去の投稿を表示
- データベース … 投稿内容を保持
ファイル同士の関係はとてもシンプルです:
- index.php → 掲示板ページ(フォーム+一覧)
- post.php → 投稿を保存する処理
- connect_pdo.php → DB 接続をまとめたファイル
- db_config.php → 接続情報だけを保持
index → post → DB の順で動く構造です。
データベース準備(SQL)
|
1 2 3 4 5 6 7 8 9 10 |
CREATE DATABASE IF NOT EXISTS bbs_db CHARACTER SET utf8mb4; USE bbs_db; CREATE TABLE IF NOT EXISTS posts ( id INT AUTO_INCREMENT PRIMARY KEY, name VARCHAR(100) NOT NULL, body TEXT NOT NULL, created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; |
db_config.php
|
1 2 3 4 5 6 7 8 9 |
<?php return [ 'host' => 'localhost', 'dbname' => 'bbs_db', 'user' => 'db_user', 'pass' => 'db_password', 'charset' => 'utf8mb4', ]; |
connect_pdo.php
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
<?php $config = require __DIR__ . '/db_config.php'; $dsn = sprintf( 'mysql:host=%s;dbname=%s;charset=%s', $config['host'], $config['dbname'], $config['charset'] ); try { $pdo = new PDO($dsn, $config['user'], $config['pass'], [ PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION, PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC, PDO::ATTR_EMULATE_PREPARES => false, ]); } catch (PDOException $e) { exit('データベース接続に失敗しました。'); } |
index.php(フォーム+投稿一覧)
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 |
<?php require __DIR__ . '/connect_pdo.php'; ?> <h1>掲示板</h1> <!-- 投稿フォーム --> <form action="post.php" method="post"> 名前: <input type="text" name="name" required><br> 本文:<br> <textarea name="body" rows="4" cols="40" required></textarea><br> <button type="submit">投稿する</button> </form> <hr> <h2>投稿一覧</h2> <?php $stmt = $pdo->query('SELECT * FROM posts ORDER BY id DESC'); $rows = $stmt->fetchAll(); foreach ($rows as $r) { echo '<div style="margin-bottom:20px;">'; echo '<b>' . htmlspecialchars($r['name']) . '</b> '; echo '(' . $r['created_at'] . ')<br>'; echo nl2br(htmlspecialchars($r['body'])) . '<br>'; echo '</div>'; } ?> |
post.php(投稿処理)
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
<?php require __DIR__ . '/connect_pdo.php'; $name = $_POST['name'] ?? ''; $body = $_POST['body'] ?? ''; if (!$name || !$body) { exit('入力が不足しています。'); } $sql = 'INSERT INTO posts (name, body) VALUES (:name, :body)'; $stmt = $pdo->prepare($sql); $stmt->execute([ ':name' => $name, ':body' => $body, ]); header('Location: index.php'); exit; |
注意点
- 必ず Prepared Statement を使用(SQLインジェクション対策)
- 投稿の文字数チェックを入れるとよい
- 本番環境ではエラーを画面に出さない

コメント