ここではコース更新処理を実装します。

以下に指示に従ってプログラムを開発してください。
ファイル一覧
| 処理 | ファイル | 概要 |
|---|---|---|
| コース詳細表示処理 | courses/show.php |
コース詳細画面を表示する |
| コース更新処理 | courses/edit.php |
コース更新画面を表示する |
| コース更新処理 | courses/update.php |
コースレコードを更新する |
画面仕様
コース詳細画面( show.php )

EDIT リンクを追加します。
コース更新画面( edit.php )

入力フォームに更新対象のレコードを表示します。

入力内容を更新して UPDATE ボタンをクリックします。

データベース( courses テーブル)の対象レコードを更新し、コース一覧画面にリダイレクトします。コース一覧画面には更新したレコードが表示されます。
show.php の実装(修正)
概要
- コース詳細画面を表示する
処理記述(修正箇所のみ抜粋)
-
HTMLを出力する
coursesレコードを出力する- コース更新画面への
EDITリンクを出力する - リンク先にクエリパラメータを送信する
項目名 パラメータ名 コースID id - コース作成画面への
CREATEリンクを出力する
show.php (修正箇所のみ抜粋)
...省略
<body>
<h3>Courses - Show</h3>
<hr>
ID: <?= htmlspecialchars($course['id']) ?><br>
TITLE: <?= htmlspecialchars($course['title']) ?><br>
L-TIME: <?= htmlspecialchars($course['learning_time']) ?><br>
CATEGORY: <?= htmlspecialchars($course['category_title']) ?><br>
<a href="edit.php?id=<?= htmlspecialchars($course['id']) ?>">EDIT</a>
<hr>
<a href="index.php">BACK</a>
</body>
</html>
edit.php の実装
概要
- コース更新画面を表示する
処理記述
-
リクエストパラメータを取得し、入力チェックを行う
項目名 パラメータ名 入力チェック コースID id 必須、整数型 - 【入力チェックに違反した場合】
- エラーログに入力エラーメッセージを出力する
- エラー画面にリダイレクトする
- 処理を終了する
-
PDOインスタンスを生成する引数 値 DSN "mysql:host=localhost;dbname=eldb;charset=utf8mb4"ユーザ名 rootパスワード adminオプション フェッチモード: PDO::FETCH_ASSOC
エラーレポート:PDO::ERRMODE_EXCEPTION
エミュレート:false -
select文を定義するselect id, title, learning_time, category_id from courses where id = :id
-
定義した
select文のプリペアドステートメントを作成する -
プリペアドステートメントのプレースホルダに値をバインドする
プレースホルダ バインドする値 データ型 :id リクエストパラメータのコースID 整数型 -
プリペアドステートメントを実行する
-
プリペアドステートメントから
coursesレコードを1件フェッチする- 【レコードをフェッチできなかった場合】
- エラーログにエラーメッセージを出力する
Invalid id.とエラーメッセージを出力する
- エラー画面にリダイレクトする
- 処理を終了する
-
select文を定義するselect id, title from categories order by id
-
定義した
select文のプリペアドステートメントを作成する -
プリペアドステートメントを実行する
-
categoriesレコードの一覧をフェッチする -
【例外(
PDOException)が発生した場合】- エラーログにエラーメッセージを出力する
PDOExceptionのエラーメッセージを出力する- エラー画面にリダイレクトする
- 処理を終了する
-
HTMLを出力する
- 入力フォームを出力する
update.phpにPOSTリクエストを送信する
項目名 type属性 name属性 value属性 備考 コースID hidden id coursesレコードのidタイトル text title coursesレコードのtitle学習時間 number learning_time coursesレコードのlearning_timeカテゴリー select category_id coursesレコードのcategory_idcategoriesレコードの一覧を出力する
既存のカテゴリーIDに該当するものを初期選択とする- コース一覧画面への
BACKリンクを出力する
edit.php
<?php
// TODO
?>
<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="UTF-8">
<title>PHP DB</title>
</head>
<body>
<h3>Courses - Edit</h3>
<hr>
<form action="update.php" method="post">
<input type="hidden" name="id"
value="<?= htmlspecialchars($course['id']) ?>">
ID: <?= htmlspecialchars($course['id']) ?><br>
TITLE: <input type="text" name="title"
value="<?= htmlspecialchars($course['title']) ?>"><br>
L-TIME: <input type="number" name="learning_time"
value="<?= htmlspecialchars($course['learning_time']) ?>"><br>
CATEGORY:
<select name="category_id">
<?php foreach ($categories as $category) { ?>
<option value="<?= htmlspecialchars($category['id']) ?>"
<?= $category["id"] === $course["category_id"] ? "selected" : "" ?>>
<?= htmlspecialchars($category['title']) ?>
</option>
<?php } ?>
</select><br>
<button type="submit">UPDATE</button>
</form>
<hr>
<a href="index.php">BACK</a>
</body>
</html>
update.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 -
update文を定義する-
update courses set title = :title, learning_time = :learning_time, category_id = :category_id where id = :id
-
-
定義した
update文のプリペアドステートメントを作成する -
プリペアドステートメントのプレースホルダに値をバインドする
プレースホルダ バインドする値 データ型 :title リクエストパラメータのタイトル 文字列型 :learning_time リクエストパラメータの学習時間 整数型 :category_id リクエストパラメータのカテゴリー 整数型 :id リクエストパラメータのコースID 整数型 -
プリペアドステートメントを実行する
-
コース一覧画面にリダイレクトする
-
【例外(
PDOException)が発生した場合】- エラーログにエラーメッセージを出力する
"PDOException: "の後にPDOExceptionのエラーメッセージを出力する- エラー画面にリダイレクトする
update.php
<?php
// TODO
動作確認
コマンドラインからビルトインWebサーバを起動します。
$ php -S localhost:8080
ブラウザから以下のURLにアクセスします。
https://〜.vfs.cloud9.ap-northeast-1.amazonaws.com/courses/index.php

SHOW リンクをクリックして、コース詳細画面へ遷移できることを確認します。

EDIT リンクをクリックして、コース更新画面から画面仕様に従ってコースレコードが更新できることを確認します。