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

以下に指示に従ってプログラムを開発してください。


ファイル一覧

処理 ファイル 概要
コース詳細表示処理 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_id categories レコードの一覧を出力する
    既存のカテゴリー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 リンクをクリックして、コース更新画面から画面仕様に従ってコースレコードが更新できることを確認します。