データベース

データベース(MySQL)のサンプルモジュールです。
前述のサンプルモジュールである メールフォーム のビューを一部修正して利用します。
このモジュールは、入力値をメール送信するのでなく、データベースに格納するサンプルです。

DEMO

http://lmd.root-n.com/demo/database/

上記DEMOは、アプリケーションのルートディレクトリが /demo であり、モジュールグループは「database」になります。

DOWNLOAD

mailform モジュール一式をダウンロードできます。

※このモジュールは Windows に対応していません。

設置手順

  1. モジュール一式をダウンロードし、展開します。
  2. database/
        +—database/
        |       confirm.view.php
        |       delete.logic.php
        |       edit.logic.php
        |       edit.view.php
        |       foot.view.php
        |       head.logic.php
        |       head.view.php
        |       index.logic.php
        |       index.view.php
        |
        +—libs/
        |       DB/
        |         DAO_test_table.php
        |
        +—resources
        |       browser.php
        |       os.php
        |       within.php
        |
        \—validators/
                mailform.php

     
  3. ファイルを所定の位置にアップロードします。
    • モジュール
    • database/* ⇒ Lambda/apps/<APP_DIR>/database/*
    • ライブラリ
    • libs/DB/DAO_test_table.php ⇒ Lambda/libs/DB/DAO_test_table.php
    • リソース
    • resources/* ⇒ Lambda/resources/*
    • ※ すでにメールフォームのサンプルモジュールで設置済みの場合は不要です。
    • バリデーター
    • validators/mailform.php ⇒ Lambda/validators/mailform.php
    • ※ すでにメールフォームのサンプルモジュールで設置済みの場合は不要です。
     
  4. データベースとテーブルを作成します
  5. テスト用に新規データベースを作成し、下記DDLでテーブルを作成します。

    CREATE TABLE `test_table` (
        `test_table_id` int  NOT NULL  auto_increment,
        `name` varchar(255)  NOT NULL,
        `email` varchar(255)  NOT NULL,
        `os` int  NOT NULL,
        `within` int  NOT NULL,
        `browser` varchar(255)  NOT NULL,
        `message` text  NOT NULL,
        `reg_datetime` datetime  NOT NULL,
        `upd_datetime` datetime  NULL,
        PRIMARY KEY (test_table_id)
    ) TYPE=InnoDB CHARACTER SET UTF8;
     
  6. 定数「DB_*」の設定
  7. Lambda/apps/<APP_DIR>/app.conf.php

    DBに関わる設定を行います。

    define('DB_HOST', ''); // DBサーバーのホスト名
    define('DB_USER', ''); // ユーザー名
    define('DB_PASS', ''); // パスワード
    define('DB_NAME', ''); // データベース名(前項で作成したDB)

    ※ ここで設定された定数の値は、下記で利用されます。

    Lambda/libs/DB/DAO_Base.php のコンストラクタ

    1
    2
    3
    4
    5
    6
    public function __construct()
    {
        if ( ! $this->manipulator) {
            $this->manipulator = new PDO_MySQL_Manipulator(DB_HOST, DB_NAME, DB_USER, DB_PASS, DB_ENCODING);
        }
    }
     
  8. 定数「DATABASE_DRYRUN」の設定変更
  9. Lambda/apps/<APP_DIR>/database/index.logic.php

    define('DATABASE_DRYRUN', 1);
      ↓
    define('DATABASE_DRYRUN', 0);

    1 から 0 に変更することで、実際にインサートを行う設定になります。

     
  10. ブラウザでアクセスして、動作確認を行います。
  11. http://<DOMAIN>/database/
  12.  

    ※ PHP E_WARNING: mysql_set_charset(): … などと、mysql_set_charset のエラーが発生する場合は、下記を書き換えてください。

    Lambda/libs/DB/PDO_MySQL.php 32行目付近

    修正前)
    //if ($encoding) $this->pdo->query("SET NAMES $encoding ; ");
    if ($encoding) mysql_set_charset($encoding); // MySQL 5.0.7 以降でないと使用できません。

    修正後)
    if ($encoding) $this->pdo->query("SET NAMES $encoding ; ");
    //if ($encoding) mysql_set_charset($encoding); // MySQL 5.0.7 以降でないと使用できません。

    コメントを入替えます。

プログラムコードの一部抜粋

プログラムコードを一部抜粋して掲載します。
下記は、DEMOで動作している、database.index ロジックモジュラーのソースコードになります。

/path/to/Lambda/apps/<APP_DIR>/database/index.logic.php

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
<?php

/*****************************************************************************
 *
 * サンプルのため、冗長なコメントになっています。
 *
 ****************************************************************************/


/**

以下の DDL でテーブルを作成してください。

CREATE TABLE `test_table` (
    `test_table_id` int  NOT NULL  auto_increment ,
    `name` varchar(255)  NOT NULL   ,
    `email` varchar(255)  NOT NULL   ,
    `os` int  NOT NULL   ,
    `within` int  NOT NULL   ,
    `browser` varchar(255)  NOT NULL   ,
    `message` text  NOT NULL   ,
    `reg_datetime` datetime  NOT NULL   ,
    `upd_datetime` datetime  NULL   ,
    PRIMARY KEY (test_table_id)
) TYPE=InnoDB CHARACTER SET UTF8;

*/


/**
 * サンプルのため、定数定義をこのファイル内に記述しています。
 * 本来は、Lambda/apps/<APP_DIR>/app.conf.php に定義することが推奨されます。
 */

