【サンプル】掲示板(データの挿入、抽出)

(ブログ記事の一覧は「こちら」)

シンプルな掲示板を作成しましょう。

f:id:MJeeeey:20200112184459p:plain:w480

入力項目は「名前」と「コメント」のみとします。

準備

データベース名

db_board

テーブル名

board

テーブルの構造

名前 データ型 その他
id int primary
name varchar(50) -
comment text -
created datetime -

サンプルプログラム

まず、使用するデータベースの情報をまとめた定義ファイルを作成します。

dbConfig.php

<?php
    define("DB_SERVER", "localhost");  // サーバー
    define("DB_USER", "root");         // ユーザー
    define("DB_PASS", "");             // パスワード
    define("DB_NAME", "db_board");      // データベース
?>


今回は、データベースに関する処理について、別ファイルにまとめる方法で実装します。

dbHelper.php

<?php
    require_once('./dbConfig.php');

    // データベースへの接続
    function connectDB() {
        try {
            $dsn = 'mysql:host=' . DB_SERVER . ';dbname=' . DB_NAME . ';charset=utf8';
            $pdo = new PDO($dsn, DB_USER, DB_PASS);

        } catch (PDOException $e) {
            echo($e->getMessage());
            die();
        }

        $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

        return $pdo;
    }

    // お名前、コメントをDBに書き込む
    function insertComment($dbh, $name, $comment) {
        $date = date('Y-m-d H:i:s');
        $sql = "INSERT INTO board (name, comment, created) VALUE (:name, :comment, '{$date}')";
        $stmt = $dbh->prepare($sql);
        $stmt->bindValue(':name', $name, PDO::PARAM_STR);
        $stmt->bindValue(':comment', $comment, PDO::PARAM_STR);
        if (!$stmt->execute()) {
            return 'データの書き込みに失敗しました。';
        }
    }

    // DBから全データを取得
    function selectComments($dbh) {
        $sql = "SELECT name, comment, created FROM board";
        $stmt = $dbh->prepare($sql);
        $stmt->execute();
        while ($row = $stmt->fetch(PDO::FETCH_ASSOC)) {
            $data[] = $row;
        }
        return $data;
    }


最後に、メインのプログラムを載せます。処理については、コメントを参考にしてください。

index.php

<?php
    require_once('./dbHelper.php');

    // データベースへの接続
    $pdo = connectDB();

    $errs = [];

    // [1] POSTで送信しているか?
    if ($_SERVER['REQUEST_METHOD'] === 'POST') {
        // [2] POSTデータを取得
        $name = $_POST['name'];
        $comment = $_POST['comment'];

        // [3] バリデーション(入力内容のチェック)
        // 文字数のチェック
        if (mb_strlen($name) == 0) {
            $errs[] = 'お名前を入力してください。' . "<br>";
        }

        if (mb_strlen($comment) == 0) {
            $errs[] = 'コメント欄を入力してください。' . "<br>";
        }

        if (count($errs) === 0) {
            // [4] お名前、コメントをDBに書き込む
            $result = insertComment($pdo, $name, $comment);
        }
    }

    // [5] DBから全データを取得
    $data = selectComments($pdo);
?>

<html>
<head>
   <meta charset="UTF-8">
</head>

<body>
<h1>掲示板</h1>

<table border=1>
    <tr style="background-color: orange">
        <th>名前</th><th>コメント</th><th>時刻</th>
    </tr>
    <?php foreach ((array)$data as $row): ?>
    <tr>
        <td><?php echo htmlspecialchars($row['name'], ENT_QUOTES, 'UTF-8'); ?></td>
        <td><?php echo nl2br(htmlspecialchars($row['comment'], ENT_QUOTES, 'UTF-8')); ?></td>
        <td><?php echo htmlspecialchars($row['created'], ENT_QUOTES, 'UTF-8'); ?></td>
    </tr>
    <?php endforeach; ?>
</table>

<?php
if (count($errs)) {
    foreach ($errs as $err) {
        echo '<p style="color: red">' . $err . '</p>';
    }
}
?>

<form action="" method="POST">
    <p>お名前:</p>
    <p><input type="text" name="name"></p>
    <p>ひとこと:</p>
    <p><textarea name="comment" rows="4" cols="40"></textarea></p>
    <input type="submit" value="書き込む">
</form>

</body>
</html>