e. f. 成果物の確認

期末課題の作成が今回、完了した受講生は提出する。

来週は、コメントと確認。

課題制作の実演:

ボードゲーム貸し出しデータベース

cakephp で bake コマンドによりphp の MVC を自動生成する。

src\config\app.php の設定は先週済ませてある。

src フォルダをコンソールから開く(fpフォルダを右クリック→ コマンドプロンプトを開く)。

以下のコードで、 users や games のテーブル名の部分は、各自のデータベースに合わせておく。

set path=%path%;d:\xampp\php
bin\cake bake all users
bin\cake bake all games

games_users テーブルは、cakephpの規約 「id フィールドを主キーとして持つ」に従っていないため bake all でMVCを自動生成できない。

bake のコマンド オプションスイッチ --primary-key で複合主キーを指定してモデルを作成する。

bin\cake bake model games_users --primary-key game_id,user_id --fields game_id,user_id,date

コントローラとビューをbakeする。

bin\cake bake controller games_users

bin\cake bake template games_users

src/Controller/GamesUsersController.php でモデルを指定。

    public function initialize() {
        $this->loadModel('GamesUsers');
    }

src/Template/GamesUsers/add.ctp に追記。

            echo $this->Form->control('user_id', ['options' => $users,'type' => 'select']);
            echo $this->Form->control('game_id', ['options' => $games,'type' => 'select']);

src/Controller/GamesUsersController.php が何故かバグるので修正。

                //$this->Flash->success(__('The games user has been saved.'));

幾つか不具合が残っているが、来週に調整。

・デバッグモードの解除

・不要なリンク、メニューの削除

・メニューの日本語化

上記の手順の代わりに、テーブルを再設計し、cakePHP で bake 可能なように修正した手順を以下に示す。

あわせて、gamesテーブルにカテゴリと返却日のdate2を追加している。

貸し出しテーブルの設計上の問題点:

bookmarkチュートリアルの設定を流用しているので発生

ゲームを返却した場合は、貸し出し記録を削除する。貸し出し履歴は保存されない。仕様。

user_id と game_id が複合キーで主キーとなっている。ゲームと利用者は多対多の関係である:

1人で複数のゲームを借りることが出来る

1つのゲームを複数の利用者で共有して借りることが出来る

ゲームを返却するには、借りた利用者全ての記録を削除する必要がある

ある利用者が借りているゲームを返却することなくもう一度借りることは出来ない。 ←これはOK

変更内容

貸し出しの履歴を記録する。

games_users テーブルの設計を変更

(省略 貸し出し中のゲームを返却前に貸し出せないように処理を追加。)

(省略 1つのゲームを複数の学生が同時に借りることはない。)

作業 テーブル名の変更

rename table games_users to rentals

貸し出し id の設定 → 主キー

返却日の設定 date2

games_usersテーブルを名前の変更ではなく、作成しなおす場合は↓

create table rentals (
    id int not null primary key,
    user_id int not null,
    game_id int not null,
    date datetime,
    date2 datetime,
    FOREIGN KEY user_key2(user_id) REFERENCES users(id),
    FOREIGN KEY game_key2(game_id) REFERENCES games(id)

);

games_usersテーブルに設定しているインデックス user_key と game_key と名前が被らないように、↑のテーブルではインデックスの名前を変更してある。

※重要※ テーブルの修正や追加などで、MVCに変更が必要な場合は、 bake しなおす。その際、編集中のファイルは閉じておくこと。元のphpファイルは上書きされる。phpにコードを追加していた場合は、必要に応じて編集しなおす。

set path=%path%;d:\xampp\php
bin\cake bake all rentals
bin\cake bake all users
bin\cake bake all games
bin\cake bake all categories

・MySQLでは、外部キー制約のあるフィールドには、インデックスの設定が必要。 https://dev.mysql.com/doc/refman/5.6/ja/create-table-foreign-keys.html

