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

プログラミング

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

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

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

  1. UserTestController.php
    「UserデータのCRUD」ページ(UserTestMenuView.html)の表示と当ページから送出されたリクエストの処理を行うコントローラークラスです。
    run()メソッドでは「UserデータのCRUD」ページ(UserTestMenuView.html)へリダイレクトします。
    「UserデータのCRUD」ページから送出されたPOSTリクエストは、handleRequest()メソッドで処理します。
    当メソッドにおいてPOSTリクエストが「削除」と判定された場合、セッション変数ses_data_operationに”D”をセットして保管し、「Userデータの検索」ページ(UserTestSCondView.html)へリダイレクトします。
    コード掲載はこちら
  2. UserTestSCondController.php
    「userデータの検索」ページ(UserTestSCondView.html)から送出されたリクエストの処理を行うコントローラークラスです。
    データ操作が”D”(Delete)の時の処理について解説します。
    「userテーブルの削除データの選択」ページの削除選択のCheckBoxに対応するキー:checked、値:0を$table_data配列要素に追加します。
    $table_data配列は、Userテーブルデータを保持する配列で、下記のようなキー:値になっています。

    $table_data = [
        [‘AI_User’ => 1, ‘UID’ => ‘test01’, ‘password’ => ‘test_001’, ‘name’ => ‘北海 一郎’],
        [‘AI_User’ => 2, ‘UID’ => ‘test02’, ‘password’ => ‘test_002’, ‘name’ => ‘青森 二郎’],
        // 他のデータが続く…
    ];


    この要素に対してキー:checked、値:0を追加するために下記コードを実行しています。

    // $table_dataの要素にキー;checked 値:0を追加 (値:0は削除しない 値:1は削除)
    foreach ($this->table_data as &$item) {
    $item['checked'] = 0;
    }
    unset($item); // 参照を解除

    実行結果は次のように全要素に対してキー:checked、値:0が追加されます。

    $table_data = [
        [‘AI_User’ => 1, ‘UID’ => ‘test01’, ‘password’ => ‘test_001’, ‘name’ => ‘北海 一郎’,’checked’=>0],
        [‘AI_User’ => 2, ‘UID’ => ‘test02’, ‘password’ => ‘test_002’, ‘name’ => ‘青森 二郎’,’checked’=>0],
        // 他のデータが続く…
    ];


    「userテーブルの削除データの選択」ページ(3..UserTestDeleteDataView.php)へリダイレクトします。
    コード掲載はこちら
  3. UserTestDeleteDataView.php
    「userテーブルの削除データの選択」ページで、当ページで削除するデータのチェックボックスをオンにします。
    [削除]ボタンがクリックされると、チェックボックスの値(Userテーブル主キーAI_Userの値)がPOSTリクエストで送出されます。
<!-- 削除するデータのチェックボックスをオンにします 複数選択可 -->
<td class="label2" style="text-align: center;">
    <!-- $table_data[$i]['checked'] == 1 のときチェックボックスをオンにします-->
    <input type="checkbox" name="Selected_Delete_AI[]" value="<?= htmlspecialchars($table_data[$i]['AI_User'], ENT_QUOTES, 'UTF-8') ?>" <?php if ($table_data[$i]['checked'] == 1) echo 'checked'; ?>>
</td>

上記のコードの97行目の<input type=”checkbox”~が下記画面の選択チェックボックスに対応しています。

コード掲載はこちら

  1. UserTestDeleteDataController.php
    「userテーブルの削除データの選択」ページ(UserTestDeleteDataView.php)から送出されたリクエストの処理を行うコントローラークラスです。
    [削除]ボタンがクリックされたときの処理と[次ページ][前ページ]がクリックされたときの処理について解説します。

    [削除]ボタン時の処理
    削除選択されたデータは、POSTリクエストでUserテーブルの主キーを受取ります。

    <input type=”checkbox” name=”Selected_Delete_AI[]” value=”<?= htmlspecialchars($table_data[$i][‘AI_User’], ENT_QUOTES, ‘UTF-8’) ?>” <?php if ($table_data[$i][‘checked’] == 1) echo ‘checked’; ?>>

    受取った削除選択された情報に基づいて、$table_data配列のcheckedの値を設定し、セッションに保管します。
    この処理はクラス内関数のtable_data_selected_flag()で行っています。

    続いて、主キー(AI_User)をPDOModelのdelete_user関数に引数として渡して、テーブルから削除します。

    Userテーブルからデータが削除されたので、テーブルデータを保持している$table_data配列からも要素を削除します。
    下記が配列から要素を削除するコードです。

    // $table_data 配列をフィルタリングし、checked が 1 ではない要素のみを残します。
    // これにより、checked が 1 である要素はすべて配列から削除されます。
    $this->table_data = array_filter($this->table_data, function($element) {
    return $element['checked'] !== 1;
    });
    $this->table_data = array_values($this->table_data); // array_valuesでインデックスを再構築する


    $table_data配列の要素数が変更になったため、セッションに保管し直し、ページング情報についても再算出してセッションに保管します。

    [次ページ][前ページ]ボタン時の処理
    [次ページ]または[前ページ]ボタンがクリックされると、POSTリクエストでUserテーブルの主キーを受取ります。

    <input type=”checkbox” name=”Selected_Delete_AI[]” value=”<?= htmlspecialchars($table_data[$i][‘AI_User’], ENT_QUOTES, ‘UTF-8’) ?>” <?php if ($table_data[$i][‘checked’] == 1) echo ‘checked’; ?>>

    現在のページの削除選択された情報に基づいて、$table_data配列のcheckedの値を設定し、セッションに保管します。
    この処理はクラス内関数のtable_data_selected_flag()で行っています。

    以降の次ページ、前ページのページングの算出は、Update機能、Read機能と同じです。
    コード掲載はこちら
  2. PDOModel.php
    delete_user($AI_User)関数でUserテーブルの主キーを引数として受け取って、主キーのデータを削除します。
    コード掲載はこちら

