PHP:『パーフェクトPHP』のフレームワークでシステム開発する ~ 『ケーキ管理』その1 ~

PHP

『ケーキ管理』というケーキの販売管理システムを開発していく

友人から、「家族がインターネット通販でケーキの販売をしたいと言っている。申込みのホームページとかさ、必要だよね。なんとかならない?」と話があった。私的な案件ですが、ちょうどいいボリュームの開発なので記事にしてみたいと思います。

この記事のプログラムで完成するもの

このページの内容で、完成したものはこちらになります。
実際にデータの新規登録・更新・削除ができちゃうと大変なことになってしまいますので、その処理だけ削除させていただいております。ごめんなさい。

準備

必要なもの

PHPのプログラムはサーバで実行されるプログラムなので、プログラムを実行するためのサーバ。
サーバを用意するのはハードルが高いです。ここのサイトのようにレンタルサーバが用意しやすくオススメです。
ご契約のレンタルサーバのサービスの中に、PHPと、MySQLなどのデータベースが入っていないと不可能ですのでご注意ください。

それと、『パーフェクトPHP』の本。

mini-blogの作成

『パーフェクトPHP』の書籍で

7章 フレームワークによる効率的な開発
8章 ミニブログアプリケーション開発

上記2つの章を読み進めながら、ご自身のパソコンで実際にファイルを作成していただくか、出版元の技術評論者Webサイトからダウンロードします。

mini-blogの前処理

作成するシステム名は、『ケーキ管理』ですので、このシステムのフォルダ名をmini-blogからcake-managerと変更します。

cake-managerフォルダの中の
create_table.sql

cake-manager/controllersフォルダの中の
AccountController.php
StatusController.php

cake-manager/modelsフォルダの中
FollowingRepository.php
StatusRepository.php

cake-manager/viewsフォルダの中の
accountフォルダとその中身全部
statusフォルダとその中身全部
errors.php

cake-manager/webフォルダの中の
cssフォルダとその中身全部

上記のファイルを削除しておきます。

ユーザ管理の機能を作成

このシステムではケーキを注文された、大切なお客様の個人情報が管理されるため、決められた担当者のみがシステムを使用できるようにする必要があります。

まず、担当者を管理する機能を作っていきます。

サーバのMySQLにcake_managerという名前のデータベースを作成

レンタルサーバであれば、そのサーバの管理画面から作成します。
レンタルサーバの場合、(レンタルサーバアカウント)_cake_managerという名前のデータベースの作成になるのではないでしょうか。

cake_managerデータベースにuserという名前のテーブルを作成

phpMyAdminの管理画面からcake_managerデータベースを選択し、SQLを発行してテーブルを作成します。

CREATE TABLE user (
    id INTEGER AUTO_INCREMENT,
    user_name VARCHAR(20) NOT NULL,
    password VARCHAR(20) NOT NULL,
    is_manager TINYINT(1) NOT NULL,
    insert_date DATETIME NOT NULL,
    update_date DATETIME NOT NULL,
    delete_date DATETIME,
    PRIMARY KEY(id)
) ENGINE = INNODB;

CakeManagerApplication.phpの作成

cake-managerフォルダの中のMiniBlogApplication.phpを、CakeManagerApplication.phpに名前を変更します。

そして、テキストエディタでファイルを開きプログラムを書き換えます。

<?php

/**
 * CakeManagerApplication.
 *
 * @author Katsuhiro Ogawa <fivestar@nequal.jp>
 */
class CakeManagerApplication extends Application
{
    protected $login_action = array();

    public function getRootDir()
    {
        return dirname(__FILE__);
    }

