2012年5月8日火曜日

2012年05月08日 講義059日目

2012年05月08日
講義059日目
------------------------------1H------------------------------
★データベース移行
●xamppの「study」データベースを移行する

①mysql基礎の内容と同じようにユーザを作成しておく
・use mysql
・コピーしたcreate文を実行する
  ↓
CREATE TABLE `servers` (
  `Server_name` char(64) NOT NULL,
  `Host` char(64) NOT NULL,
  `Db` char(64) NOT NULL,
  `Username` char(64) NOT NULL,
  `Password` char(64) NOT NULL,
  `Port` int(4) DEFAULT NULL,
  `Socket` char(64) DEFAULT NULL,
  `Wrapper` char(64) NOT NULL,
  `Owner` char(64) NOT NULL,
  PRIMARY KEY (`Server_name`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 COMMENT='MySQL Foreign Servers table';

・show tables;
テーブルのリストが出てくるので、「servers」がいることを確認
上記後studyデータベースに触りたい場合は「use study」を打つ

②studyデータベースを作っておく
(study.sqlを消した人
・xamppを立ち上げて、mysqlサーバを立てておく
・mysqldump -u ユーザ名 -p study > C:\study.sql
ドライブのパスは任意)
中身はxamppからもってくる
③Windows側のstudy.sqlをFFFTPないしeclipseを使用してサーバに移動する
④mysqlコマンドでstudy.sqlをインポートする
例えば、ホームディレクトリにsutudy.sqlを移動したなら
cd
mysql -u ユーザ名 -p
use study
status
show tables
で確認する
------------------------------2H------------------------------
★symfony
●MVC
・M
ここを学習する
・V
テンプレートなど
・C
action.class.phpなど
●/configフォルダ
・.yml
設定ファイル、記述ルールがあるテキストファイル
・database.yml
symfonyのDB接続情報が欠かれる設定ファイル
#all:
#  propel:
#    class:          sfPropelDatabase
#    param:
#      dsn:          mysql://root@localhost/dbname
・#
コメントアウト
デフォルトでコメントアウトされてる
・インデント
インデントが重要な役割
インデントによって階層構造を表現してる
・書き換える
all:
  propel:
    class:          sfPropelDatabase
    param:
      dsn:          mysql://nishi:mis019@localhost/study
      encoding:     utf8
●propel.ini
☆O/R(オブジェクトリレーション)マッパー
他のテーブルとの連携がとれるDB
リレーショナルDBをロジックと結びつけられるマッピング(紐付け)技術をO/Rマッパーという
O/Rマッパの一つがpropel
O→Criteria
R→mysql
・propel
symfonyにおけるO/Rマッパ
・Criteria(Criteriaクラス)
symfonyにおける、O/Rマッパのオブジェクト側のロジック
propel.database.createUrl  = mysql://root@localhost/
propel.database.url        = mysql://root@localhost/sf.shonanbbs.com

propel.database.createUrl  = mysql://nishi:mis019@localhost/
propel.database.url        = mysql://nishi:mis019@localhost/study
●schema.yml
symfonyがデータベースを情報を扱うために、「schema.yml」が必要
schema.ymlを作成するsymfonyコマンド
・symfony propel-build-schema
schema.ymlにDBの内容を書き込むコマンド
・symfony propel-build-model
/lib/model内に
/lib/model/map
/lib/model/om

●lib/model/
symfony上で。MVCの「M」にあたる処理が格納されてるディレクトリ
------------------------------3H------------------------------
★symfony
●Criteriaを使って、データベース情報取得
・/apps/front/modules/default/actions/action.class.php
    public function executeIndex()
    {
        //Criteriaを使って、データベース情報取得
        $c = new Criteria();
        $c->add(MemberPeer::ID,3);
        print_r(MemberPeer::doSelectOne($c));
        //select * from member where id = "3" limit "1";と同じ
      ☆//doselect 条件に一致したレコード全てを配列で取得
      ☆//doselectOne:条件に一致したレコードのうち1つ目のみ取得


        return sfView::SUCCESS;
        //$this->forward('default', 'module');
    }
●エラーメッセージを表示するようにする
/web/index.php
define('SF_ENVIRONMENT', 'prod');
define('SF_DEBUG',       false);
↓書き換えてデバックモードに
define('SF_ENVIRONMENT', 'dev');
define('SF_DEBUG',       true);
運用する場合は元に戻す
●検索条件の操作
・$c->add(MemberPeer::ID,3, Criteria::EQUAL);
・$c->add(MemberPeer::ID,3, Criteria::GRATER_THAN);
より上
・$c->add(MemberPeer::ID,3, Criteria::GREATER_EQUAL);
以上
・$c->add(MemberPeer::ID,10, Criteria::LESS_THAN);
より下
・$c->add(MemberPeer::ID,10, Criteria::LESS_EQUAL);
以下
などがある
------------------------------4H------------------------------
★Criteriaを使って、データベース情報取得

    {
        //Criteriaを使って、データベース情報取得
        $c = new Criteria();
        $c->add(MemberPeer::ID,3, Criteria::GREATER_EQUAL);
        //Criteria::EQUALのみ省略可
        $member = MemberPeer::doSelectOne($c);
        //select * from member where id = "3" limit "1";と同じ
        //doselect 条件に一致したレコード全てを配列で取得
        //doselectOne:条件に一致したレコードのうち1つ目のみ取得

        echo $member->getMailaddress();
        //カラム名でメソッドが作られている

        return sfView::SUCCESS;
        //$this->forward('default', 'module');
    }
●Criteriaを使わずに静的にデータを取得
・$member = MemberPeer::retrieveByPk(1);
●テンプレート側で表示させる
オブジェクトごとテンプレートに渡す
●ln -s /usr/share/pear/data/symfony/web/sf ./sf
シンボリックリンクを作り、デバックモードでの見た目を良くするファイルを読む
------------------------------5H------------------------------
★Criteria
●複数のテーブルの連携
・外部キーの設定
schema.yml
reply
      required: true
      foreignTable: comment
      外部キーの対象を指定
      foreignReference: id
      対象のカラムを指定
・[nishi@localhost sf.shonanbbs.com]$ symfony propel-build-model
手動でschema.ymlを更新した内容をmodelに反映
・replyを追加する
        $rep = new Reply;
        $rep->setNickname("test");
        $rep->setContent("testtest");
        $rep->setCommentId(1);
        $rep->save();
ページを更新するたびにreplyが追加されていくロジック
・外部キーのテーブルの該当するもの全て
        $comment = CommentPeer::retrieveByPk(1);
        print_r($comment->getReplys());
・外部キーの元になっているレコード
        $reply = ReplyPeer::retrieveByPk(1);
        print_r($reply->getComment());
------------------------------6H------------------------------
★Criteria
●実際に掲示板で使用する情報を表示する
・action.class.php
$this->comments = CommentPeer::doSelect($c = new Criteria);
・indexSuccess.php
<?php foreach($comments as $comment):?>
<?php echo htmlspecialchars($comment->getNickname())?>さんの投稿<br>
<?php echo htmlspecialchars($comment->getContent())?>
<hr>
<?php endforeach;?>
●replyも表示してみる
・indexSuccess.php
<?php foreach($comments as $comment):?>
<?php echo htmlspecialchars($comment->getNickname())?>さんの投稿<br>
<?php echo htmlspecialchars($comment->getContent())?>
<br>
<?php foreach($comment->getReplys() as $reply):?>
  ------------<br>
  <?php echo htmlspecialchars($reply->getNickname())?>さんの投稿<br>
  <?php echo htmlspecialchars($reply->getContent())?><br>

<?php endforeach;?>
<hr>
<?php endforeach;?>
-----------------------------memo------------------------------

0 件のコメント:

コメントを投稿