Web版レシート管理作成記 CRUDの「C」について(1/2)

プログラミング

Userテーブルにデータを登録するプログラムを作成しました。
いわゆるCRUDのC(Create)の部分です。
メニュー画面「UserテーブルのCRUD」から、「新規作成」「更新」「削除」「照会」ができるようにしていきます。
今回、「新規作成」の機能を作ったので整理して掲載します。
掲載する内容は次の3つで、今回は1と2について掲載し、3は次回掲載する予定です。

  1. 画面の紹介(メニュー画面~新規作成画面)
  2. POSTリクエストの授受の方法
  3. プログラムコードと解説(次回掲載)

1. 画面の紹介

下図が画面サンプルです。
①メニュー画面「UserテーブルのCRUD」で「新規作成」ボタンをクリックすると、②「Userデータの新規作成」画面が表示されます。
データ入力後に[登録]ボタンが押されると、入力データをUserテーブルに登録します。
[取消し]ボタンは入力途中のデータを消去します。
[戻る]ボタンはメニュー画面「UserテーブルのCRUD」へ戻ります。
[登録]ボタンが押されたときに入力チェックを行い、入力に誤りがあった場合は、エラーメッセージを表示③し、データの登録はしません。

2. POSTリクエストの授受の方法

MVCの V(ビュー)から C(コントローラー)を呼出し、リクエストを引き渡す処理についてです。

ビューからコントローラークラスを呼出すために、前々回のブログで「ブラウザの要求をコントローラーの適切なメソッドへ橋渡しする」PHPプログラムを作成し、その中でコントローラーのインスタンスの作成とメソッド呼出しを行う、という方法を紹介しました。

その他に、下記コード例のようにUserTestCreateControllerクラスの外にインスタンスを作成と、メソッド呼出しのコードを記述することができます。
(62行目と63行目)
$controller = new UserTestCreateController();
$controller->handleRequest();

<?php
/**
 * Description of UserTestCreateController
 * Userテーブルの新規作成画面に対するコントローラーの役割
 */
class UserTestCreateController{
    // クラス変数を定義します
    private $insert_user_data = []; // インサートする値を保持する連想配列
    private $pdo_model; // PDOModelのインスタンスを保持

    // コンストラクター
    public function __construct() {
        require_once(__DIR__ . '/PDOModel.php');

        // Modelクラスのインスタンスを生成します
        $this->pdo_model = new PDOModel();
    }

    /******************************************************
     * 当メソッドはUserTestCreateView.htmlから呼ばれます
     * [新規作成]、[取消し]、[戻る]ボタンが選択された時の
     * POSTリクエストの処理を行います
     *****************************************************/
    public function handleRequest() {
        // 「登録」ボタンのPOSTリクエストの処理
        if (isset($_POST['create']) && $_POST['create'] == "登 録") {
        
            // 画面入力の値を連想配列にセット
            $insert_user_data = array(
                'UID' => htmlspecialchars($_POST['userid'], ENT_QUOTES),
                'password' => htmlspecialchars($_POST['password'], ENT_QUOTES),
                'name' => htmlspecialchars($_POST['name'], ENT_QUOTES)
            );

            $this->pdo_model->db_connect(); // データベースに接続します
            $this->pdo_model->insert_user($insert_user_data); // 画面入力の値をUserテーブルにインサート

            // Userデータ表示ページ(UserTestCreateView.html)へリダイレクトします
            header('Location: UserTestCreateView.html');

        // 「取消し」ボタンのPOSTリクエストの処理
        } elseif (isset($_POST['cancel']) && $_POST['cancel'] == "取消し") {
            // Userデータ新規作成ページ(UserTestCreateView.html)へリダイレクトします
            header('Location: UserTestCreateView.html');

        // 「戻る」ボタンのPOSTリクエストの処理
        } elseif (isset($_POST['back']) && $_POST['back'] == "戻 る") {
            // メニューページ(UserTestMenuView.html)へリダイレクトします
            header('Location: UserTestMenuView.html');
        }
    }
}

