データベース(MySQL)のサンプルモジュールです。
前述のサンプルモジュールである メールフォーム のビューを一部修正して利用します。
このモジュールは、入力値をメール送信するのでなく、データベースに格納するサンプルです。
DEMO
http://lmd.root-n.com/demo/database/
上記DEMOは、アプリケーションのルートディレクトリが /demo であり、モジュールグループは「database」になります。
DOWNLOAD
mailform モジュール一式をダウンロードできます。
- tar.gz: database.tar.gz
- zip: database.zip
※このモジュールは Windows に対応していません。
設置手順
- モジュール一式をダウンロードし、展開します。
- ファイルを所定の位置にアップロードします。
- モジュール
- 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
- ※ すでにメールフォームのサンプルモジュールで設置済みの場合は不要です。
- データベースとテーブルを作成します
- 定数「DB_*」の設定
- 定数「DATABASE_DRYRUN」の設定変更
- ブラウザでアクセスして、動作確認を行います。
- http://<DOMAIN>/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
テスト用に新規データベースを作成し、下記DDLでテーブルを作成します。
`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
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); } } |
Lambda/apps/<APP_DIR>/database/index.logic.php
↓
define('DATABASE_DRYRUN', 0);
1 から 0 に変更することで、実際にインサートを行う設定になります。
※ 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 に処理が移ります。 */ |