プログラミング学習ログ

WEBアプリケーション個人開発を目指す32歳公務員

#12 PHPからテーブルを作成する方法

f:id:kshinya-tech:20220220204935p:plain

前回まではターミナル上で動くアプリケーションを作成しました。

いよいよ読書ログサービスのWebサービス版を作成していきます。

作るアプリケーションのページ構成

  1. トップページ
    • 読書ログ登録ページへの遷移ボタン
    • 登録済みの読書ログ一覧表示
  2. 読書ログ登録ページ
    • 書籍名、著者名、読書状況、評価及び感想の入力欄
    • 読書状況は「未読」「読んでいる」「読了」をラジオボタンで選択できるようにする。

Webサービス版を作成する順序

  1. テーブルの設計及び作成を行う。
  2. 「登録ページ」HTMLで表示する。
  3. 「登録ページ」PHPで読書ログを登録できるようにする。
  4. 「登録ページ」CSSでスタイルを整える。
  5. 「トップページ」HTMLで表示する。
  6. 「トップページ」PHPで読書ログ一覧を表示できるようにする。
  7. 「トップページ」CSSでスタイルを整える。

※ 「登録ページ」から作成するのは、読書ログが登録されていないと、トップページに表示する機能を試すことができないため。

テーブルをPHPから作成する

開発の順序は、

設計 → テーブル作成 → HTML → ロジック処理 → CSS

の順番で行っていきます。

現状の課題

テーブル作成をSQL文で直接実行している点。

SQL文を直接実行すると

  • 毎回Dockerに入らないといけない・・・
  • 毎回DBの接続情報を書かないといけない・・・

    実行がシンプルじゃない

プログラムから実行すると

  • PHPファイルを実行するだけで済む!
  • Herokuで実行する時に楽!(らしい)

    実行がシンプル

サンプルコード

<?php
// データベースとの接続の関数を定義
function dbConnect()
{
    $link = mysqli_connect('db', 'book_log', 'pass', 'book_log');
    if (!$link) {
        echo 'Error: データベースに接続できません' . PHP_EOL;
        echo 'Debugging error: ' . mysqli_connect_error() . PHP_EOL;
        exit;
    }
    return $link;
}

// companiesテーブルが既に存在していたら、削除する関数を定義
function dropTable($link)
{
    $dropTableSql = 'DROP TABLE IF EXISTS companies';
    $result = mysqli_query($link, $dropTableSql);
    if ($result) {
        echo 'テーブルを削除しました' . PHP_EOL;
    } else {
        echo 'Error: テーブルの削除に失敗しました' . PHP_EOL;
        echo 'Debugging Error: ' . mysqli_error($link) . PHP_EOL . PHP_EOL;
    }
}

// companiesテーブルを作成する関数を定義
function createTable($link)
{
    $createTableSql = <<<EOT
CREATE TABLE companies (
    id INTEGER NOT NULL AUTO_INCREMENT PRIMARY KEY,
    name VARCHAR(255),
    establishment_date DATE,
    founder VARCHAR(255),
    created_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP
) DEFAULT CHARACTER SET = utf8mb4;
EOT;
    $result = mysqli_query($link, $createTableSql);
    if ($result) {
        echo 'テーブルを作成しました' . PHP_EOL;
    } else {
        echo 'Error: テーブルの作成に失敗しました' . PHP_EOL;
        echo 'Debugging Error: ' . mysqli_error($link) . PHP_EOL . PHP_EOL;
    }
}

// データベースとの接続 -> テーブルの初期化(削除・作成)-> データベースの切断 を実行
$link = dbConnect();
dropTable($link);
createTable($link);
mysqli_close($link);

読書ログサービスに実装

<?php
// データベースとの接続の関数を定義
function dbConnect()
{
    $link = mysqli_connect('db', 'book_log', 'pass', 'book_log');
    if (!$link) {
        echo 'Error: データベースに接続できません' . PHP_EOL;
        echo 'Debugging error: ' . mysqli_connect_error() . PHP_EOL;
        exit;
    }
    return $link;
}

// companiesテーブルが既に存在していたら、削除する関数を定義
function dropTable($link)
{
    $dropTableSql = 'DROP TABLE IF EXISTS reviews';
    $result = mysqli_query($link, $dropTableSql);
    if ($result) {
        echo 'テーブルを削除しました' . PHP_EOL;
    } else {
        echo 'Error: テーブルの削除に失敗しました' . PHP_EOL;
        echo 'Debugging Error: ' . mysqli_error($link) . PHP_EOL . PHP_EOL;
    }
}

// companiesテーブルを作成する関数を定義
function createTable($link)
{
    $createTableSql = <<<EOT
CREATE TABLE reviews (
    id INTEGER NOT NULL AUTO_INCREMENT PRIMARY KEY,
    title VARCHAR(255),
    author VARCHAR(30),
    status VARCHAR(30),
    score INTEGER,
    summary VARCHAR(500),
    created_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP
) DEFAULT CHARACTER SET = utf8mb4;
EOT;
    $result = mysqli_query($link, $createTableSql);
    if ($result) {
        echo 'テーブルを作成しました' . PHP_EOL;
    } else {
        echo 'Error: テーブルの作成に失敗しました' . PHP_EOL;
        echo 'Debugging Error: ' . mysqli_error($link) . PHP_EOL . PHP_EOL;
    }
}

// データベースとの接続 -> テーブルの初期化(削除・作成)-> データベースの切断 を実行
$link = dbConnect();
dropTable($link);
createTable($link);
mysqli_close($link);

実行結果

ターミナル

sk@MacBook-Air part2 % docker-compose exec app php databases/initialize_reviews_table.php
テーブルを削除しました
テーブルを作成しました

SQLで表示してみて、問題がないことを確認。

MySQL [book_log]> SHOW TABLES;
+--------------------+
| Tables_in_book_log |
+--------------------+
| companies          |
| reviews            |
| tasks              |
+--------------------+
3 rows in set (0.003 sec)

MySQL [book_log]> describe reviews;
+------------+--------------+------+-----+-------------------+----------------+
| Field      | Type         | Null | Key | Default           | Extra          |
+------------+--------------+------+-----+-------------------+----------------+
| id         | int(11)      | NO   | PRI | NULL              | auto_increment |
| title      | varchar(255) | YES  |     | NULL              |                |
| author     | varchar(30)  | YES  |     | NULL              |                |
| status     | varchar(30)  | YES  |     | NULL              |                |
| score      | int(11)      | YES  |     | NULL              |                |
| summary    | varchar(500) | YES  |     | NULL              |                |
| created_at | timestamp    | NO   |     | CURRENT_TIMESTAMP |                |
+------------+--------------+------+-----+-------------------+----------------+
7 rows in set (0.002 sec)

MySQL [book_log]> SELECT * FROM reviews;
Empty set (0.001 sec)