    protected function registerRoutes()
    {
        return array(
            '/user/insert'
                => array('controller' => 'User', 'action' => 'insert',),
            '/user/insert-register'
                => array('controller' => 'User', 'action' => 'insertRegister',),
            '/user/update'
                => array('controller' => 'User', 'action' => 'update',),
            '/user/update-register'
                => array('controller' => 'User', 'action' => 'updateRegister',),
            '/user/delete'
                => array('controller' => 'User', 'action' => 'delete',),
            '/user/delete-register'
                => array('controller' => 'User', 'action' => 'deleteRegister',),
        );
    }

    protected function configure()
    {
        $this->db_manager->connect('master', array(
            'dsn'      => 'mysql:dbname=cake_manager;host=********',
            'user'     => '********',
            'password' => '********',
        ));
    }
}

********の部分はご自身の環境に合わせてください。

index.phpおよびindex_dev.phpの編集

cake-manager/webフォルダの中のindex.phpを書き換え。

<?php

require '../bootstrap.php';
require '../CakeManagerApplication.php';

$app = new CakeManagerApplication(false);
$app->run();

cake-manager/webフォルダの中のindex_dev.phpを書き換え。

<?php

require '../bootstrap.php';
require '../CakeManagerApplication.php';

$app = new CakeManagerApplication(true);
$app->run();

UserController.phpの作成

cake-manager/controllersフォルダの中に、UserController.phpと名前をつけ、新規でファイルを作成します。
ファイルの中に下記のコードを記入し、文字コードUTF-8で保存します。

<?php

/**
 * UserController.
 *
 * @author haichoru(ハイチョル)
 */
class UserController extends Controller
{
    protected $auth_actions = array();

    private const INSERT_TOKEN = "********";

    private $user_name = "";
    private $password = "";
    private $is_manager = "0";
    private $user_name_error = "";
    private $password_error = "";

    private function getInsertSqlData()
    {
        return array(
            'user_name'  => $this->user_name,
            'password'   => $this->password,
            'is_manager' => $this->is_manager,
        );
    }

    private function getInsertViewData()
    {
        return array(
            'users'  => $this->db_manager->get('User')->fetchAllUsers(),
            '_token' => $this->generateCsrfToken(self::INSERT_TOKEN),
            'input'  => array_merge($this->getInsertSqlData(), array(
                'user_name_error' => $this->user_name_error,
                'password_error'  => $this->password_error,
            )),
        );
    }

    public function setInsertPostData()
    {
        $this->user_name = $this->request->getPost('user_name');
        $this->password = $this->request->getPost('password');
        $this->is_manager = $this->request->getPost('is_manager');
    }

    public function validateInputData($id = null)
    {
        if (!strlen($this->user_name)) $this->user_name_error = "入力がありません";
        if (!strlen($this->user_name_error) && !preg_match('/\A[0-9a-zA-Z]{4,20}\z/', $this->user_name)) $this->user_name_error = "入力が不正です";
        if (!strlen($this->user_name_error)) {

            if (is_null($id)) {

                if (!$this->db_manager->get('User')->isUniqueUserName($this->user_name)) {

                    $this->user_name_error = "すでに登録されています";
                }

            } else {

                if (!$this->db_manager->get('User')->isUniqueUserName($this->user_name, $id)) {

                    $this->user_name_error = "すでに登録されています";
                }
            }
        }

        if (!strlen($this->password)) $this->password_error = "入力がありません";
        if (!strlen($this->password_error) && !preg_match('/\A[0-9a-zA-Z]{4,20}\z/', $this->password)) $this->password_error = "入力が不正です";

        if (!strlen($this->user_name_error) && !strlen($this->password_error)) {

            return true;
        }

        return false;
    }

    public function insertAction()
    {
        return $this->render($this->getInsertViewData());
    }

    public function insertRegisterAction()
    {
        if (!$this->request->isPost()) {
            $this->forward404();
        }

        $token = $this->request->getPost('_token');
        if (!$this->checkCsrfToken(self::INSERT_TOKEN, $token)) {
            $this->forward404();
        }

        $this->setInsertPostData();

        if ($this->validateInputData()) {

            /* $this->db_manager->get('User')->insert($this->getInsertSqlData()); */

            return $this->redirect('/user/insert');
        }

        return $this->render($this->getInsertViewData(), 'insert');
    }