// コントローラーのインスタンスを作成し、handleRequestメソッドを呼び出す
/********************************************************
* クラスの外に記述されたコードは、PHPスクリプトが実行された際に
* コントローラーのインスタンスを作成し、
* リクエストの処理を行うためのメソッドを呼び出すためのものです。
* これにより、フォームのPOSTリクエストが適切に処理され、
* ユーザーが行ったアクションに応じて必要な処理が実行されます。
*********************************************************/
$controller = new UserTestCreateController();
$controller->handleRequest();
?>


MVCの構造にしましたので、それぞれをクラスとして作成し、クラス内にメソッドを記述します。
このクラスはインスタンス化することによって、利用することができます。
コントローラーもクラスですから、どこかでインスタンス化しなければ利用できません。

前々回は橋渡しをするPHPプログラム内でコントローラーのクラスをインスタンス化してメソッドを呼出しましたが、上記のようにPHPでは<?phpと?>で囲まれた中に、クラスコードとそれ以外のコードを記述することができます。
このように、一つのファイル(拡張子.php)の<?php   ?>で囲まれた中にクラスとクラス外にインスタンスの作成コードおよびメソッド呼出しコードを記述することができるのです。

こうした基本的なことを知らないので、結構、試行錯誤をしてしまいます。

なお、POSTリクエストは$_POSTグローバル変数で参照することができます。
$_POST 変数は、特定のHTTPリクエストによって送信されたデータを格納します。
そのため、同じサーバー上で実行される他のPHPスクリプトであっても、同じHTTPリクエストのコンテキスト内でなければアクセスできません。
つまり、$_POST 変数は、そのリクエストが処理されている間に限り有効です。

具体的には次のようになります:

  • HTTPリクエストのコンテキスト: $_POST 変数は特定のHTTPリクエストによって送信されたデータを保持します。この変数は、リクエストの処理が行われる間、そのリクエスト内のすべてのスクリプトでアクセス可能です。
  • 同一リクエスト内: UserTestReceiveRequest.php から UserTestController 内の handleRequest メソッドまで、同じリクエスト内であれば $_POST 変数は利用可能です。
  • 新しいリクエストごとに初期化: 新しいHTTPリクエストが発生すると、$_POST 変数は新しいリクエストデータで上書きされます。したがって、別のリクエストからアクセスすることはできません。

このことを通常のケースで具体的に考えてみましょう。
Aページからのリクエストがあり、Aページにレスポンスを返し、あらたにBページからのリクエストがあり、Bページにレスポンスを返す、という画面遷移を考えてみます。
Aページが注文入力ページでBページが支払方法の入力ページなどを想定してもよいでしょう。
AページのリクエストからレスポンスまでがHTTPリクエストのコンテキストであり、同一のリクエスト内ということになります。
このAページのリクエストとレスポンスの期間は、すべてのPHPスクリプトからAページのリクエストを $_POST 変数で参照できます。
Bページからのリクエストが来るとAページが持っていた$_POST 変数は初期化されます。
そして、BページのリクエストからレスポンスまでがHTTPリクエストのコンテキストであり、同一のリクエスト内ということになります。
このBページのリクエストとレスポンスの期間は、すべてのPHPスクリプトからBページのリクエストを $_POST 変数で参照できます。

Webアプリの作成技術を身につけるために、Userテーブルに対するCRUD処理を勉強題材としています。
PHPプログラムだけでなく、HTML、CSS、JavaScriptなども必須となります。
多岐にわたっていますが、Copilot(AI)が大いに理解の助けになっています。
ネットで調べる、書物で調べるも良いのですが、これからの学習にAIは欠かせないツールだと思うようになりました。
少なくとも、プログラミングの世界はそう断言しても良いのではないでしょうか。
AIの答えに納得しない場合、さらに質問すると答えが瞬時に帰ってきます。
そうしたやり取りを重ねていくことで、理解のスピードが格段に上がるのです。
もちろん、AIの回答が常に正しいわけではありませんが、何度かやり取りを続けることで、AIとのやり取りの切上げ時の見極めがつくようになってきました。
「2.POSTリクエストの授受の方法」は、Copilot(AI)とのやり取りを通じて理解したものです。

Web版レシート管理作成記 CRUDの「C」について(2/2)

タイトルとURLをコピーしました