// ドライラン: 更新系SQLを実行する = 0 | 更新系SQLを実行しない = 1
//
//   ※ サンプルのため、この定数を定義しています。本来は不要です。
//      また、ロジックとビューでこの定数を参照しているステートメントも不要になります。
define('DATABASE_DRYRUN', 1);

// Rows Per Page: 1ページに収める行数
define('RPP', 5);

/**
 * ジャバスクリプトライブラリのロード
 *
 *   ジャバスクリプトライブラリは、Lambda/libs/Javascript.php にあります。
 *
 * [tips]
 * よく使うライブラリは、Lambda/apps/<APP_DIR>/app.init.php で事前にロードしておくとよい。
 */

Factory::import('Javascript');

/**
 * DAOライブラリをロードし、インスタンス化する
 */

$dao = Factory::load('DB/DAO_test_table')->getInstance();



/*****************************************************************************
 * 以下、【確認】【登録】【修正】のいずれかのボタンが押された時の処理
 */


/**
 * POSTパラメーターを配列に格納。
 *
 *   こうしておくと、後続処理の setResponse や invokeValidator に値を渡す際に
 *   簡素に記述できます。
 */

$p = array(
    'name'    => $lmd->httpPost('name'),
    'email'   => $lmd->httpPost('email'),
    'os'      => $lmd->httpPost('os'),
    'within'  => $lmd->httpPost('within'),
    'browser' => $lmd->httpPost('browser', array()),
    'message' => $lmd->httpPost('message'),
);

/**
 * 主キー:test_table_id の取得
 */

$test_table_id = $lmd->httpPost('test_table_id');

/**
 * レスポンスをアサイン
 */

$lmd->setResponse($p);

if ($lmd->hasHttpPost('confirm') || $lmd->hasHttpPost('commit') || $lmd->hasHttpPost('edit')) {
    /**
     * 【確認】【登録】【修正】のいずれかのボタンが押された。
     *
     *   バリデーターを実行して、入力値の検証を行います。
     *   ※ バリデーター定義は、Lambda/validators/mailform.php にあります。
     */

    $lmd->invokeValidator('mailform', $p);
}

if ($lmd->hasValidatorError()) {
    /**
     * 入力エラーが発見された。
     */


    if ($lmd->hasHttpPost('edit')) {
        /**
         * 遷移元は「修正画面」だったので、
         *   主キーである「test_table_id」をレスポンスにセットし、
         *   「修正画面」に遷移させる。
         */

        $lmd->setResponse(array('test_table_id' => $test_table_id));
        return $lmd->setPrep('database.edit');
    } else {
        /**
         * 「入力画面」に遷移させる。
         */

        return $lmd->setPrep('database.index');
    }
}

if ($lmd->hasHttpPost('confirm') && ! $lmd->hasValidatorError()) {
    /**
     * 【確認】ボタンが押され、入力エラーが無い。
     *
     *   ⇒ 「確認画面」に遷移させる。
     */

    return $lmd->setPrep('database.confirm');
}

if (($lmd->hasHttpPost('commit') || $lmd->hasHttpPost('edit')) && ! $lmd->hasValidatorError()) {

    /**
     * 【登録】または【修正】ボタンが押され、入力エラーが無い。
     */


    /**
     * ブラウザ: カンマ区切りに変換
     */

    $p['browser'] = implode(',', $p['browser']);

    $result = false;
    if ($lmd->hasHttpPost('commit')) {
        /**
         * 【登録】ボタンが押されていた。
         *
         *    ⇒ データベースに登録(insert)する。
         */


        /**
         * 登録実行(insert)
         */

        if ( ! DATABASE_DRYRUN) $result = $dao->insert($p);
    }

    if ($lmd->hasHttpPost('edit')) {
        /**
         * 【修正】ボタンが押されていた。
         *
         *    ⇒ データベースを更新(update)する。
         */


        /**
         * 更新実行(update)
         */

        if ( ! DATABASE_DRYRUN) $result = $dao->update($test_table_id, $p);
    }

    if (DATABASE_DRYRUN) {
        /**
         * ドライラン
         */

        Javascript::redirect($lmd->httpRequestDir().'/', 'サンプルのため、インサートしません');
    } elseif ($result) {
        /**
         * 登録/更新 成功
         *
         *    リロード操作での二重送信を防止するため、リダイレクトさせます。
         */

        $lmd->redirect($lmd->httpRequestDir().'/');
        exit;
    } else {
        /**
         * 登録/更新 失敗
         *
         *    遷移元に戻します。
         */

        Javascript::backHistory('登録に失敗しました', '#ffa07a');
    }
}



/*****************************************************************************
 * 以下、すでに登録されているデータの取得とページャ処理
 */


/**
 * ページ番号初期化
 */

$page = $lmd->httpGet('page', 1, '/^[0-9]+$/');

/**
 * offset と limit を定義
 */

$offset = ($page - 1) * RPP;
$limit  = RPP;

/**
 * DBアクセスして、行を取得
 */

$res = $dao->fetchAll($offset, $limit);

/**
 * 行の総数を取得
 */

$total_rows = $dao->foundRows();

/**
 * 取得したデータをレスポンスにアサイン
 */

$lmd->setResponse(array(
    'res' => $res,
));

/**
 * ページャーライブラリをロードして、ページャーをアサイン
 */

Factory::import('Pager');
$lmd->setResponse(array(
    'pager' => Pager::GETParam($page, $limit, $total_rows)
), Lambda::INSANITATION);



/*****************************************************************************
 * ここまで来たら、暗黙のうちに database/index.prep.php に処理が移ります。
 * database/index.prep.php がない場合は、database/index.view.php に処理が移ります。
 */
次ページ: リファレンス