    private const UPDATE_TOKEN = "********";

    private function setInsertPostDataUsingButton()
    {
        $this->id = $this->request->getPost('id');
        $this->update_date = $this->request->getPost('update_date');
    }

    private function getIdAndUpdateDate()
    {
        return array(
            'id'          => $this->id,
            'update_date' => $this->update_date,
        );
    }

    private function getUpdateViewData()
    {
        return array(
            '_token'      => $this->generateCsrfToken(self::UPDATE_TOKEN),
            'id'          => $this->id,
            'update_date' => $this->update_date,
            'input'       => array_merge($this->getInsertSqlData(), array(
                'user_name_error' => $this->user_name_error,
                'password_error'  => $this->password_error,
            )),
        );
    }

    private function setInputData()
    {
        $user = $this->db_manager->get('User')->fetchUser($this->getIdAndUpdateDate());

        $this->user_name = $user['user_name'];
        $this->password = $user['password'];
        $this->is_manager = $user['is_manager'];
    }

    public function updateAction()
    {
        if (!$this->request->isPost()) {
            $this->forward404();
        }

        $token = $this->request->getPost('_token');
        if (!$this->checkCsrfToken(self::INSERT_TOKEN, $token)) {
            $this->forward404();
        }

        $this->setInsertPostDataUsingButton();

        if (!$this->db_manager->get('User')->userExists($this->getIdAndUpdateDate())) {
            $this->forward404();
        }

        $this->setInputData();

        return $this->render($this->getUpdateViewData());
    }

    private function setUpdatePostData()
    {
        $this->setInsertPostData();
        $this->setInsertPostDataUsingButton();
    }

    private function getUpdateSqlData()
    {
        return array_merge($this->getInsertSqlData(), $this->getIdAndUpdateDate());
    }

    public function updateRegisterAction()
    {
        if (!$this->request->isPost()) {
            $this->forward404();
        }

        $token = $this->request->getPost('_token');
        if (!$this->checkCsrfToken(self::UPDATE_TOKEN, $token)) {
            $this->forward404();
        }

        $this->setUpdatePostData();

        if (!$this->db_manager->get('User')->userExists($this->getIdAndUpdateDate())) {
            $this->forward404();
        }

        if ($this->validateInputData($this->id)) {

            /* $this->db_manager->get('User')->update($this->getUpdateSqlData()); */

            return $this->redirect('/user/insert');
        }

        return $this->render($this->getUpdateViewData(), 'update');
    }

    private const DELETE_TOKEN = "********";

    private function getDeleteViewData()
    {
        return array(
            '_token'      => $this->generateCsrfToken(self::DELETE_TOKEN),
            'id'          => $this->id,
            'update_date' => $this->update_date,
            'input'       => array_merge($this->getInsertSqlData(), array(
                'user_name_error' => $this->user_name_error,
                'password_error'  => $this->password_error,
            )),
        );
    }

    public function deleteAction()
    {
        if (!$this->request->isPost()) {
            $this->forward404();
        }

        $token = $this->request->getPost('_token');
        if (!$this->checkCsrfToken(self::INSERT_TOKEN, $token)) {
            $this->forward404();
        }

        $this->setInsertPostDataUsingButton();

        if (!$this->db_manager->get('User')->userExists($this->getIdAndUpdateDate())) {
            $this->forward404();
        }

        $this->setInputData();

        return $this->render($this->getDeleteViewData());
    }

    public function deleteRegisterAction()
    {
        if (!$this->request->isPost()) {
            $this->forward404();
        }

        $token = $this->request->getPost('_token');
        if (!$this->checkCsrfToken(self::DELETE_TOKEN, $token)) {
            $this->forward404();
        }

        $this->setInsertPostDataUsingButton();

        if (!$this->db_manager->get('User')->userExists($this->getIdAndUpdateDate())) {
            $this->forward404();
        }

        /* $this->db_manager->get('User')->delete($this->getIdAndUpdateDate()); */

        return $this->redirect('/user/insert');
    }
}