・外部キー制約を設定する際には、参照されるキー(別のテーブルの主キー)と外部キー(参照する側のテーブルのキー)に矛盾がないようにデータの登録・修正が必要。矛盾が有る場合は、外部キー制約が設定できない。

外部キー制約は、SQLの create table や alter table で設定するか、phpMyadminの デザイナ画面から、コネクタの設定で行う。

timezoneの設定

貸し出し処理 と 返却処理 の作成

games テーブルの修正

status フィールドの追加 データ型 int 値 0 貸し出し可能 1 貸し出し中

貸し出し処理

貸し出し可能なゲームを検索

貸し出し用フォームで貸し出し登録 利用者 貸出日 ゲームid を記録

貸し出したゲームの status を 貸し出し中に変更

返却処理

貸し出し中ゲームをリストアップ

貸し出し中リストから選択したゲームの貸し出し記録に返却日を記録

貸し出したゲームの status を 貸し出し可能 に変更

cake bake する。

複合キーのテーブルの bakeについて

http://qiita.com/waterada/items/1067a5a70e41510e3684

bin/cake bake model hoges --primary-key id1,id2

↓ debug を false にしていると発生する問題。 debug true の場合はキャッシュが影響することはなさそう。

PHPのコードを修正しても、Webの画面にコードの変更が適用されない場合の対応について:

次の Blog を参考に、モデルのキャッシュファイルを削除する。

http://www.hangout.co.jp/blog/archives/145

例)

D:\XAMPP\htdocs\fp\app\tmp\cache\models にある、
myapp_cake_model_default_データベース名_テーブル名

のファイルを削除。

モデルの以外のフォルダにキャッシュファイルがあるので必要があれば削除する。

以下、2017年度版に調整中の内容:

メニューの日本語化

cake bake i18n

の多言語対応機能を利用する。

例えば、

検索: CakePHP3 カスタマイズ

で、cake bake で作成された Template の ctp ファイルを修正し、表示項目の 選択(不要なものを削除) や、表示順の並べ替えなど。

・app.php のデバッグ設定を false にして、SQLの実行文や、エラーを非表示に設定する。(本番運用環境設定)

・D:\XAMPP\htdocs\fp\app\Template\Layout\ の default.ctp を編集して、Webページの

ヘッダーやフッター、背景のデザインを修正する。 HOME のリンク先をTOP ページに変更など。

・ルーティングの設定

例)

http://localhost/fp/ の短いURLで、 http://localhost/fp/games/ を表示するように、

app/config/routes.php を修正。

・ データの表示順の指定

例)

・SQL でビューを作成して、cakephpから利用する。

MySQLで表示項目を制限するテーブルのビューを作成する。

例)

ゲームテーブルの表示で、id name description の3項目の表示を、 id name だけの表示に制限する。

MySQLに、 games に対するビュー game2s を作成して登録する。

create view game2s as
SELECT `games`.`id`, `games`.`name`
FROM `games`
ORDER BY `games`.`name` ASC

CakePHP に、モデル Game2 と コントローラー Game2sController を作成する。

↓ 先に primary key を指定して model を bake してから controller と template を bake する方法に修正。

bin\cake bake all game2s

Scaffold を利用したビューの作成では、 モデルの id フィールドを省略するとエラーになる。

http://qiita.com/uedatakeshi/items/de4c89530860ab6b3bd7

↑のブログを参考に、$this->setPrimaryKey('id'); を Games2sTable.php のモデルに追加して、再び bake template する

ビューだけの bake

bin\cake bake template game2s

http://localhost/fp/game2s

から動作確認

Template\Layout\default.ctp を編集して、メインのページにリンクを組み込む。

games_users テーブルに対して bake all するには:

set path=%path%;d:\xampp\php

bin\cake bake model games_users --primary-key game_id,user_id

複合主キーのテーブルを cakephp に対応させる方法:

