ここではコース作成処理を実装します。
以下に指示に従ってプログラムを開発してください。
ファイル一覧
処理 | ファイル | 概要 |
---|---|---|
コース一覧表示処理 | courses/index.php |
コース一覧画面を表示する |
コース作成処理 | courses/create.php |
コース作成画面を表示する |
コース作成処理 | courses/store.php |
コースレコードを作成する |
画面仕様
コース一覧画面( index.php
)
CREATE
リンクを追加します。
コース作成画面( create.php
)
入力フォームを空で表示します。また CATEGORY
のセレクトボックスには categories
テーブルの内容を表示します。
ID
、TITLE
、L-TIME
、CATEGORY
入力してSTORE
ボタンをクリックします。
データベース( courses
テーブル)に新規レコードを作成し、コース一覧画面にリダイレクトします。コース一覧画面には作成したレコードが表示されます。
index.php
の実装(修正)
概要
- コース一覧画面を表示する
処理記述(修正箇所のみ抜粋)
- HTMLを出力する
courses
レコードの一覧を出力する- コース作成画面への
CREATE
リンクを出力する
index.php
(修正箇所のみ抜粋)
...省略
<body>
<h3>Courses - Index</h3>
<hr>
<table border="1">
<tr>
<th>ID</th>
<th>TITLE</th>
<th>L-TIME</th>
<th>CATEGORY</th>
</tr>
<?php foreach ($courses as $course) { ?>
<tr>
<td><?= htmlspecialchars($course["id"]) ?></td>
<td><?= htmlspecialchars($course["title"]) ?></td>
<td><?= htmlspecialchars($course["learning_time"]) ?></td>
<td><?= htmlspecialchars($course["category_title"]) ?></td>
</tr>
<?php } ?>
</table>
<hr>
<a href="create.php">CREATE</a>
</body>
</html>
create.php
の実装
概要
- コース作成画面を表示する
処理記述
-
PDO
インスタンスを生成する引数 値 DSN "mysql:host=localhost;dbname=eldb;charset=utf8mb4"
ユーザ名 root
パスワード admin
オプション フェッチモード: PDO::FETCH_ASSOC
エラーレポート:PDO::ERRMODE_EXCEPTION
エミュレート:false
-
select
文を定義するselect id, title from categories order by id
-
定義した
select
文のプリペアドステートメントを作成する -
プリペアドステートメントを実行する
-
categories
レコードの一覧をフェッチする -
【例外(
PDOException
)が発生した場合】- エラーログにエラーメッセージを出力する
PDOException
のエラーメッセージを出力する- エラー画面にリダイレクトする
- 処理を終了する
-
HTMLを出力する
- 入力フォームを出力する
store.php
にPOSTリクエストを送信する
項目名 type属性 name属性 備考 コースID number id タイトル text title 学習時間 number learning_time カテゴリー select category_id categories
レコードの一覧を出力する- コース一覧画面への
BACK
リンクを出力する
create.php
<?php
// TODO
?>
<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="UTF-8">
<title>PHP DB</title>
</head>
<body>
<h3>Courses - Create</h3>
<hr>
<form action="store.php" method="post">
ID: <input type="number" name="id"><br>
TITLE: <input type="text" name="title"><br>
L-TIME: <input type="number" name="learning_time"><br>
CATEGORY:
<select name="category_id">
<?php foreach ($categories as $category) { ?>
<option value="<?= htmlspecialchars($category['id']) ?>">
<?= htmlspecialchars($category['title']) ?>
</option>
<?php } ?>
</select><br>
<button type="submit">STORE</button>
</form>
<hr>
<a href="index.php">BACK</a>
</body>
</html>
store.php
の実装
概要
- コースレコードを作成する
処理記述
-
リクエストパラメータを取得し、入力チェックを行う
項目名 パラメータ名 入力チェック コースID id 必須、整数型 タイトル title 必須、最大255文字まで 学習時間 learning_time 必須、整数型 カテゴリー category_id 必須、整数型 - 【入力チェックに違反した場合】
- エラーログに入力エラーメッセージを出力する
- エラー画面にリダイレクトする
- 処理を終了する
-
PDO
インスタンスを生成する引数 値 DSN "mysql:host=localhost;dbname=eldb;charset=utf8mb4"
ユーザ名 root
パスワード admin
オプション フェッチモード: PDO::FETCH_ASSOC
エラーレポート:PDO::ERRMODE_EXCEPTION
エミュレート:false
-
insert
文を定義する-
insert into courses (id, title, learning_time, category_id) values (:id, :title, :learning_time, :category_id)
-
-
定義した
insert
文のプリペアドステートメントを作成する -
プリペアドステートメントのプレースホルダに値をバインドする
プレースホルダ バインドする値 データ型 :id リクエストパラメータのコースID 整数型 :title リクエストパラメータのタイトル 文字列型 :learning_time リクエストパラメータの学習時間 整数型 :category_id リクエストパラメータのカテゴリーID 整数型 -
プリペアドステートメントを実行する
-
コース一覧画面にリダイレクトする
-
【例外(
PDOException
)が発生した場合】- エラーログにエラーメッセージを出力する
PDOException
のエラーメッセージを出力する- エラー画面にリダイレクトする
store.php
<?php
// TODO
動作確認
コマンドラインからビルトインWebサーバを起動します。
$ php -S localhost:8080
ブラウザから以下のURLにアクセスします。
https://〜.vfs.cloud9.ap-northeast-1.amazonaws.com/courses/index.php
CREATE
リンクをクリックして、コース作成画面から画面仕様に従ってコースレコードが作成できることを確認します。