********はデータ通信のパスワードになりますので、書き換えてください。

layout.phpの作成

cake-manager/viewsフォルダの中のlayout.phpを書き換え。

<!DOCTYPE html>
<html lang="ja">
    <head>
        <meta name="author" content="haichoru(ハイチョル)">
        <meta charset="utf-8">
        <meta http-equiv="X-UA-Compatible" content="IE=edge">
        <meta name="viewport" content="width=device-width, initial-scale=1">
        <title><?php if (isset($title)) echo $title . ' - '; ?>Haichoru's Cake Manager</title>
        <link href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.1/css/bootstrap.min.css">
        <!--[if lt IE 9]>
            <script src="https://oss.maxcdn.com/html5shiv/3.7.2/html5shiv.min.js"></script>
            <script src="https://oss.maxcdn.com/respond/1.4.2/respond.min.js"></script>
        <![endif]-->
    </head>
    <body>
        <div class="container">

            <h1 class="page-header">Haichoru's ケーキ管理 <small>Cake Manager</small></h1>
            <hr>

            <?php echo $_content; ?>

        </div><!-- container -->

        <script type="text/javascript">
        <!--

            function javascript_submit(address, parameters)
            {
                var form_element = document.createElement('form');
                form_element.action = '<?php echo $base_url; ?>' + address;
                form_element.method = 'post';
                form_element.style.visibility = 'hidden';
                document.body.appendChild(form_element);

                for (var key in parameters) {

                    var input_element = document.createElement('input');
                    input_element.name = key;
                    input_element.value = parameters[key];
                    form_element.appendChild(input_element);
                }

                form_element.submit();

                return false;
            }

        // -->
        </script>
    </body>
</html>

insert.phpおよびinput.phpの作成

cake-manager/viewsフォルダの中に、userフォルダを作成します。
cake-manager/views/userフォルダの中に、insert.phpと名前をつけ、新規でファイルを作成します。
ファイルの中に下記のコードを記入し、文字コードUTF-8で保存します。

<?php $this->setLayoutVar('title', "User Insert"); ?>

<div class="row">

    <div class="col-sm-6">
        <div class="panel panel-default">
            <div class="panel-heading">
                <h3 class="panel-title"><span class="glyphicon glyphicon-tasks" aria-hidden="true"></span> ユーザ一覧<br><small>Users</small></h3>
            </div><!-- panel-heading -->
            <div class="panel-body">

                <?php if (count($users) > 0): ?>

                    <table class="table table-bordered">
                        <thead>
                            <tr>
                                <th></th>
                                <th></th>
                                <th>ユーザ</th>
                                <th>システム管理者</th>
                                <th>登録日</th>
                            </tr>
                        </thead>
                        <tbody>
                            <?php foreach ($users as $row): ?>
                                <tr>
                                    <td>
                                        <button type="button" class="btn btn-warning btn-sm">
                                            <span class="glyphicon glyphicon-cog" aria-hidden="true"></span> 編集
                                        </button>
                                    </td>
                                    <td>
                                        <button type="button" class="btn btn-danger btn-sm">
                                            <span class="glyphicon glyphicon-trash" aria-hidden="true"></span> 削除
                                        </button>
                                    </td>
                                    <td><?php echo $this->escape($row['user_name']); ?></td>
                                    <td><?php if ($row['is_manager'] === "1") echo "○"; ?></td>
                                    <td><?php echo $this->escape($row['insert_date']); ?></td>
                                </tr>
                            <?php endforeach; ?>
                        </tbody>
                    </table>

                <?php else: ?>

                    <p><span class="glyphicon glyphicon-alert" aria-hidden="true"></span> 現在登録はありません</p>

                <?php endif; ?>

            </div><!-- panel-body -->
        </div><!-- panel -->
    </div><!-- col -->

    <div class="col-sm-6">

        <div class="panel panel-default">
            <div class="panel-heading">
                <h3 class="panel-title"><span class="glyphicon glyphicon-tasks" aria-hidden="true"></span> ユーザ新規<br><small>User Insert</small></h3>
            </div><!-- panel-heading -->
            <div class="panel-body">

                <form onsubmit="return false;" class="form-horizontal" method="post" action="<?php echo $base_url; ?>/user/insert-register">
                    <input type="hidden" name="_token" value="<?php echo $this->escape($_token); ?>" />

                    <?php echo $this->render('user/input', $input); ?>

                    <div class="form-group">
                        <div class="col-sm-offset-4 col-sm-8">
                            <button type="button" class="btn btn-primary btn-sm">
                                <span class="glyphicon glyphicon-plus" aria-hidden="true"></span> 登録
                            </button>
                        </div>
                    </div>

                </form>

            </div><!-- panel-body -->
        </div><!-- panel -->

    </div><!-- col -->

