前回まではターミナル上で動くアプリケーションを作成しました。
いよいよ読書ログサービスのWebサービス版を作成していきます。
作るアプリケーションのページ構成
- トップページ
- 読書ログ登録ページへの遷移ボタン
- 登録済みの読書ログ一覧表示
- 読書ログ登録ページ
- 書籍名、著者名、読書状況、評価及び感想の入力欄
- 読書状況は「未読」「読んでいる」「読了」をラジオボタンで選択できるようにする。
Webサービス版を作成する順序
- テーブルの設計及び作成を行う。
- 「登録ページ」HTMLで表示する。
- 「登録ページ」PHPで読書ログを登録できるようにする。
- 「登録ページ」CSSでスタイルを整える。
- 「トップページ」HTMLで表示する。
- 「トップページ」PHPで読書ログ一覧を表示できるようにする。
- 「トップページ」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)