コードの掲載

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データをselectし、
     * データ操作(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 == READ){
                // データ操作がREADの場合参照

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

            }elseif($this->data_operation == UPDATE){
                // データ操作がUPDATEの場合

                header('Location: UserTestUpdateDataView.php');                  // 「userテーブルの更新データの選択」ページへリダイレクト
            
            }elseif($this->data_operation == DELETE){
                // データ操作がDELETEEの場合
                
                // $table_dataの要素にキー;checked 値:0を追加  (値:0は削除しない  値:1は削除)
                foreach ($this->table_data as &$item) {
                    $item['checked'] = 0;                                         
                }
                unset($item); // 参照を解除
                
                $this->session_model->set_user_table($this->table_data);         // Userテーブルデータをセッションに保管
                
                header('Location: UserTestDeleteDataView.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();
?>

戻る

UserTestDeleteDataView.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 Delete data</title>
</head>

<body>

<div class="main">

<h1>userテーブルの削除データの選択</h1>

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

<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>
                    <!-- 削除するデータのチェックボックスをオンにします 複数選択可 -->
                    <td class="label2" style="text-align: center;">
                        <!-- $table_data[$i]['checked'] == 1 のときチェックボックスをオンにします-->
                        <input type="checkbox" name="Selected_Delete_AI[]" value="<?= htmlspecialchars($table_data[$i]['AI_User'], ENT_QUOTES, 'UTF-8') ?>" <?php if ($table_data[$i]['checked'] == 1) echo 'checked'; ?>>
                    </td>
                </tr>
    <?php
            }
        } else {
            echo "<tr><td colspan='5' class='label2' style='text-align: center;'>表示するデータがありません。</td></tr>";
        }
    ?>

</table>

<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="text-align: center"><input type="submit" name="delete" value="削 除"></td>
        <td style="width:33%; text-align: center;"></td>
        <td style="text-align: center"><input type="submit" name="return" value="戻 る"></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>