</div><!-- row -->

cake-manager/views/userフォルダの中に、input.phpと名前をつけ、新規でファイルを作成します。
ファイルの中に下記のコードを記入し、文字コードUTF-8で保存します。

<div class="form-group form-group-sm<?php if (strlen($user_name_error) > 0) echo ' has-error'; ?>">
    <label class="control-label col-sm-4" for="user_name">ユーザ:</label>
    <div class="col-sm-8">
        <input type="text" class="form-control" name="user_name" id="user_name" value="<?php echo $this->escape($user_name); ?>" placeholder="半角英数字4文字以上20文字以内" autocomplete="off" />
        <p class="help-block"><?php if (strlen($user_name_error) > 0) echo "<span class=\"glyphicon glyphicon-alert\" aria-hidden=\"true\"></span> {$this->escape($user_name_error)}"; ?></p>
    </div>
</div>

<div class="form-group form-group-sm<?php if (strlen($password_error) > 0) echo ' has-error'; ?>">
    <label class="control-label col-sm-4" for="password">パスワード:</label>
    <div class="col-sm-8">
        <input type="password" class="form-control" name="password" id="password" value="<?php echo $this->escape($password); ?>" placeholder="半角英数字4文字以上20文字以内" autocomplete="off" />
        <p class="help-block"><?php if (strlen($password_error) > 0) echo "<span class=\"glyphicon glyphicon-alert\" aria-hidden=\"true\"></span> {$this->escape($password_error)}"; ?></p>
    </div>
</div>

<div class="form-group form-group-sm">
    <div class="col-sm-offset-4 col-sm-8">
        <div class="checkbox">
            <input type="hidden" name="is_manager" value="0" />
            <label>
                <input type="checkbox" name="is_manager" value="1"<?php if ($is_manager === "1") echo " checked"; ?> /> システム管理者
            </label>
        </div>
    </div>
</div>


update.phpおよびdelete.phpおよびinput-disabled.phpの作成

cake-manager/views/userフォルダの中に、update.phpと名前をつけ、新規でファイルを作成します。
ファイルの中に下記のコードを記入し、文字コードUTF-8で保存します。

<?php $this->setLayoutVar('title', "User Update"); ?>

