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

プログラミング

UserデータのCRUDのU(Update)の2回シリーズの第2回です。
今回は、MVCの全体の構成と関連の概念図とプログラムコードを掲載します。
プログラムコードはU(Update)機能の追加または変更になったクラス、スクリプトファイルを掲載します。

MVCの全体の構成と各構成間の関連の概念図です。

上記の構成のうち、Update機能の追加に関するコードについて解説します。

  1. UserTestController.php
    「UserデータのCRUD」ページ(UserTestMenuView.html)の表示と当ページから送出されたリクエストの処理を行うコントローラークラスです。
    run()メソッドでは「UserデータのCRUD」ページ(UserTestMenuView.html)へリダイレクトします。
    「UserデータのCRUD」ページから送出されたPOSTリクエストは、handleRequest()メソッドで処理します。
    当メソッドにおいてPOSTリクエストが「更新」と判定された場合、セッション変数ses_data_operationに”U”をセットして保管し、「Userデータの検索」ページ(UserTestSCondView.html)へリダイレクトします。
    コード掲載はこちら
  2. UserTestSCondController.php
    「userデータの検索」ページ(UserTestSCondView.html)から送出されたリクエストの処理を行うコントローラークラスです。
    具体的には、次の処理を行います。
    「userデータの検索」ページで指定された検索方法でデータ検索します。
    検索結果をセッション変数ses_table_dataに保管します。
    また、検索結果に基づいてページング情報を算出し、セッション変数ses_paging_infoに保管します。
    (総データ数、最初に表示するデータのインデックスNo.、最後に表示するデータのインデックスNo.)
    セッションからデータ操作(ses_data_operation)を取り出して、データ操作に応じたデータ表示ページにリダイレクトします。
    データ操作が”U”の場合、「userテーブルの更新データの選択」ページ(3..UserTestUpdateDataView.php)へリダイレクトします。
    コード掲載はこちら
  3. UserTestUpdateDataView.php
    「userテーブルの更新データの選択」ページで、当ページの一覧の中から更新するデータを選択し、選択されたデータのAI_User(主キー)をPOSTリクエストで送出します。
    セッションからses_table_dataとses_paging_infoを取り出して2.UserTestSCondcontroll.phpで検索したデータを表示します。
    更新データの選択ボタンにはUserテーブルの主キー:AI_Userの値をセットします。
    これにより選択したデータのAI_Userの値をPOSTリクエストします。
    下記コードの8行目でtype=”hidden”で非表示にし、valueにUserデータのAI_Userの値を指定します。
    9行目でsubmit用の選択ボタンを表示します。
    これにより、選択ボタンが押されたとき、AI_User(主キー)をPOSTリクエストします。