複合主キーのテーブルには、別の主キーを設定できないので、サロゲートキーを後から付加する。

https://teratail.com/questions/21493

トリガーでレコードのinsert時に連番でidフィールドに現在の最大値+1の値を書き込む。

games_usersテーブルに id フィールドを INT で追加して、以下のトリガーを設定。

DROP TRIGGER IF EXISTS `trigger1`;CREATE DEFINER=`root`@`localhost` TRIGGER `trigger1` BEFORE INSERT ON `games_users` FOR EACH ROW BEGIN
DECLARE newid INT;
SELECT IFNULL(MAX(id) + 1, 1) INTO @newid FROM games_users;
SET new.id = @newid;
END

MVC を bake しなおす。phpコードが確実に生成されるようにするために、元のファイルを削除しておく(実習室の不具合対応のため)。

以下、2016年度用資料

チャレンジ: 以下の作業は、調査・デバッグで、かなりの時間を必要とします。時間に余裕がある場合は挑戦してみましょう。

・ビューの作成

Blogシステムの作成と同様に、ビューを作成する。 Scaffold をオフ にして、PHPのプログラムで表示画面を作成する。

・ログイン画面の作成

CakePHPで、ログイン認証を設定する方法を調べ、ログイン画面を作成する。

・WebAPIの利用

データベースに登録したフィールドの内容と、 WebAPIを組み合わせ、ビューで利用する。

例) 位置情報、商品画像、etc

裏技1: blog データベース全体をエクスポートし、別のデータベースとしてインポートできるかもしれない。そうした場合、blogシステムのクローンが作成される。テーブルのフィールド名を再設計すれば、blogシステムを改造して、期末課題が作成できるかもしれない。

〆切: 7月31日(日) まで。

個別の事情で、提出が遅れる場合は、担当まで連絡すること。

Twitter @_kobashi

Mail kobashi@nagoya-bunri.ac.jp

※ 8/1~は、採点で大学に午後からきていると思います。

■ WebClass に提出

» 第2回 phpMyadmin のスクリーンショット画面

» 第3回 mysqlでデータベース背系 (スクリーンショット画像)

» 第4回テーブル作成演習(XAMPP)

» 第4回テーブル正規化演習問題

» 第5回課題問題

» 第6回課題提出用 (SQLZOO)

» 第7回課題提出 (SQLZOO)

» 第8回課題提出用(2個分) (SQLZOO)

■ レポートフォルダに提出

第9回 トランザクションの演習(mysqlのエクスポートファイル)

第10~12回 blogシステム(blogフォルダ + mysqlからblogデータベースをエクスポート)

■ 担当者に連絡して、データベースシステムの説明

» 期末課題企画提出

提出方法

製作したWebサービス(DBMS)を構成するデータ一式

例) htdocs のphp ファイル群(フォルダ構成全体) + mysqlのデータベースのエクスポートファイル

上記を、レポートフォルダの 【学生用】課題提出用 に、期末課題学籍番号 のフォルダを作成して提出。

動作確認用リンク

http://192.168.201.17/movie/ ※Chrome で要動作確認

http://192.168.201.18/book3114046a/rentals/

http://192.168.201.20/anstar3114034/parties/

http://192.168.201.29/

http://192.168.201.12/

【緊急対応】 期末課題の企画ができていない人へ(もう間に合わないかもしれない)

期末課題企画の考え方

データベースのタイトル(テーマ)の決め方

ジャンルは? 自分のよく知っているジャンルを推奨。

理由 データベースの活用方法を考えやすい。

どのような機能が必要ですか?

規模は? ある程度特定(ジャンルを絞るなど)して、企画を小型化するとよい。

例) ゲーム(広すぎる) → ボードゲーム(まだ広いかも)

→ 国産ボードゲーム(まぁまぁ)

→ 2016年発売国産ボードゲーム(できそう)

ほかには、メーカーや機種で絞り込むなど

※サンプルに使用するデータは、架空のものでもかまわない