<div class="row">

    <div class="col-sm-offset-3 col-sm-6">

        <div class="panel panel-default">
            <div class="panel-heading">
                <h3 class="panel-title"><span class="glyphicon glyphicon-tasks" aria-hidden="true"></span> ユーザ更新<br><small>User Update</small></h3>
            </div><!-- panel-heading -->
            <div class="panel-body">

                <form onsubmit="return false;" class="form-horizontal" method="post" action="<?php echo $base_url; ?>/user/update-register">
                    <input type="hidden" name="_token" value="<?php echo $this->escape($_token); ?>" />
                    <input type="hidden" name="id" value="<?php echo $this->escape($id); ?>" />
                    <input type="hidden" name="update_date" value="<?php echo $this->escape($update_date); ?>" />

                    <?php echo $this->render('user/input', $input); ?>

                    <div class="form-group">
                        <div class="col-sm-offset-4 col-sm-8">
                            <button type="button" class="btn btn-warning btn-sm">
                                <span class="glyphicon glyphicon-cog" aria-hidden="true"></span> 更新
                            </button>
                        </div>
                    </div>

                </form>

                <div class="row">
                    <div class="col-sm-offset-4 col-sm-8">
                        <a href="<?php echo $base_url; ?>/user/insert" class="btn btn-default btn-sm" role="button">
                            <span class="glyphicon glyphicon-chevron-left" aria-hidden="true"></span> 戻る
                        </a>
                    </div>
                </div>

            </div><!-- panel-body -->
        </div><!-- panel -->

    </div><!-- col -->

</div><!-- row -->

cake-manager/views/userフォルダの中に、delete.phpと名前をつけ、新規でファイルを作成します。
ファイルの中に下記のコードを記入し、文字コードUTF-8で保存します。

<?php $this->setLayoutVar('title', "User Delete"); ?>

<div class="row">

    <div class="col-sm-offset-3 col-sm-6">

        <div class="panel panel-default">
            <div class="panel-heading">
                <h3 class="panel-title"><span class="glyphicon glyphicon-tasks" aria-hidden="true"></span> ユーザ削除<br><small>User Delete</small></h3>
            </div><!-- panel-heading -->
            <div class="panel-body">

                <form onsubmit="return false;" class="form-horizontal" method="post" action="<?php echo $base_url; ?>/user/delete-register">
                    <input type="hidden" name="_token" value="<?php echo $this->escape($_token); ?>" />
                    <input type="hidden" name="id" value="<?php echo $this->escape($id); ?>" />
                    <input type="hidden" name="update_date" value="<?php echo $this->escape($update_date); ?>" />

                    <?php echo $this->render('user/input-disabled', $input); ?>

                    <div class="form-group">
                        <div class="col-sm-offset-4 col-sm-8">
                            <button type="button" class="btn btn-danger btn-sm">
                                <span class="glyphicon glyphicon-trash" aria-hidden="true"></span> 削除
                            </button>
                        </div>
                    </div>

                </form>

                <div class="row">
                    <div class="col-sm-offset-4 col-sm-8">
                        <a href="<?php echo $base_url; ?>/user/insert" class="btn btn-default btn-sm" role="button">
                            <span class="glyphicon glyphicon-chevron-left" aria-hidden="true"></span> 戻る
                        </a>
                    </div>
                </div>

            </div><!-- panel-body -->
        </div><!-- panel -->

    </div><!-- col -->

</div><!-- row -->

cake-manager/views/userフォルダの中に、input-disabled.phpと名前をつけ、新規でファイルを作成します。
ファイルの中に下記のコードを記入し、文字コードUTF-8で保存します。

<div class="form-group form-group-sm">
    <label class="control-label col-sm-4" for="user_name">ユーザ:</label>
    <div class="col-sm-8">
        <input type="text" class="form-control" id="user_name" value="<?php echo $this->escape($user_name); ?>" disabled />
        <p class="help-block"></p>
    </div>
</div>

<div class="form-group form-group-sm">
    <label class="control-label col-sm-4" for="password">パスワード:</label>
    <div class="col-sm-8">
        <input type="password" class="form-control" id="password" value="<?php echo $this->escape($password); ?>" disabled />
        <p class="help-block"></p>
    </div>
</div>

<div class="form-group form-group-sm">
    <div class="col-sm-offset-4 col-sm-8">
        <div class="checkbox">
            <input type="hidden" name="is_manager" value="0" />
            <label>
                <input type="checkbox" name="is_manager" value="1"<?php if ($is_manager === "1") echo " checked"; ?> disabled /> システム管理者
            </label>
        </div>
    </div>