<?php
    if($paging_info['total_record'] != 0){
        for($i = $paging_info['first_record']; $i <= $paging_info['last_record']; $i++){
?>
~ 省 略 ~
    <td class="label2" style="text-align: center;">
        <form action="UserTestUpdateDataController.php" method="post" style="display:inline;">
            <input type="hidden" name="Selected_AI_Character" value="<?= htmlspecialchars($table_data[$i]['AI_User'], ENT_QUOTES, 'UTF-8') ?>">
            <button type="submit" class="select_button">選択</button>
        </form>
    </td>
~ 省 略 ~

コード掲載はこちら

  1. UserTestUpdateDataController.php
    「userテーブルの更新データの選択」ページから送出されたリクエストの処理を行うコントローラークラスです。
    [選択]、[次ページ]、[前ページ]、[戻る]ボタンのPOSTリクエストを処理します。
    ここでは、[選択]ボタンが押されたときの処理を解説します。
    受取ったAI_User(主キー)でUserテーブルを検索し、検索結果をセッション変数ses_update_dataに保管します。(主キーなので、検索結果は必ず1件です。)
    これは、「userデータの更新」ページ(5.UserTestUpdateView.php)でses_update_dataのデータを取り出して更新するデータを表示するためです。
    「userデータの更新」ページ(5.UserTestUpdateView.php)へリダイレクトします。
~~ 省 略 ~~
        if (isset($_POST['Selected_AI_Character'])) {                            // 更新の対象データが選択されたか?
            //更新の対象データが選択されたときの処理
            
            $AI_User = (int) $_POST['Selected_AI_Character'];                    // $_POSTの値を数値に変換して$AI_Userに代入

            $this->pdo_model->db_connect();                                      // データベースに接続

            $this->update_data = $this->pdo_model->select_AI_User($AI_User);     // 選択されたUserデータを取得し、その返り値を配列に代入

            $this->session_model->set_update_data($this->update_data);           // Userテーブルデータをセッションに保管

            header('Location: UserTestUpdateView.php');                          // 「Userデータの更新」ページへリダイレクト 
~~ 省 略 ~~

コード掲載はこちら

  1. UserTestUpdateView.php
    「Userデータの更新」ページです。
    セッションからses_update_dataのデータを取り出して、更新前のデータを表示します。
    [登録]ボタンが押されたら、入力チェック(JavaScriptコード)をし、入力に誤りがあればPOSTリクエストは送出しません。
    入力に問題がなければ、入力データをPOSTリクエストとして送出します。
    コード掲載はこちら
  2. UserTestUpdateController.php
    「Userデータの更新」ページ(5.UserTestUpdateView.php)から送出されたリクエストの処理を行うコントローラークラスです。
    ここでは[登録]ボタンが押されたときの処理を解説します。
    「Userデータの更新」ページで入力されたデータでUserテーブルをUPDATEします。
    「userテーブルの更新データの選択」ページに表示するデータを更新するために、セッションからses_tabel_dataを取り出し、ses_tabel_dataの変更したレコードの値を更新します。
    更新したses_tabel_dataを再びセッションに保管します。
    「userテーブルの更新データの選択」ページ(UserTestUpdateDataView.php)へリダイレクトします。
    コード掲載はこちら
  3. SessionModel.php
    更新するUserデータ(1件)をセッションに保管および取り出す関数を追加しました。
    //*****************************************************
    // 更新するuserデータをセッションに保管します
    //*****************************************************
    public function set_update_data(array $update_data) {
        
        $this->update_data = $update_data;
        
        // セッション変数(ses_update_data)を削除します
        unset($_SESSION['ses_update_data']);
        
        // 更新するuserデータをセッション変数(ses_update_data)に保管します
        $_SESSION['ses_update_data'] = $this->update_data;
        
        return;
    }
    
    //*****************************************************
    // 更新するuserデータをセッションから取り出します
    //*****************************************************
    public function get_update_data() {   
    
        // セッションから更新するuserデータを取り出します
        $this->update_data = isset($_SESSION['ses_update_data']) ? $_SESSION['ses_update_data'] : [];
    
        // 取り出した更新するuserデータを返します
        return $this->update_data;
    }

コード掲載はこちら

  1. PDOModel.php
    Userデータの更新登録をする関数を追加しました。
    //*****************************************************
    // Userデータアップデート処理
    //*****************************************************
    public function update_user($update_user_data) {
        try {
            $this->pdo->beginTransaction(); // トランザクション開始

            $sql = "UPDATE user
                    SET UID = :UID, password = :password, name = :name
                    WHERE AI_User = :AI_User";

            $stmh = $this->pdo->prepare($sql); // SQL文を解析し、準備ステートメントオブジェクト(PDOStatement)を生成

            // Updateする値を紐づけ
            $stmh->bindValue(':AI_User', (int)$update_user_data['AI_User'], PDO::PARAM_INT);
            $stmh->bindValue(':UID', $update_user_data['UID'], PDO::PARAM_STR);
            $stmh->bindValue(':password', $update_user_data['password'], PDO::PARAM_STR);
            $stmh->bindValue(':name', $update_user_data['name'], PDO::PARAM_STR);

            $stmh->execute(); // update文を実行
            $this->pdo->commit(); // コミット
            return true;
        } catch (PDOException $Exception) {
            $this->pdo->rollBack();
            print "エラー:" . $Exception->getMessage();
            return false;
        }
    }   

コード掲載はこちら

コードの掲載

UserTestController.php
<?php
/**
 * Description of UserTestController
 * 「UserテーブルのCRUD」ページに対するコントローラーの役割
 * 
 */
class UserTestController{
    //クラス変数を定義します
    private $table_data = [];                              //userテーブルデータを保持する配列変数
    private $paging_info = [];                             //ページング情報を保持する配列変数
    private $session_model;                                //SessionModelのインスタンスを保持

    const CREATE = 'C';                                    // データ操作:Create
    const READ   = 'R';                                    // データ操作:Read
    const UPDATE = 'U';                                    // データ操作:Update
    const DELETE = 'D';                                    // データ操作:Delete

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

        $this->session_model = new SessionModel();         //Modelクラスのインスタンスを生成
    }

    /******************************************************
     * 当メソッドはUserTestEntry.phpから呼ばれます
     * 「UserデータCRUD」ページを表示します
     *****************************************************/
    public function run() {
    
        //「UserデータCRUD」ページ(UserTestMenuView.html)へリダイレクト
        header('Location: UserTestMenuView.html');
        
        exit();
    }

    /******************************************************
     * 当メソッドはUserTestRecieveRequest.phpから呼ばれます
     * 「UserデータCRUD」ページにおいて
     * [新規作成]、[更新]、[削除]、[照会]、[終了]ボタンが
     * 選択された時のPOSTリクエストの処理を行います
     *****************************************************/
    public function handleRequest() {

        $this->session_model->sessionstart();                  // セッションを再開します


        if (isset($_POST['create']) && $_POST['create'] == "新規作成") {
            //「新規作成」ボタンが選択されたときの処理

            $this->session_model->set_data_operation(CREATE);  // データ操作 'C':Createをセッションに保管します

            header('Location: UserTestCreateView.html');       //「Userデータ新規作成」ページへリダイレクト

        } elseif (isset($_POST['update']) && $_POST['update'] == "更  新") {
            //「更  新」ボタンが選択されたときの処理

            $this->session_model->set_data_operation(UPDATE);  // データ操作 'U':Updateをセッションに保管

            header('Location: UserTestSCondView.html');        // 「Userデータの検索条件入力」ページへリダイレクト

        } elseif (isset($_POST['delete']) && $_POST['delete'] == "削  除") {
            //「削  除」ボタンが選択されたときの処理
            
            $this->session_model->set_data_operation(DELETE);  // データ操作 'D':Deleteをセッションに保管

            header('Location: UserTestSCondView.html');        // 「Userデータの検索条件入力」ページへリダイレクト

        
        } elseif (isset($_POST['read']) && $_POST['read']     == "照  会") {
            //「照  会」ボタンが選択されたときの処理

            $this->session_model->set_data_operation(READ);    // データ操作 'R':Readをセッションに保管

            header('Location: UserTestSCondView.html');        // 「Userデータの検索条件入力」ページへリダイレクト

        
        } elseif (isset($_POST['end']) && $_POST['end']       == "終  了") {
            //「終  了」ボタンが選択されたときの処理
            
            $_SESSION = [];                                    // セッション変数を空にします

            // クッキーを削除します
            if (ini_get("session.use_cookies")) {
                $params = session_get_cookie_params();
                setcookie(session_name(), '', time() - 42000,
                    $params["path"], $params["domain"],
                    $params["secure"], $params["httponly"]
                );
            }

            session_destroy();                                 // セッションを破壊します

            header('Location: UserTestEndView.html');          // 終了ページへリダイレクト

        }
    }
}
?>

戻る

UserTestSCondController.php
<?php
/**
 * Description of UserTestSCondController
 * 「Userデータの検索条件入力」ページのリクエストUserテーブルの検索画面に対するコントローラーの役割
 * 
 */
class UserTestSCondController{
    //クラス変数を定義します
    private $table_data = [];                              //userテーブルデータを保持する配列変数
    private $paging_info = [];                             //ページング情報を保持する配列変数
    private $session_model;                                //SessionModelのインスタンスを保持
    private $pdo_model;                                    //PDOMdelのインスタンスを保持
    private $paging_model;                                 //PagingModelインスタンスを保持
    private $data_operation;                               //データ操作(C,R,U,D)を保持

    const CREATE = 'C';                                    // データ操作:Create
    const READ   = 'R';                                    // データ操作:Read
    const UPDATE = 'U';                                    // データ操作:Update
    const DELETE = 'D';                                    // データ操作:Delete

    //コンストラクター
    public function __construct() {
        require_once(__DIR__ . '/SessionModel.php');
        require_once(__DIR__ . '/PDOModel.php');
        require_once(__DIR__ . '/PagingModel.php');
        
        //Modelクラスのインスタンスを生成します
        $this->session_model = new SessionModel();
        $this->pdo_model = new PDOModel();
        $this->paging_model = new PagingModel();
    }

    /******************************************************
     * 当メソッドは「Userデータの検索条件入力」ページ
     * UserSCondView.htmlから呼ばれます
     * [検索開始]、[戻る]、「前ページ]、[次ページ]ボタンが
     * 選択された時のPOSTリクエストの処理を行います
     * [検索開始]ボタンが選択されたとき、
     * 指定された検索条件でUserデータを抽出し、
     * データ操作(U,D,R)ごとのデータ表示ページへリダイレクト
     * します。
     *****************************************************/
    public function handleRequest() {

        $this->session_model->sessionstart();                                    // セッションを開始    

        if (isset($_POST['search']) && $_POST['search'] == "検索開始") {
            //「検索開始」ボタンが選択されたときの処理

            $this->pdo_model->db_connect();                                      // データベースに接続

            $this->data_operation = $this->session_model->get_data_operation();  // セッションからデータ操作(R,U.D)を取り出し
                                                                                 // データ操作(R,U,D)<ses_data_operation>は
                                                                                 // UserTestControllerクラスで保管されます_

            $searchOption = isset($_POST['searchop']) ? $_POST['searchop'] : ''; // ラジオボタンの選択値(すべて検索 or 条件検索)を取得

            if ($searchOption == 'all') {
                // [すべて検索]が選択されたときの処理
                $this->table_data = $this->pdo_model->select_all();              // Userテーブルデータを全件取得し、その返り値を配列に代入

            } elseif ($searchOption == 'condition') {
                // [条件検索]が選択されたときの処理
                $searchname = isset($_POST['searchname']) ? $_POST['searchname'] : '';  // 名前を取得
                $matching = isset($_POST['match']) ? $_POST['match'] : '';              // マッチング方法を取得
                                                                                        // (完全一致、前方一致、後方一致、前方後方一致)
                //Userテーブルデータをマッチング検索で取得し、その返り値を配列に代入
                $this->table_data = $this->pdo_model->select_matching($searchname,$matching); 
            }

            $this->session_model->set_user_table($this->table_data);             // Userテーブルデータをセッションに保管
        
            $this->paging_info = $this->paging_model->init($this->table_data);   // 初回に表示するページングの値を算出
         
            $this->session_model->set_paging_info($this->paging_info);           // 初回に表示するページングデータをセッションに保管


            // データ操作(R,U,D)ごとのページを表示する処理
            if($this->data_operation == UPDATE){
                // データ操作がUPDATEの場合
                header('Location: UserTestUpdateDataView.php');                  // 「userテーブルの更新データの選択」ページへリダイレクト
            
            }else if($this->data_operation == DELETE){
                // データ操作がDELETEEの場合
                //header('Location: UserTestDeleteView.html');

            }else if($this->data_operation == READ){
                // データ操作がREADの場合参照
                header('Location: UserTestDataView.php');                        // 「userテーブルのデータ」ページへリダイレクト
            }

        } elseif (isset($_POST['back']) && $_POST['back'] == "戻 る") {
            //「戻 る」ボタンが選択されたときの処理
            
            unset($_SESSION['ses_data_operation']);                              // セッション変数(ses_data_operation)を削除

            header('Location: UserTestMenuView.html');                           // 「UserテーブルのCRUD」ページへリダイレクト

        }
    }
}

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

戻る

UserTestUpdateDataView.php
<?php
    
    session_name('PHPSESSION_MEMBER');                     // セッション名セット
    session_start();                                       // セッション開始
    
    // セッションからUserテーブルデータとページング情報を取り出します
    $table_data  = isset($_SESSION['ses_table_data']) ? $_SESSION['ses_table_data'] : [];
    $paging_info = isset($_SESSION['ses_paging_info']) ? $_SESSION['ses_paging_info'] : [];
    
?>

<!doctype html>
<html>
<head>
<meta charset="utf-8">

<style>
    div.main{
            width: 960px;
            min-height:300px;
            margin:0 0 0 0;
            padding:10px;
            background-color:#ffffff;
    }
    table{border: 0; border-collapse: collapse;}
    #button_area{width:100%}
    h1{text-align: center; color: #002060;  background-color:#F4B084; line-height: 120%}
    .label2{border: solid 1px #000000; border-collapse: collapse; height: 30px;}
    .label3{color: #ffffff; background-color:#305496; font-weight: 600; border: solid 1px #000000; border-collapse: collapse; text-align: center; height: 25px;}
    .func_button{color:#ffffff; background-color:#4472c4; font-weight: 600; width: 80px; height: 40px;font-size:11pt;}
    #back{
        float : left;
        text-align: left;
    }
    #next{
        text-align : right;
    }
    .select_button{
        line-height:20pt;
        padding:2px 10px 2px 10px;
        border-style: solid;
        border-width: 1px;
        border-color: 000000;
        text-decoration:none;
        font-size:11pt;
        font-weight: 600;
        text-align: center;
        color:#800080;
        border-color: 000000;
        background-color:#d9d9d9;
        display: block; /* displayをblockに設定して中央揃えを確実にする */
        margin: 0 auto; /* ボタンを中央揃えにする */
    }
</style>

<title>select update data</title>
</head>

<body>

<div class="main">

<h1>userテーブルの更新データの選択</h1>

<table style="width:100%;">

    <tr>
        <th style="width:115px; text-align: center" class="label3">AI</th>
        <th style="width:220px; text-align: center" class="label3">User ID</th>
        <th style="width:220px; text-align: center" class="label3">パスワード</th>
        <th style="width:330px; text-align: center" class="label3">名前</th>
        <th style="width:75px; text-align: center" class="label3">選択</th>
    </tr>
    <?php

        if($paging_info['total_record'] != 0){
            for($i = $paging_info['first_record']; $i <= $paging_info['last_record']; $i++){
    ?>
                <tr>
                    <td class="label2" style="text-align: center;">
                        <?= htmlspecialchars($table_data[$i]['AI_User']) ?>
                    </td>
                    <td class="label2" style="text-align: left;">
                        <?= htmlspecialchars($table_data[$i]['UID']) ?>
                    </td>
                    <td class="label2" style="text-align: left;">
                        <?= htmlspecialchars($table_data[$i]['password']) ?>
                    </td>
                    <td class="label2" style="text-align: left">
                        <?= htmlspecialchars($table_data[$i]['name']) ?>
                    </td>
                    <!-- 更新するデータの選択ボタン クリックすると更新画面を表示 -->
                    <!-- 選択されたデータの「AI_User」をPOSTリクエストで送出します -->
                    <td class="label2" style="text-align: center;">
                        <form action="UserTestUpdateDataController.php" method="post" style="display:inline;">
                            <input type="hidden" name="Selected_AI_Character" value="<?= htmlspecialchars($table_data[$i]['AI_User'], ENT_QUOTES, 'UTF-8') ?>">
                            <button type="submit" class="select_button">選択</button>
                        </form>
                    </td>
                </tr>
    <?php
            }
        } else {
            echo "<tr><td colspan='5' class='label2' style='text-align: center;'>表示するデータがありません。</td></tr>";
        }
    ?>

</table>

<form action="UserTestUpdateDataController.php" method="post">

<div id="back">
    <?php
        if($paging_info['first_record'] != 0){
    ?>
            <input type="submit" name="back" value="≪前ページ">
    <?php
        }
    ?>
</div>

<div id="next">
    <?php

        if ($paging_info['last_record'] > 0 && $paging_info['last_record'] < floor(($paging_info['total_record'] - 1) / $paging_info['lines']) * $paging_info['lines']) {
    ?>
            <input type="submit" name="next" value="次ページ≫">
    <?php
        }
    ?>
</div>

<p></p>
<table id="button_area" style="width:100%">
    <tr>
        <td style="width:33%; text-align: center;"></td>
        <td style="text-align: center;"><input class="func_button" name="return" value="戻る" type="submit" /></td>
        <td style="width:33%; text-align: center;"></td>
    </tr>
</table>
<table>

</table>

</form>
<p>paging info</p>
<p><?php echo "total:" . $paging_info['total_record']; ?></p>
<p><?php echo "first:" . $paging_info['first_record']; ?></p>
<p><?php echo "last:" . $paging_info['last_record']; ?></p>


</div>

</body>
</html>

戻る

UserTestUpdateDataController.php
<?php
/**
 * Description of UserTestUpdateDataController
 * 「userテーブルの更新データの選択」ページに対するコントローラー
 * 
 */
class UserTestUpdateDataController{
    //クラス変数を定義します
    private $paging_info = [];                             // ページング情報を保持する連想配列変数
    private $update_data = [];                             // 更新データを保持する連想配列変数
    private $session_model;                                // SessionModelのインスタンスを保持
    private $pdo_model;                                    // PDOModelのインスタンスを保持
    private $paging_model;                                 // PagingModelインスタンスを保持

    //コンストラクター
    public function __construct() {
        require_once(__DIR__ . '/SessionModel.php');
        require_once(__DIR__ . '/PDOModel.php');
        require_once(__DIR__ . '/PagingModel.php');
        
        //Modelクラスのインスタンスを生成します
        $this->session_model = new SessionModel();
        $this->pdo_model = new PDOModel();
        $this->paging_model = new PagingModel();
    }

    /******************************************************
     * 当メソッドは「userテーブルの更新データの選択」ページ
     * UserSTestUpdateDataView.htmlから呼ばれます
     * [選択]、[戻る]、「前ページ]、[次ページ]ボタンが
     * 選択された時のPOSTリクエストの処理を行います
     * [選択]ボタンが選択された時、選択されたデータの
     * 「userテーブルの更新登録」ページへリダイレクトします。     
     *****************************************************/
    public function handleRequest() {

        $this->session_model->sessionstart();                                    // セッションを開始    


        if (isset($_POST['Selected_AI_Character'])) {                            // 更新の対象データが選択されたか?
            //更新の対象データが選択されたときの処理
            
            $AI_User = (int) $_POST['Selected_AI_Character'];                    // $_POSTの値を数値に変換して$AI_Userに代入

            $this->pdo_model->db_connect();                                      // データベースに接続

            $this->update_data = $this->pdo_model->select_AI_User($AI_User);     // 選択されたUserデータを取得し、その返り値を配列に代入

            $this->session_model->set_update_data($this->update_data);           // Userテーブルデータをセッションに保管

            header('Location: UserTestUpdateView.php');                          // 「Userデータの更新」ページへリダイレクト 

        } elseif (isset($_POST['back']) && $_POST['back'] == "≪前ページ") {
            //「前ページ」ボタンが選択されたときの処理

            $this->paging_info = $this->session_model->get_paging_info();        // 現在のページング情報を得る

            $this->paging_info = $this->paging_model->back($this->paging_info);  // 前ページのページング情報を算出

            $this->session_model->set_paging_info($this->paging_info);           // 前ページングのページング情報をセッションに保管

            header('Location: UserTestUpdateDataView.php');                      // 「userテーブルの更新データの選択」ページへリダイレクト

        } elseif (isset($_POST['next']) && $_POST['next'] == "次ページ≫") {
            //「次ページ」ボタンが選択されたときの処理
            
            $this->paging_info = $this->session_model->get_paging_info();        // 現在のページング情報を得る

            $this->paging_info = $this->paging_model->next($this->paging_info);  // 次ページのページング情報を算出

            $this->session_model->set_paging_info($this->paging_info);           // 次ページングのページング情報をセッションに保管
            
            header('Location: UserTestUpdateDataView.php');                      // 「userテーブルの更新データの選択」ページへリダイレクト

        } elseif (isset($_POST['return']) && $_POST['return'] == "戻る") {
            //「戻る」ボタンが選択されたときの処理

            header('Location: UserTestSCondView.html');                          // 「userデータの検索」ページへリダイレクト
        }
    }
}

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

戻る

UserTestUpdateView.php
<?php
session_name('PHPSESSION_MEMBER'); // セッション名セット
session_start(); // セッション開始

// セッションからUserテーブルデータを取り出します
$table_data = isset($_SESSION['ses_update_data']) ? $_SESSION['ses_update_data'] : [];

$ai_user = isset($table_data[0]['AI_User']) ? $table_data[0]['AI_User'] : '';
$user_id = isset($table_data[0]['UID']) ? $table_data[0]['UID'] : '';
$password = isset($table_data[0]['password']) ? $table_data[0]['password'] : '';
$name = isset($table_data[0]['name']) ? $table_data[0]['name'] : '';

?>
<!doctype html>
<html>
<head>
    <meta charset="utf-8">
    <link rel="stylesheet" type="text/css" href="style_Create.css">
    <title>userデータの更新</title>
</head>
<body>
<div class="main">
    <h1>userデータの更新</h1>
    <form id="form" name="form" method="post" action="UserTestUpdateController.php" onsubmit="return InputCheck(event)">
        <table class="maxwidth">
            <tr>
                <td class="label">User ID</td>
                <td>
                    <input type="text" name="userid" size="20" value="<?php echo htmlspecialchars($user_id, ENT_QUOTES, 'UTF-8'); ?>">
                    <span id="UserIDErrorMessage" class="error" style="display: none;"></span>
                </td>
            </tr>
            <tr><td colspan="3"><p></p></td></tr>
            <tr><td colspan="3"><p></p></td></tr>
            <tr>
                <td class="label">パスワード</td>
                <td>
                    <input type="text" name="password" size="20" value="<?php echo htmlspecialchars($password, ENT_QUOTES, 'UTF-8'); ?>">
                    <span id="PasswordErrorMessage" class="error" style="display: none;"></span>
                </td>
            </tr>
            <tr><td colspan="3"><p></p></td></tr>
            <tr><td colspan="3"><p></p></td></tr>
            <tr>
                <td class="label">名   前</td>
                <td>
                    <input type="text" name="name" size="40" value="<?php echo htmlspecialchars($name, ENT_QUOTES, 'UTF-8'); ?>">
                    <span id="NameErrorMessage" class="error" style="display: none;"></span>
                </td>
            </tr>
        </table>
        <p></p>
        <table id="button_erea">
            <tr>
                <td style="text-align: center"><input type="submit" name="update" value="登 録"></td>
                <td style="text-align: center"><input type="submit" name="cancel" value="取消し"></td>
                <td style="text-align: center"><input type="submit" name="back" value="戻 る"></td>
            </tr>
        </table>
        <!--AI_User(主キー)は編集データではないため、type="hidden"でPOSTリクエストを送出します -->
        <input type="hidden" name="selected_ai" value="<?= htmlspecialchars($ai_user, ENT_QUOTES, 'UTF-8') ?>">
    </form>
</div>
</body>

<!-- 入力チェックのスクリプト -->
<script type="text/javascript">
function InputCheck(event) {
    // 送信されたボタンの名前を取得
    var submitButton = event.submitter.name;

    // 「update」ボタンでない場合は桁数チェックをスキップ
    if (submitButton !== "update") {
        return true;
    }

    // 入力フィールドを取得
    var userId = document.forms["form"]["userid"].value;
    var password = document.forms["form"]["password"].value;
    var name = document.forms["form"]["name"].value;

    // エラーメッセージ表示領域を取得
    var userIdError = document.getElementById("UserIDErrorMessage");
    var passwordError = document.getElementById("PasswordErrorMessage");
    var nameError = document.getElementById("NameErrorMessage");

    // エラーメッセージをリセット
    userIdError.style.display = "none";
    passwordError.style.display = "none";
    nameError.style.display = "none";

    // User IDの入力チェック
    var isValid = true;
    if (userId.length < 5 || userId.length > 20) {
        userIdError.innerText = "User IDは5桁以上20桁以内でなければなりません";
        userIdError.style.display = "inline";
        isValid = false;
    }
    // パスワードの入力チェック
    if (password.length < 8 || password.length > 16) {
        passwordError.innerText = "パスワードは8桁以上16桁以内でなければなりません";
        passwordError.style.display = "inline";
        isValid = false;
    }
    // 名前の入力チェック
    if (name.length < 1 || name.length > 40) {
        nameError.innerText = "名前は1桁以上40桁以内でなければなりません";
        nameError.style.display = "inline";
        isValid = false;
    }

    // フォームを送信しない
    return isValid;
}
</script>
</html>

戻る

UserTestUpdateController.php
<?php
/**
 * Description of UserTestUpdateController
 * Userデータの更新ページに対するコントローラーの役割
 */
class UserTestUpdateController{
    // クラス変数を定義します
    private $table_data = [];                              // Userテーブルデータ
    private $update_user_data = [];                        // 更新する値を保持する連想配列
    private $session_model;                                // SessionModelのインスタンスを保持
    private $pdo_model;                                    // PDOModelのインスタンスを保持

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

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

    /******************************************************
     * 当メソッドはUserTestUpdateView.phpから呼ばれます
     * [登録]、[取消し]、[戻る]ボタンが選択された時の
     * POSTリクエストの処理を行います
     *****************************************************/
    public function handleRequest() {
        
        if (isset($_POST['update']) && $_POST['update'] == "登 録") {
            // 「登録」ボタンのPOSTリクエストの処理
            
            // 画面入力の値を連想配列にセット
            $update_user_data = array(
                'AI_User' => htmlspecialchars($_POST['selected_ai'], ENT_QUOTES),
                '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->update_user($update_user_data);        // 画面入力の値をUserテーブルにUpdate
            
            $this->session_model->sessionstart();                    // セッションを開始    

            $this->table_data = $this->session_model->get_user_table();    // セッションに保管しているUserテーブルデータを取得

            // $table_data内のAI_User値が一致するデータを検索し、値を更新
            foreach ($this->table_data as &$user_data) {
                if ($user_data['AI_User'] == $update_user_data['AI_User']) {
                    $user_data['UID'] = $update_user_data['UID'];
                    $user_data['password'] = $update_user_data['password'];
                    $user_data['name'] = $update_user_data['name'];
                    break; // 該当データが見つかったらループを抜ける
                }
            }
            
            $this->table_data = $this->session_model->set_user_table($this->table_data);    // Userテーブルデータをセッションに保管

            header('Location: UserTestUpdateDataView.php');          // userテーブルの更新データの選択ページへリダイレクト

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

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

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

戻る

SessionModel.php
<?php
/**
 * Description of SessionModel
 * セッションに係る次の処理を受け持つクラスです
 *
 * セッションの開始処理とセッションへのデータ保管や取出し
 * を行います
 *
 */
class SessionModel {

    //クラス変数を定義します
    protected $sessname = 'PHPSESSION_MEMBER';             // セッション名を「PHPSESSION_MEMBER」にします
    protected $table_data = [];                            // userテーブルデータを保持する連想配列変数
    protected $update_data = [];                           // 更新するuserデータを保持する連想配列変数    
    protected $paging_info  = [];                          // ページング情報を保持する連想配列変数
    protected $data_operation = '';                        // データ操作('C':Create,'R':Read,'U':Update,'D':Delete)を保持する変数

    //*****************************************************
    // コンストラクター
    //*****************************************************
    public function __construct() {
    }

    //*****************************************************
    // セッションの開始処理をします
    //*****************************************************
    public function sessionstart() {

        if (session_status() != PHP_SESSION_ACTIVE) {
        
            // セッションが非アクティブならセッションを開始します
            if ($this->sessname != "") {
                //セッション名を確実に「PHPSESSION_MEMBE」するためのコードです
                session_name($this->sessname);
            }
            session_start();  // セッション開始
        }
        
        return;
    }

    //*****************************************************
    // userテーブルデータをセッションに保管します
    //*****************************************************
    public function set_user_table(array $table_data) {
        
        $this->table_data = $table_data;
        
        // セッション変数(ses_table_data)を削除します
        unset($_SESSION['ses_table_data']);
        
        // userテーブルデータをセッション変数(ses_table_data)に保管します
        $_SESSION['ses_table_data'] = $this->table_data;
        
        return;
    }
    
    //*****************************************************
    // Userテーブルデータをセッションから取り出します
    //*****************************************************
    public function get_user_table() {   
    
        // セッションからuserテーブルデータを取り出します
        $this->table_data = isset($_SESSION['ses_table_data']) ? $_SESSION['ses_table_data'] : [];
    
        // 取り出したuserテーブルデータを返します
        return $this->table_data;
    }

    //*****************************************************
    // 更新するuserデータをセッションに保管します
    //*****************************************************
    public function set_update_data(array $update_data) {
        
        $this->update_data = $update_data;
        
        // セッション変数(ses_update_data)を削除します
        unset($_SESSION['ses_update_data']);
        
        // 更新するuserデータをセッション変数(ses_update_data)に保管します
        $_SESSION['ses_update_data'] = $this->update_data;
        
        return;
    }
    
    //*****************************************************
    // 更新するuserデータをセッションから取り出します
    //*****************************************************
    public function get_update_data() {   
    
        // セッションから更新するuserデータを取り出します
        $this->update_data = isset($_SESSION['ses_update_data']) ? $_SESSION['ses_update_data'] : [];
    
        // 取り出した更新するuserデータを返します
        return $this->update_data;
    }


    //*****************************************************
    // ページング情報をセッションに保管します
    //*****************************************************
    public function set_paging_info(array $paging_info) {
    
        $this->paging_info = $paging_info;
        
        // セッション変数(ses_paging_info)を削除します        
        unset($_SESSION['ses_paging_info']);
        
        // ページング情報をセッション変数(ses_paging_info)に保管します
        $_SESSION['ses_paging_info'] = $this->paging_info;
        
        return;
    }
    
    //*****************************************************
    // ページング情報をセッションから取り出します
    //*****************************************************
    public function get_paging_info() {   
    
        // セッションからページング情報を取り出します
        $this->paging_info = isset($_SESSION['ses_paging_info']) ? $_SESSION['ses_paging_info'] : [];
    
        // 取り出したページング情報を返します
        return $this->paging_info;
    }
 
     //*****************************************************
    // データ操作(C,R,U,Dのどれか)をセッションに保管します
    //*****************************************************
    public function set_data_operation($data_operation) {
        
        $this->data_operation = $data_operation;
        
        // セッション変数(ses_data_operation)を削除します
        unset($_SESSION['ses_data_operation']);
        
        // データ操作(C,R,U,Dのどれか)をセッション変数(ses_data_operation)に保管します
        $_SESSION['ses_data_operation'] = $this->data_operation;
        
        return;
    }
    
    //*****************************************************
    // Userテーブルデータをセッションから取り出します
    //*****************************************************
    public function get_data_operation() {   
    
        // セッションからデータ操作(C,R,U,Dのどれか)を取り出します
        $this->data_operation = isset($_SESSION['ses_data_operation']) ? $_SESSION['ses_data_operation'] : '';
    
        // 取り出したデータ操作(C,R,U,Dのどれか)を返します
        return $this->data_operation;
    }
    
}
?>

戻る

PDOModel.php
<?php
/**
 * Description of PDOModel
 * データベースに係る処理を受け持つクラスです
 */
class PDOModel {

    //クラス変数を定義します
    protected $pdo;                                        //PDOライブラリアプリのインスタンスを保持
    protected $host;                                       //ホスト情報
    protected $dbname;                                     //データベース名
    protected $dbusr;                                      //データベース接続ユーザー名
    protected $dbpass;                                     //データベース接続パスワード
    
    protected $table_data = [];                            //userテーブルデータを保持する配列


    //*****************************************************
    // コンストラクター
    //*****************************************************
    public function __construct() {
    
        // データベース接続情報を変数にセットします
        $this->host = 'mysql1.php.xdomain.ne.jp';
        $this->dbname = 'cherrystaff_receipt';
        $this->dbusr = 'cherrystaff_kr';
        $this->dbpass = 'th8301048';
    }

    //*****************************************************
    // DB接続処理
    //*****************************************************
    public function db_connect() {
        // DB接続処理
        try {
            $this->pdo = new PDO("mysql:host={$this->host};dbname={$this->dbname};charset=utf8", $this->dbusr, $this->dbpass);
            $this->pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
            $this->pdo->setAttribute(PDO::ATTR_EMULATE_PREPARES, false);
        } catch(PDOException $Exception) {
            die('DB Connect Error: ' . $Exception->getMessage());
        }
        
        return;
    }

    //*****************************************************
    // userテーブルへselect文発行
    // 下記select文はuserテーブルからAI_Userの値が0~200のデータを取り出します
    //*****************************************************
    public function select_usertable() {
    
        // select文を生成して実行します
        try {
            $sql= "SELECT * FROM user WHERE AI_User BETWEEN :AIFrom AND :AITo";
            $stmh = $this->pdo->prepare($sql);
            $stmh->bindValue(':AIFrom', 0, PDO::PARAM_INT);
            $stmh->bindValue(':AITo', 200, PDO::PARAM_INT);
            
            $stmh->execute();                              //select文を実行します

            // select文で抽出したデータを1行ずつ取出して$table_data[]にセットします
            while($row = $stmh->fetch(PDO::FETCH_ASSOC)) {
                $this->table_data[] = $row;
            }
        } catch (PDOException $Exception) {
            die('DB select Error: ' . $Exception->getMessage());
        }
        
        // テーブルデータの配列($table_data[])を返します
        return $this->table_data;
    }

    //*****************************************************
    // userテーブルに対してAI_Userが一致するselect文発行
    //*****************************************************
    public function select_AI_User($AI_User) {
    
        // select文を生成して実行します
        try {
            $sql= "SELECT * FROM user WHERE AI_User = :AI";
            $stmh = $this->pdo->prepare($sql);
            $stmh->bindValue(':AI', $AI_User, PDO::PARAM_INT);

            $stmh->execute();                              //select文を実行します

            // select文で抽出したデータを1行ずつ取出して$table_data[]にセットします
            // AI_Userは主キーなのでデータ件数は原則1件になる
            while($row = $stmh->fetch(PDO::FETCH_ASSOC)) {
                $this->table_data[] = $row;
            }
        } catch (PDOException $Exception) {
            die('DB select Error: ' . $Exception->getMessage());
        }
        
        // テーブルデータの配列($table_data[])を返します
        return $this->table_data;
    }

    
    //*****************************************************
    // 全件検索
    //*****************************************************
    public function select_all() {
    
        // select文を生成して実行します
        try {
            $sql= "SELECT * FROM user";
            $stmh = $this->pdo->prepare($sql);
            
            $stmh->execute();                              //select文を実行します

            // select文で抽出したデータを1行ずつ取出して$table_data[]にセットします
            while($row = $stmh->fetch(PDO::FETCH_ASSOC)) {
                $this->table_data[] = $row;
            }
        } catch (PDOException $Exception) {
            die('DB select Error: ' . $Exception->getMessage());
        }
        
        // テーブルデータの配列($table_data[])を返します
        return $this->table_data;
    }   
    
    //*****************************************************
    // 一致検索
    //*****************************************************
    public function select_matching($name, $matching) {

        // パターンマッチングの設定
        switch ($matching) {
            case 'ExactMatch':                             // 完全一致
                $pattern = $name;
                break;
            case 'PrefixMatch':                            // 前方一致
                $pattern = "%" . $name;
                break;
            case 'SuffixMatch':                            // 後方一致
                $pattern = $name . "%";
                break;
            case 'SubstringMatch':                         // 前方後方一致
                $pattern = "%" . $name . "%";
                break;
            default:
                $pattern = $name;
        }

        // select文を生成して実行します
        try {
            if ($matching == 'ExactMatch') {
                $sql = "SELECT * FROM user WHERE name = :name";
            } else {
                $sql = "SELECT * FROM user WHERE name LIKE :name";
            }
            $stmh = $this->pdo->prepare($sql);

            // バインドパラメータを設定
            $stmh->bindValue(':name', $pattern, PDO::PARAM_STR);

            // SQL文を実行
            $stmh->execute();

            // select文で抽出したデータを1行ずつ取出して$table_data[]にセット
            while ($row = $stmh->fetch(PDO::FETCH_ASSOC)) {
                $this->table_data[] = $row;
            }
        } catch (PDOException $Exception) {
            die('DB select Error: ' . $Exception->getMessage());
        }

        // テーブルデータの配列($table_data[])を返します
        return $this->table_data;
    }

    //*****************************************************
    // Userデータインサート処理
    //*****************************************************
    public function insert_user($insert_user_data){
        try {
            $this->pdo->beginTransaction(); // トランザクション開始

            $sql = "INSERT INTO user
                    (UID, password, name)
                    VALUES
                    (:UID, :password, :name)";

            $stmh = $this->pdo->prepare($sql); // SQL文を解析し、準備ステートメントオブジェクト(PDOStatement)を生成

            // インサートする値を紐づけ
            $stmh->bindValue(':UID', $insert_user_data['UID'], PDO::PARAM_STR);
            $stmh->bindValue(':password', $insert_user_data['password'], PDO::PARAM_STR);
            $stmh->bindValue(':name', $insert_user_data['name'], PDO::PARAM_STR);

            $stmh->execute(); // insert文を実行
            $this->pdo->commit(); // コミット
            return true;
        } catch (PDOException $Exception) {
            $this->pdo->rollBack();
            print "エラー:" . $Exception->getMessage();
            return false;
        }
    }

    //*****************************************************
    // Userデータアップデート処理
    //*****************************************************
    public function update_user($update_user_data) {
        try {
            $this->pdo->beginTransaction(); // トランザクション開始

            $sql = "UPDATE user
                    SET UID = :UID, password = :password, name = :name
                    WHERE AI_User = :AI_User";

            $stmh = $this->pdo->prepare($sql); // SQL文を解析し、準備ステートメントオブジェクト(PDOStatement)を生成

            // Updateする値を紐づけ
            $stmh->bindValue(':AI_User', (int)$update_user_data['AI_User'], PDO::PARAM_INT);
            $stmh->bindValue(':UID', $update_user_data['UID'], PDO::PARAM_STR);
            $stmh->bindValue(':password', $update_user_data['password'], PDO::PARAM_STR);
            $stmh->bindValue(':name', $update_user_data['name'], PDO::PARAM_STR);

            $stmh->execute(); // update文を実行
            $this->pdo->commit(); // コミット
            return true;
        } catch (PDOException $Exception) {
            $this->pdo->rollBack();
            print "エラー:" . $Exception->getMessage();
            return false;
        }
    }    

}

?>

戻る

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