テーマはカタログとは限らない

誰の、どのような行動の、何の記録を、何のために、とるのか企画する。

例) 書籍の購入記録(個人) 今までに買った書籍、コミックのデータを記録する。

例) 書籍の購入記録(店) 店内の在庫・販売データを記録する。

例) 書籍のレビュー(読んだ人達) コメント・評価を記録する。

例) 試合結果 対戦結果を記録する。試合の内容・日付・ポイントetc

テーブルをいきなりSQLやPHPMやAdminで作成するのが難しい人は
メモ帳などで、
データベースのテーブル設計をしてください。

テーブルの決め方

テーブル名のチェックは、こちらのサイトを利用する→ http://inflector.cakephp.org/

例) money を入力して [inflect me baby!]ボタンを押すと、 tableize(テーブル化)の行に、 monies が表示される。これをテーブル名に使うとよい。

※正しい複数形が表示されない場合があるが、CakePHPのシステムが推定するテーブル名を利用しておくと作業のトラブルが少ない。

※不適切なテーブル名を使用してしまったら・・・

PHPMyadminのメニューからは、テーブル名の変更は出来ないので、SQLコマンドで名前を修正する。

例) book を booksにする

ALTER TABLE book RENAME TO books

テーブル名1 games (複数系 Sを付ける。正しい英単語で。自信が無い場合検索して確認)

フィールド名11 id 必須フィールド

フィールド名12 title 項目フィールド(データ入力の際の見出しの役割も果たす)

※どんなテーブルも、最低2個のフィールドが必要です。

テーブル名2 owers

フィールド名21 id 必須フィールド

フィールド名22 name 項目フィールド(データ入力際の見出しの役割も果たす)

フィールド名23 age 項目フィールド(データの有効範囲も企画で決まる。バリデーション(正当性検証)で利用)

テーブル名3 items

フィールド名31 id 必須フィールド

フィールド名32 game_id 外部キー(他のテーブルのidを参照している)

フィールド名33 ower_id 外部キー(他のテーブルのidを参照している)

フィールド名34 amount 項目フィールド(データの有効範囲も企画で決まる。バリデーション(正当性検証)で利用)

フィールド名34 star 項目フィールド(データの有効範囲も企画で決まる。バリデーション(正当性検証)で利用)

フィールド名34 date 項目フィールド(データの有効範囲も企画で決まる。バリデーション(正当性検証)で利用)

(ヒント) テーブルが1つ、もしくは2つしか企画できない人へ

テーブルのフィールドを増やしてください。

ゲームテーブル

ゲーム名

メーカー名

対応ハード

ジャンル

監督

ジャンル

購入日

お勧め度

etc

↑すると、テーブルの正規化の条件により、この項目は別のテーブルが必要そうということに気が付きます。

※繰り返し項目 何度も繰り返して同じ内容を記録することになるフィールドは、別のテーブルに分けます。

例)

ゲームテーブル(個人所有)

id 管理用キー(主キー、自動設定)

ゲーム名 文字で記入(30文字まで)

お勧め度 数値(1~5)

購入日 日付(年・月・日)

監督id 監督テーブルのid

メーカーid 同様

ハードid 同様

ジャンルid 同様

監督テーブル

id 管理用キー(主キー、自動設定)

監督 文字で15文字まで

メーカーテーブル

id 管理用キー(主キー、自動設定)

メーカー名 文字で15文字まで

ハードテーブル

id 管理用キー(主キー、自動設定)

対応ハード 文字で15文字まで

ジャンルテーブル

id 管理用キー(主キー、自動設定)

ジャンル 文字で15文字まで

PHPのコードについて

【参照】 CakePHPの命名規約まとめ http://qiita.com/nvtomo1029/items/1147b8796af3d906c3a9

【参照】 モデルのアソシエーション設定のまとめ http://qiita.com/rana_kualu/items/1be3457e7b58950399b9