</div>

UserRepository.php

cake-manager/modelsフォルダの中のUserRepository.phpを書き換え。
ファイルの中に下記のコードを記入し、文字コードUTF-8で保存します。

<?php

/**
 * UserRepository.
 *
 * @author Katsuhiro Ogawa <fivestar@nequal.jp>
 */
class UserRepository extends DbRepository
{
    public function insert($data)
    {
        $sql = "
            INSERT INTO user
                (
                    user_name,
                    password,
                    is_manager,
                    insert_date,
                    update_date
                )
            VALUES
                (
                    :user_name,
                    :password,
                    :is_manager,
                    NOW(),
                    NOW()
                )
        ";

        $stmt = $this->execute($sql, array(
            ':user_name'  => $data['user_name'],
            ':password'   => $data['password'],
            ':is_manager' => $data['is_manager'],
        ));
    }

    public function isUniqueUserName($user_name, $id = null)
    {
        $sql = "
            SELECT COUNT(id) AS count_id
            FROM user
            WHERE
                delete_date IS NULL
                AND user_name = :user_name
        ";

        $params = array(':user_name' => $user_name,);

        if (!is_null($id)) {

            $sql .= "
                    AND id <> :id
            ";

            $params = array_merge($params, array(':id' => $id,));
        }

        $row = $this->fetch($sql, $params);

        if ($row['count_id'] === '0') {

            return true;
        }

        return false;
    }

    public function fetchAllUsers()
    {
        $sql = "
            SELECT id, user_name, is_manager, insert_date, update_date
            FROM user
            WHERE delete_date IS NULL
        ";

        return $this->fetchAll($sql);
    }

    public function userExists($data)
    {
        $sql = "
            SELECT COUNT(id) AS count_id
            FROM user
            WHERE
                delete_date IS NULL
                AND id = :id
                AND DATE_FORMAT(update_date, '%Y-%m-%d %T') = :update_date
        ";

        $row = $this->fetch($sql, array(
            ':id'          => $data['id'],
            ':update_date' => $data['update_date'],
        ));

        if ($row['count_id'] === '1') {

            return true;
        }

        return false;
    }

    public function fetchUser($data)
    {
        $sql = "
            SELECT user_name, password, is_manager
            FROM user
            WHERE
                delete_date IS NULL
                AND id = :id
                AND DATE_FORMAT(update_date, '%Y-%m-%d %T') = :update_date
        ";

        return $this->fetch($sql, array(
            ':id'          => $data['id'],
            ':update_date' => $data['update_date'],
        ));
    }

    public function update($data)
    {
        $sql = "
            UPDATE user
            SET
                user_name = :user_name,
                password = :password,
                is_manager = :is_manager,
                update_date = NOW()
            WHERE
                delete_date IS NULL
                AND id = :id
                AND DATE_FORMAT(update_date, '%Y-%m-%d %T') = :update_date
        ";

        $stmt = $this->execute($sql, array(
            ':user_name'   => $data['user_name'],
            ':password'    => $data['password'],
            ':is_manager'  => $data['is_manager'],
            ':id'          => $data['id'],
            ':update_date' => $data['update_date'],
        ));
    }

    public function delete($data)
    {
        $sql = "
            UPDATE user
            SET
                update_date = NOW(),
                delete_date = NOW()
            WHERE
                delete_date IS NULL
                AND id = :id
                AND DATE_FORMAT(update_date, '%Y-%m-%d %T') = :update_date
        ";

        $stmt = $this->execute($sql, array(
            ':id'          => $data['id'],
            ':update_date' => $data['update_date'],
        ));
    }
}


これで、ユーザ管理の機能の完成になります。
お疲れさまでした。

次回は、ログインの機能の作成になります。

コメント