戻る

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

    //コンストラクター
    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テーブルの削除データの選択」ページ
     * UserSTestDeleteDataView.phpから呼ばれます
     * [削除]、[戻る]、「前ページ]、[次ページ]ボタンが
     * 選択された時のPOSTリクエストの処理を行います
     *****************************************************/
    public function handleRequest() {

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


        if (isset($_POST['delete'])  && $_POST['delete'] == "削 除") {
            // [削除]ボタンが選択されたときの処理
            
            // ses_table_dataのキーcheckedに
            // 現在ページの削除選択checkboxの値をセット(オン→1、オフ→0)し、セクションに保管します。
            $this->table_data_selected_flag(); 
            
            $this->table_data  = isset($_SESSION['ses_table_data']) ? $_SESSION['ses_table_data'] : [];  // テーブルデータをセッションから取り出す
            
            $this->pdo_model->db_connect();                                      // データベースに接続します
            

            // 削除選択されたデータをUserテーブルから削除する処理
            foreach ($this->table_data as $user) {
            
                if($user['checked'] == 1 ){
                    // 削除するデータの場合
                    
                    $this->pdo_model->delete_user($user['AI_User']);             // userテーブルから削除 削除キーAI_Userを引数で渡す
                
                }
            
            }
            
            // $table_data 配列をフィルタリングし、checked が 1 ではない要素のみを残します。
            // これにより、checked が 1 である要素はすべて配列から削除されます。
            $this->table_data = array_filter($this->table_data, function($element) {
                return $element['checked'] !== 1;
            });

            $this->table_data = array_values($this->table_data);                 // array_valuesでインデックスを再構築する
            
            $this->session_model->set_user_table($this->table_data);             // Userテーブルデータをセッションに保管
            
            $this->paging_info = $this->paging_model->init($this->table_data);   // 再構築した$table_dataのページング情報を算出
         
            $this->session_model->set_paging_info($this->paging_info);           // ページングデータをセッションに保管

            header('Location: UserTestDeleteDataView.php');                      // 「userテーブルの削除データの選択」ページへリダイレクト
            exit(); // スクリプトを終了

        } elseif (isset($_POST['back']) && $_POST['back'] == "≪前ページ") {
            //「前ページ」ボタンが選択されたときの処理
            
            // ses_table_dataのキーcheckedに
            // 現在ページの削除選択checkboxの値をセット(オン→1、オフ→0)し、セクションに保管します。
            $this->table_data_selected_flag(); 

            $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: UserTestDeleteDataView.php');                      // 「userテーブルの削除データの選択」ページへリダイレクト
            exit(); // スクリプトを終了

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

            // ses_table_dataのキーcheckedに
            // 現在ページの削除選択checkboxの値をセット(オン→1、オフ→0)し、セクションに保管します。
            $this->table_data_selected_flag();

            $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: UserTestDeleteDataView.php');                      // 「userテーブルの削除データの選択」ページへリダイレクト
            exit(); // スクリプトを終了

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

            header('Location: UserTestSCondView.html');                          // 「userデータの検索」ページへリダイレクト
            exit(); // スクリプトを終了
        }
    }
 
    /******************************************************
     * 当メソッドは「userテーブルの削除データの選択」ページ
     * において、[次ページ][前ページ]ボタンが押されて
     * 画面が遷移する前に、現在のページのcheckboxの選択状態を
     * セッション変数ses_table_dataに保管する処理です。
     * checked に 0 : 未選択 または  1:選択  をセットします。
     *****************************************************/
    private function table_data_selected_flag(){

        //「userテーブルの削除データの選択」ページで選択されたCheckboxの値(AI_User)を得ます
        $selected_data = isset($_POST['Selected_Delete_AI']) ? $_POST['Selected_Delete_AI'] : [];

        // テーブルデータをセッションから取り出す
        $this->table_data  = isset($_SESSION['ses_table_data']) ? $_SESSION['ses_table_data'] : [];
        
        // ページング情報をセッションから取り出す  
        $this->paging_info = isset($_SESSION['ses_paging_info']) ? $_SESSION['ses_paging_info'] : [];

        if (!empty($selected_data)) {
            //選択されたcheckboxがある場合の処理(1件以上選択している)

            // $table_data配列内の選択されたデータを検索し、選択されたデータに1をセットし、未選択のデータに0をセット
            for ($i = $this->paging_info['first_record']; $i <= $this->paging_info['last_record']; $i++) {
                
                // 有効なインデックスを確認し、対応するデータが存在する場合に処理を実行
                if (isset($this->table_data[$i])) {
                    
                    $this->table_data[$i]['checked'] = 0;                        // 現ページのcheckedの値を選択なしに初期化

                    // 選択されたデータが$table_data配列にあるか、AI_Userの値で突き合わせ、
                    // 一致するデータがあったら、checkedに1をセットする。checked:1は削除するデータです。
                    foreach ($selected_data as $selected_AI) {

                        if ($this->table_data[$i]['AI_User'] == $selected_AI) {
                            // $table_data配列データが選択された場合
                            $this->table_data[$i]['checked'] = 1;                // 1:選択をセット
                            break;
                         }
                     
                     }
                         
                }
            }
        }else {
            //選択されたcheckboxがない場合の処理(1件も選択していない)
            for ($i = $this->paging_info['first_record']; $i <= $this->paging_info['last_record']; $i++) {
                $this->table_data[$i]['checked'] = 0;                            // 0:未選択をセット
            }
        }
        
        $this->session_model->set_user_table($this->table_data);                 // 更新したテーブルデータをセッションに保管

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

戻る

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;
        }
    }    

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

            $sql = "DELETE FROM user
                    WHERE AI_User = :AI_User";

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

            // Updateする値を紐づけ
            $stmh->bindValue(':AI_User', (int)$AI_User, PDO::PARAM_INT);

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

?>

戻る

Userテーブルを題材にしてCRUDの各機能のモデルケースを作成しました。
Web版レシート管理でも、ユーザー、科目マスター、支払区分マスター、税区分マスターなどのテーブルで、このモデルを適用します。

その他に決めておきたいことは、ユーザーのパスワードの暗号化、ログイン管理、テーブル形式でのデータ修正機能、テーブルデータをCSV形式で出力する機能、コードを入力するとコード名を表示する機能などです。

このように必要な機能を列挙してみると、実装方法が決まっていない機能が残っています。

Web版レシート管理プログラムの作成に取り掛かるのはもう少し先になります。

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