(゚д゚)ノ コンバンワ!中の人ですYO!


さて本日も引き続きコードイグナイターのモデルについてやっていきませうか。


MVCのM、モデルは前にも言ったようにデータベースを扱う部分です。


で、コードイグナイターではデフォルト状態では必要最低限よろしくDBを扱うライブラリが読み込まれていません。

なので読み込むようにしなければ。あとDBの作成。


(´・ω・)っ旦~ お茶ドウゾ



さて上で言ったようにデフォ状態だとDBを呼んでくるライブラリないんで読み出ししてるはずなのに!!なんてことのないようにちゃんと設定&確認しましょう。


さてまずはテーブルを用意しませう。


使用するRDBですがMYSQLで。SQLiteでもいーんだろーけどコードイグナイターの便利な機能であるscaffoldというのが使えないらしいのでMYSQLで。scaffoldは跡で出てきます。多分(ぉぃ


でぁPHPMyAdminでDBとテーブルを作成しますぉ(´ω`)(XAMPP環境前提)


DB名:igniter_db

テーブル名:blogs

フィールフドの定義:

id int not null auto_increment

timestamp int not null

title varchar(255) not null

content text not null



PHP2009-19

(´ω`)これでおk。



で、データをいれとかなきゃ取ってきようがないのであらかじて挿入(卑猥だ)しておくわけですYO。

phpMyAdmin初だったり(いつもLINUXのコマンドラインメインorz)するのでインサート文すらどうやるのかわからないとかね…これはひどい。


で。とりあえず。作成終わった人は、↑のメニューにSQLってあるのでそのリンクをクリック。

初期段階ではselect文か何かがはいってるけど、そこにinsert文かけてやればおk。

入力後右下の『実行するボタン』を押せば、1 行挿入しました。 ( クエリの実行時間 0.0003 秒 )って出るかと。


PHP2009-20
↑こんなんなればおk。CUIに慣れてるとGUIで戸惑うから困る。


        _,,:-ー''" ̄ ̄ ̄ `ヽ、
     ,r'"           `ヽ.
 __,,::r'7" ::.              ヽ_
 ゙l  |  ::              ゙) 7
  | ヽ`l ::              /ノ )
 .| ヾミ,l _;;-==ェ;、   ,,,,,,,,,,,,,,,_ ヒ-彡|
  〉"l,_l "-ー:ェェヮ;::)  f';;_-ェェ-ニ ゙レr-{   / ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄
  | ヽ"::::''   ̄´.::;i,  i `'' ̄    r';' }   | 久々に困った

 . ゙N l ::.  ....:;イ;:'  l 、     ,l,フ ノ   | GUIメインの俺がCUIのLINUXに触れて
 . |_i"ヽ;:...:::/ ゙'''=-='''´`ヽ.  /i l"  < 戸惑ったのが昔の俺なんだよな
   .| ::゙l  ::´~===' '===''` ,il" .|'".    | XAMPPはGUIメインだから困る
    .{  ::| 、 :: `::=====::" , il   |     \________
   /ト、 :|. ゙l;:        ,i' ,l' ノト、
 / .| \ゝ、゙l;:      ,,/;;,ノ;r'" :| \
'"   |   `''-、`'ー--─'";;-'''"   ,|   \_

困る。

んで無事テーブルもできたしデータも登録し終えたので、ちゃちゃっと先進んでしませうかね。

データベース関連の設定は、『application』内の『config』にある『database.php』にある。

それを書き換えて、使えるようにしよう。

$db['default']['hostname'] = "localhost";
$db['default']['username'] = "root";
$db['default']['password'] = "";
$db['default']['database'] = "igniter_db";
$db['default']['dbdriver'] = "mysql";
$db['default']['dbprefix'] = "";
$db['default']['pconnect'] = TRUE;
$db['default']['db_debug'] = TRUE;
$db['default']['cache_on'] = FALSE;
$db['default']['cachedir'] = "";
$db['default']['char_set'] = "utf8";
$db['default']['dbcollat'] = "utf8_general_ci";

↑のように書き換えればOK。

hostname ホスト名。ローカル環境ならlocalhostでおk。

username ユーザー名。rootでおk。※username⇒root、パスワードなしのまま外部公開すると即死フラグ。ヤメトケ。

password アクセスパスワード。これも設定せずに外部はry 外部したいなら最低限username変更+pass設定しとけ

database 使用するDB名。

dbdriver 使用するDBの種類。今回はMYSQLなのでmysql。

pconnect DB鯖への接続の指定。SQLiteみたいなDBじゃないものの場合FALSEでおk

次にデータベースを使用できるようライブラリを読み込むよう設定する。

使用するライブラリ名は'database'。うむ。そのままだ。

『config』内の「autoload.php」を開き、$autoload['libraries'] = array();という部分を探し、次のように修正。


$autoload['libraries'] = array('database');

(゚∀゚)ちなみにこの$autoloadに配列で自分の使いたいライブラリを渡してやればライブラリが自動で読み込まれるようになります。でも、必要最低限というコードイグナイターの信条を貫くならば、DB以外のあんまし使わないライブラリはそのつど呼び出して使うようにしませう。でないと毎回たくさんのライブラリを読み込むことで遅くなるぉ。

ということで個別に読み込む場合は↓のようにすればおk


$this->load->library('ライブラリ名');


一般のフレームワークではこの後『モデルクラスの定義』という作業があるそうですが、コードイグナイターは華麗にスルーできます。すばらしい(ぇ

DBライブラリを読み込むことで、DB利用の為のオブジェクトがコントローラーから使えるからなのです。

   ハハ 華麗にスルー
   (゚ω゚) +
  /  \
((⊂ )  ノ\つ))
   (_⌒ヽ
   丶 ヘ |
εニ三 ノノ J

ということでモデルを用意せずともDBへアクセスできるという華麗なスルー環境(謎)を生かしてコントローラーの修正作業に移りましょう。

レコード一覧を取得するメソッドをコントローラーに用意。

例によってhelo.phpを改造してDB操作用にしてしまいませう。まさにエコ。(ぉ

helo.phpのindexメソッドを次のように修正してくだされー。



function index(){
$data = array('head_title'=>'index','content'=>'index');
$data['records'] = $this->db->get('blogs')->result_array();
$this->load->view('layout/mylayout',$data);
}

解説。


db->get(''テーブル名)->result_array();

↑はDBオブジェクト(ライブラリで読み込むようにしたのでコンストラクタで自動生成されるようになる)にgetというメソッドを介してテーブルへアクセスし、結果レコードをarray、つまり配列の形で取得しています。

getメソッドには、テーブル名を指定できますが、第ニ引数に値を設定することでLIMIT値を指定してやることができます。

また、第三引数はオフセット値の設定になります。つまり、次の3種類のパターンが可能ということです。


$変数 = $this->db->get('テーブル名');

$変数 = $this->db->get('テーブル名',LIMIT値);

$変数 = $this->db->get('テーブル名',LIMIT値,オフセット値);


これにより指定したテーブルのすべてのレコード、もしくは指定した一部のレコードを取り出すことができます。

最後にresult_array()の部分。

これは返されたレコードを連想配列の形にまとめたものをさらに配列にまとめたものです。

そうすることで、ビュー側で配列から順にレコードを取り出し、そこからそれぞれのフィールドの値を取り出して処理できます。

次に、ビューの作成。

『views』のindex.phpを↓のように書き換えませう。

デフォルトだと、


<h1>フォームの送信</h1>
<?=$msg; ?>
<form method="POST" action='/igniterapp/helo/index'>
<input type="text" name="text1" id="text1" size="60">
<input type="submit">
</form>

こうなっているので、それを↓のように$recordsを取り扱える様に書き換えませう。



<h1>Blog一覧</h1>
<p>テーブルの一覧です。</p>
<table>
<tr>
<th>ID</th>
<th>DATA</th>
<th>TITLE</th>

<th>CONTENT</th>
</tr>
<?php foreach ($records as $row): ?>
<?="<tr><td>{$row['id']}</td>" ?>
<?="<td>".date('Y/m/d'.$row['timestamp'])."</td>" ?>
<?="<td>{$row['title']}</td>" ?>
<?="<td>{$row['content']}</td></tr>" ?>
<?php endforeach; ?>
</table>


そしてCSSの修正。『igniterapp』フォルダの『css』フォルダのmylayout.cssの末尾に以下のように追記。

table{
background-color: #ffffff;
border-style: solid;
border-width: 1px;
border-color: #cccccc;
}

th{
background-color: #ddccdd;
border-style: solid;
border-width: 1px;
border-color: #cccccc;
}
td{
border-style: solid;
border-width: 1px;
border-color: #cccccc
}

修正が完了したら、レッツアクセス!


PHP2009-21
↑のように表示されればヽ( ^ω^)ノ サクセス!


PHP2009-22
↑PHPMyAdminで2行ほどレコードを追加。ちゃんと反映されているようだ。

以上がDBに登録されているデータを取ってきて表示するところまで。次はPHPでの登録ができるようにしよう。

『views』に新たに「add.php」を作成。内容は以下の通り。

add.php

<h1>Blog新規作成</h1>
<p>新しい記事を記述してください。</p>
<form method="POST" action="/igniterapp/helo/add">
<table>
<tr>
<th>TITLE</th>
<td><input type="text" name="title" size="60"></td>
</tr>
<tr>
<th>CONTENT</th>
<td><textarea name="content" cols="40" rows="3"></textarea></td>
</tr>
<tr>
<th></th>
<td><input type="submit"></td>
</tr>
</table>
</form>

タイトルとコンテンツの2つのみのフォーム。それであ次はコントローラーを修正しませう。


      g(^^^^_______,,,,,,;;59q
   ,,p6l゚゚    ゚l[゛`、]pvn .l[..l
  」"  4^゚゚゚゚゚゚゚_][  __,,,, .l[
  [゜  ,,g「゚p[{4,,  (" ^〉.\
  ],,,,gl゚"  .l[、.;][  .\^^^ .l
    ]!   ゚\ __,,xxx。  ]
    ][      [゚   ]l.  〈
   J!      〔、  .l[  ]
   |。_     .\-fff" ,,p
     ^"^9nxxxx./r==4"゛


ポーニョポーニョポニョ♪

      ,,,,,,pxxvxxg,,,,_
   ,,df(^"゛ g、    ^゚゚lq
  〈!   ,,dl゚゛   ./==x]t,,_
   ]l.__,,g[,,,,,,,,,,,,,,p4"   .l[^k
   ][「,,pr=t、`、  ____ .l[ ]
  g" ][_  ]!  ./「゚^゚9,,「n,,]
 4゚ .。、.\イ   ゚lk ,,g[  .l]
 ]l. 〈^゚ltn4,,,,_        ]
 ヨ。. ゚ll._   ゚"9n......./ff  ]
  ヨ、.\q,,,,____   ,,gf゛ gl゚
   ^9nnxxxxx゚゚゚゚゚゚゚゚゚゚xvtf"゛


魚の子 !


一時未知の電波が混線しましたことを深くお詫び致します。

では気を取り直して『controllers』のhelo.phpに新たにヘルパーを使うための修正、およにaddメソッドを次のように追加してください。

helo.php

<?php

class Helo extends Controller{

function Helo(){

parent::Controller();
$this->load->helper('url');

}

function index(){
$data = array('head_title'=>'index','content'=>'index');
$data['records'] = $this->db->get('blogs')->result_array();
$this->load->view('layout/mylayout',$data);
}

function add(){
if($this->input->post('title') != null){
$data = array(
'timestamp'=> time(),
'title'=> $this->input->post('title',true),
'content'=> $this->input->post('content',true)
);
$this->db->insert('blogs',$data);
redirect(base_url().'helo/index');
}else{
$data = array('head_title'=>'ADD BLOG','content'=>'add');
$this->load->view('layout/mylayout',$data);
}
}

}
?>

以上ができたらhttp://localhost/igniterapp/helo/add

へアクセス。


PHP2009-23

うまくいけば↑のようにフォームが表示されるので、実際に書き込んでみませう。

!!(´Д`;)なんとここで重大なミスをしていることが判明。

仕組みとしてはinsertでtitleとcontentが書き込まれた後にレコード一覧である/heloへ飛ばされるわけなのだが・・・

何度やってもおかしなURLにorz

リダイレクト先が、なんとhttp://localhost.igniterappi/helo/index

に。igniterappiって何だYO!

まさに

    /\___/ヽ   ヽ
   /    ::::::::::::::::\ つ
  . |  ,,-‐‐   ‐‐-、 .:::| わ
  |  、_(o)_,:  _(o)_, :::|ぁぁ
.   |    ::<      .::|あぁ
   \  /( [三] )ヽ ::/ああ
   /`ー‐--‐‐―´\ぁあ
状態。

で。どこがおかしかったのかというと『config』の「config.php」の次の行。


$config['base_url'] = "http://localhost.igniterappi/ ";

そりゃbaseURLがlocalhost.igniterappiになるわけだ。

    /\___/ヽ   ヽ
   /    ::::::::::::::::\ つ
  . |  ,,-‐‐   ‐‐-、 .:::| わ
  |  、_(o)_,:  _(o)_, :::|ぁぁ
.   |    ::<      .::|あぁ
   \  /( [三] )ヽ ::/ああ
   /`ー‐--‐‐―´\ぁあ

修正後、気を取り直して再度トライ。なんという…


PHP2009-24
入力後、ボタンを押す。


PHP2009-25
無事追加されたレコードが表示された。

ヽ( ^ω^)ノ サクセス!

さて解説。

レコードの追加は、$dbにある『insert』というメソッドで実行します。

$this->db->(テーブル,配列);

insertは、第一引数で指定したテーブルに、第二引数の配列を新たなレコードとして追加します。

ここでの処理をみていきませう。


$data = array(

'timestamp' => time(),

'title'=> $this->input->post('title',true),

'content'=> $this->post('content',true)

);

まず追加するレコードのデータを$dataから取得。post(**)部分ですな。postされたデータの中からtitleとcontentを取り出してそれぞれ配列のtitleとcontentに格納しているわけです。time()は時刻を取得してます。

次。


$this->insert('blogs',$data);の部分で、上記配列のデータをDBへ格納しています。

そして最後に


redirect(base_url().'helo/index');

で、ベースURLにhelo/indexをくっつけたURLへリダイレクトがかかるようになっている訳です。

ここでのベースURLは上のほうで書いた様に、『config』フォルダ内の「config.php」内で設定したベースURLです。

(´Д`;)さてとりあえずここまでで表示・登録まではできましたが@更新・削除等まだまだ項目は続きます。

(´Д`;)と…いうわけで…続き…ます…|||orzガクッ


        _,,:-ー''" ̄ ̄ ̄ `ヽ、
     ,r'"           `ヽ.
 __,,::r'7" ::.              ヽ_
 ゙l  |  ::              ゙) 7
  | ヽ`l ::              /ノ )
 .| ヾミ,l _;;-==ェ;、   ,,,,,,,,,,,,,,,_ ヒ-彡|
  〉"l,_l "-ー:ェェヮ;::)  f';;_-ェェ-ニ ゙レr-{   / ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄
  | ヽ"::::''   ̄´.::;i,  i `'' ̄    r';' }   | 

 . ゙N l ::.  ....:;イ;:'  l 、     ,l,フ ノ   | DB関連は項目が多すぎる
 . |_i"ヽ;:...:::/ ゙'''=-='''´`ヽ.  /i l"  < から困る
   .| ::゙l  ::´~===' '===''` ,il" .|'".    | 
    .{  ::| 、 :: `::=====::" , il   |     \________
   /ト、 :|. ゙l;:        ,i' ,l' ノト、
 / .| \ゝ、゙l;:      ,,/;;,ノ;r'" :| \
'"   |   `''-、`'ー--─'";;-'''"   ,|   \_

困る。


人気ブログランキングへ