(゚д゚)ノ今日も暑いぜカルピスうまい!!(中の人の地元の方言で『こんばんわ』の意(うそです(ぉ


こんばんわ、夏バテ気味の中の人です。


19時ごろに更新できなかったので0時に。(しょっぱなからかrorz


さてCodeigniterでの主な概念もあともうすこしとなりました。(つまりもうちょいで最低限の内容が終わる訳デスネ


というわけで今回はバリデーション。


バリデーションとぁ→DB登録時に登録するデータが正しい形式になっているかどうかをチェックする機能。

問題があれば『間違ってるぞ(゚Д゚#)ゴールァ!!』と表示するなり『再入力しろ(゚Д゚#)ゴールァ!!』と表示したりする処理のことですぉ。((゚Д゚#)ゴールァ!!はいらんけど…。


こうしたバリデーションの機能はCodeigniterでは『validation』というライブラリとして用意されてます。そのまんまやん。


(゚д゚)クワッ まぁ当然ライブラリなので読み込めば使えます。使う際にはロードしませう。


まぁ当然ライブラリ読み込みとしうことで前にも『自動で読むZE!!』という説明をした例のアレについても触れておきますか。


autoload.phpを開いて

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

とすれば毎回自動でバリデーションライブラリが呼ばれます。


また、必要に応じて

$this->load->library('validation');

とするのも一つの手です。


直接loadで呼ぶ場合には$autoloadへの設定は不要です。


           ___
          ./autoload\
          .| ^   ^  |
          | .>ノ(、_, )ヽ、.| <あまり私を呼ばない方がいい
         __! ! -=ニ=- ノ!___
    /´ ̄ ̄ .|\`ニニ´/    `ヽ
   {      .|__  ̄ ̄ヾ      }
   i;;',,,  r---イ     /|,、_,,  ,',;:',i
   .l;';',;,,  }  /;\     / ヽ / ,;,;;',;l
   .|;;',;,   } ./;;;,, \   / ;;;;;;ヽ ,,;;','i
   i;',,   / /;;,',';;  ノ--, ',',;;::',',゙i ,,';';i
   i;,';  /./,',',';;" /   \ ',',',;;,'i ,;',i
  /  / i 、  /    ヽ ',;::'、|  \
 ヽヽヽヾ丿  〈       ヽ''  {////
  ```` ト,   i        | 、 i´´´
      |',',;;  }        ! ',',;;i
      |,','、 /        ヽ',',','|
      !;;', /          !,',;,;'|



(´ω`;)でぁ実際にバリデーションつくっていきませうか。


まずはadd.phpを修正します。『views』フォルダ内の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>


↑を↓のように修正


<h1>Blog新規作成</h1>
<p>新しい記事を記述してください。</p>
<?=$this->load->library('validation') ?>
<?=$this->validation->error_string ?>

<form method="POST" action="/igniterapp/helo/add">
<table>
<tr>
<th>タイトル</th>
<td><input type="text" name="title" size="60"></td>
</tr>
<tr>
<th>コンテンツ</th>
<td><textarea name="content" cols="40" rows="3"></textarea></td>
</tr>
<tr>
<th></th>
<td><input type="submit"></td>
</tr>
</table>
</form>


まぁ<?=$this->validation->error_string ?>を追加して項目を日本語にしただけですがね。

(゚д゚)<?=$this->validation->error_string ?>の部分はエラーが生じた際にフォーム手前にエラーメッセージを出力する処理になります。

$validationはvalidetionライブラリで用意されたバリデーション処理を行うオブジェクトです。

今回はその中でもエラー出力処理を司るerror_stringというメンバー変数を出力してます。
メンバ変数ってなんぞ??って…言う人は華麗にスルー…どうしようかな(ぉ

validationライブラリの中で宣言されて使われている変数とでも考えておkなんじゃ?(違う場合は突っ込んでorz

とりあえずこのクラス変数にはエラーが発生した際に「こんなエラーがありますYO!」というメッセージが格納されます。
なのでそれを出力すればどこがおかしいのかを出力することができるのですYO!

でぁ次にコントローラーのaddメソッドの修正作業へ移りませう。


helo.php

function add

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);
}
}

↑を修正し、フォームの内容をバリデーションでチェックするようにしませう。


function add(){

$rules = array('title'=>'required','content'=>'required');
$this->validation->set_rules($rules);
if($this->validation->run()){
$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);
}
}
↑修正。バリデーション関連の行が二行追加された後にif文の内容も修正。
そして忘れちゃいけないライブラリ読み込み。今回の例では自動読みではなくわざわざ個別で呼ぶことにしてみませう。

function Helo(){
parent::Controller();
$this->load->helper('url');
$this->load->scaffolding('blogs');
$this->load->library('validation');
}

というわけでコンストラクタでちゃんとバリデーションのライブラリを読み読み。
autoload設定していない例での肝はビュー、コントローラーの双方でライブラリを読む行
$this->load->library('validation');を挿入しませう。
ビュー、コントローラーのどちらか片方のライブラリ読み込み行が欠けても動かないです。注意。

では実際に見てみましょう。
http://localhost/igniterapp/helo/add へアクセスヽ( ^ω^)ノ サクセス!



PHP2009-44


そして実際に何も入力せずにクエリ送信!ぽちっとな。



PHP2009-45



見事に怒られます。
            ___
          ./    \
          .| ^   ^ |
          | .>ノ(、_, )ヽ、.|
         __! ! -=ニ=- ノ!_
       .| ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄|
   ,. -‐ '|                      |
  / :::::::::::|    あまり              |__
  / :::::::::::::|                   rニ-─`、
. / : :::::::::::::|             私を  `┬─‐ .j
〈:::::::::,-─┴-、                  |二ニ イ
. | ::/ .-─┬⊃                 |`iー"|
.レ ヘ.  .ニニ|_____________|rー''"|
〈 :::::\_ノ::::::::::::::::::::::::::::::::::::::::::::::::::::::: |:::::::: /::::::::::::|

              _
                 /  \
           /   ノ(  \
           | ^ ⌒ ^ |   
           | .>ノ(、_, )ヽ、.|    <怒らせない方がいい
             ! ! -=ニ=- ノ!
   | ̄ ̄ ̄〉,ァ''" \`ニニ´/゙ア´ ̄`/ ̄ ̄ ̄ ̄|
   |     `r´、、__ l ! ィ彡,ャァ'" ,,..,,、\     |
 ,-┴-、 あ〈.,, ``''ヽ,,,  ''"´   ゙''ヾミ,r/.く     |__
/ .-┬⊃  <    ,;,, ;;; ,,;;       ,fr::<,   rニ-─`、
! ;;ニ|    /    ';;;;;;;;;;;'      ,!;V:.:ノ     `┬─‐ j
\_|    <    ':;;;;;:'      ,;;/;;:.:/:〈 私を   |二ニ ノ
   |    <    人__,,,;;;;;ノ/N/:/:.<     |`ー"
   |__/:ト-―テ" ⌒ `ヾj ::;;;;}/:.:.:∠____|
        l   ' -:十:‐' ゙l,  〃:.:.:/:.リ      ビリィィィ
        l   t,,__,災_,ノl  f:.リ:.:./:.j


(((゚Д゚;)))


英語でテラ怒られますが、このままでは何言ってるかわかんねーよ!って人。(゚д゚)大丈夫!日本語化できますYO!

日本語化は後でとりあげます。


解説いくぉー。⊂二二二( ^ω^)二⊃ブーン


$rules = array('title'=>'required','content'=>'required');
この部分はルールの設定部分。どの項目に対してどのようなルールを適用するかを指定します。形式は連想配列。


☆ミキラッなバリデーションルール一覧
required -値が空でないか調べます。空だと(゚Д゚#)ゴールァ!!と怒ります。


min_length -最低文字数を指定します。形式はmin_length[文字数]という形式で記述します。最低以下だと(゚Д゚#)ゴールァ!!と怒ります。


max_length -最大文字数を指定します。形式はmax_length[文字数]という形式で記述します。最大を超えると(゚Д゚#)ゴールァ!!と怒ります。


alpha -半角アルファベットの入力かどうか調べます。それ以外だと(゚ω゚)オコトワリされます。

alpha_numeric -半角英数字の入力かどうかを調べます。それ以外だと(゚ω゚)オコトワリされます。

numeric -数値かどうか調べます。それ以外だと(゚ω゚)オコトワリされます。

integer -整数かどうか調べます。それ以外だと(゚ω゚)オコトワリされます。

valid_email -電子メールアドレスの形式かどうか調べます。それ以外だと(゚ω゚)オコトワリされます。

valid_ip -正しいIPアドレスの形式かどうかを調べます。それ以外だと(゚ω゚)オコトワリされます。


次。ルールの設定の適用。
$this->validation->set_rules($rules);
この行は実際に設定したルールをオブジェクトへ適用する部分です。
set_ruleメソッドで先ほど作成したルールの配列を引数に渡します。ここまででバリデーションのルールの設定は完了です。

あとは実際に設定されたバリデーションのルールに基づいてバリデーションが行われればOKです。

if($this->validation->run())以下で実際にバリデーションが発動。
このrun()が実際にバリデーションを行い、もし真ならifの処理を行い、偽ならエラー処理(エラー出力処理)を実行します。
偽ならばチェックで失敗しているので再度フォームを出力します。
その際に$validation->error_stringにエラー内容が渡され、フォーム上部に実際にエラーが出力されるわけです。



PHP2009-45

                  ___
                 ./    \
                 .| ^   ^ |
                 | .>ノ(、_, )ヽ、.| <とうとう私を怒らせてしまったな
                __! ! -=ニ=- ノ!__
         ,,.ィ'''フ''''=、r'"~ ヽ`ニニ´/i,, `ヽr''"`ヽ、ヽ、
       ,r'"´ ノ"    )=、 ̄ ̄,,..ィ'"´i       ヽ、
       (       ノ  ´ ̄ `Y"´            i
         )     __,,..         レ      _,,,,、       j、、
      r''ヽ. ,.ィ'''i"        J   ,,.ィ'"~  `'ヲ''ー-、ノ、 ヽ、
     / ,,.イ')'"  人        ,,l、        ノt   ) `ヽヽ
    /   /   / `ゝ、       人       ,,イ  jt、 ヽ    i
   f ,   ノ   /、   `ー--;::-ニ"_,ゝ=---‐''"    ノ ヽ、 ヽ  t、、
   )'  f   ノ ヽ、 r  、 f"   `i´ ̄` Y  `ヽ /   ゝ-,ヲ'''   )
.   ( ,.ィ''ーr"~    ヽj  ミi      !    j'   | /       ,r"    ft
   ノ、,ノ   ヽ,     `i  、〉、.__,人,___,..イ、,i" j''       (   ,ノ j
  ( t、    l      i  ヽf     Y    ,j,.  ,/      ) ,.イ´ ノ
  fヽ ヽ、   l      l ヽ、    .|   ノ ,. /     ,.イ '"ノ   ノ
  t i   l、.  t      l  、j`ー‐‐'`ー="レ' j'     // / ,/
  ヽ、 i、   i      l  ヽ  -ニ-  ノ  l     /,,,,ノ ,ィ/
    ヽ、`i  `i、     l   `i     /  ,l    /-,=、ヽv
′   ヽ ヽ、 'i,     人  ヽ    /   ノヽ   ノ''"Y,..ト-、
      `i、,,..=,i、   / ヽ、       /=ィ''i'i''j"  .`=(i-/、
       ヽ ,f`i-、   /   ヽ      /.`ー=''''"t.___  (,,ノ=、
       r-l =f,,ノゝ-''`=''フ  i、:' " ゛ ` ,i' :.    .l、  `ー=''=t_,i



(゚Д゚;)!!

GYAAAAAAAAA!!!




             -‐ '´ ̄ ̄`ヽ、
             / /" `ヽ ヽ  \
         //, '/     ヽハ  、 ヽ
         〃 {_{ノ    `ヽリ| l │ i|
         レ!小l●    ● 从 |、i|
          ヽ|l⊃ 、_,、_, ⊂⊃ |ノ│
        /⌒ヽ__|ヘ   ゝ._)   j /⌒i ! にょろーん
      \ /:::::| l>,、 __, イァ/  /│ 中の人が再生するまで代打するにょろ!
.        /:::::/| | ヾ:::|三/::{ヘ、__∧ |
       `ヽ< | |  ヾ∨:::/ヾ:::彡' |



             -‐ '´ ̄ ̄`ヽ、
             / /" `ヽ ヽ  \
         //, '/     ヽハ  、 ヽ
         〃 {_{ノ    `ヽリ| l │ i|
         レ!小l●    ● 从 |、i|
          ヽ|l⊃ 、_,、_, ⊂⊃ |ノ│   中の人が言ってたように
        /⌒ヽ__|ヘ   ゝ._)   j /⌒i !  エラーメッセージは
      \ /:::::| l>,、 __, イァ/  /│ デフォルトだと英語のみにょろ。
.        /:::::/| | ヾ:::|三/::{ヘ、__∧ |
       `ヽ< | |  ヾ∨:::/ヾ:::彡' |



             -‐ '´ ̄ ̄`ヽ、
             / /" `ヽ ヽ  \
         //, '/     ヽハ  、 ヽ  GUY人さんなら問題ないだろうけど
         〃 {_{       リ| l.│ i|  日本人には問題にょろ
         レ!小lノ    `ヽ 从 |、i|  
          ヽ|l ●   ●  | .|ノ│ 
            |ヘ⊃ 、_,、_,⊂⊃j  | , |.l
          | /⌒l,、 __, イァト |/ | 
.          | /  /::|三/:://  ヽ |
          | |  l ヾ∨:::/ ヒ::::彡, |



               \  __  /
               _ (m) _ピコーン
                  |ミ|
               /  .`´  \
             -‐ '´ ̄ ̄`ヽ、
             / /" `ヽ ヽ  \
         //, '/     ヽハ  、 ヽ
         〃 {_{ノ    `ヽリ| l │ i| でもCodeigniterには
         レ!小l●    ● 从 |、i|  ちゃんとエラーメッセージを
          ヽ|l⊃ 、_,、_, ⊂⊃ |ノ│ 日本語化する方法があるにょろ
        /⌒ヽ__|ヘ   ゝ._)   j /⌒i !
      \ /:::::| l>,、 __, イァ/  /│
.        /:::::/| | ヾ:::|三/::{ヘ、__∧ |
       `ヽ< | |  ヾ∨:::/ヾ:::彡' |



             -‐ '´ ̄ ̄`ヽ、
         。   / /" `ヽ ヽ  \
      o   //, '/     ヽハ  、 ヽ
       ゚  〃 {_{⌒    ⌒リ| l │ i|
         レ!小l三    三 从 |、i|
          ヽ|l/// 、_,、_, ///  |ノ│  それを今から解説するにょろ
        /⌒ヽ__|ヘ   ゝ._)   j /⌒i !
      \ /:::::| l>,、 __, イァ/  /│
.        /:::::/| | ヾ:::|三/::{ヘ、__∧ |
       `ヽ< | |  ヾ∨:::/ヾ:::彡' |



          , '´ ̄ ̄` ー-、
        /   〃" `ヽ、 \
       / /  ハ/     \ハヘ
       |i │ l |リ⌒     ⌒}_}ハ
        |i | 从 ●    ● l小N ではコントローラーのaddメソッド
       |i (|ミ ⊂⊃ 、_,、_, ⊂li|ノ   ミ を以下のように修正するにょろ
       | i⌒ヽ j   (_.ノ   ノi|__/⌒)
       | ヽ  ヽx>、 __, イl |::::ヽ/.
       | ∧ 人l||l,三|:::::/l| |l||l 从
       |  l ( ⌒ ):::V::/ | ( ⌒ )


修正前helo.php add↓

function add(){

$rules = array('title'=>'required','content'=>'required');
$this->validation->set_rules($rules);
if($this->validation->run()){
$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);
}
}


修正後helo.php add↓
function add(){

$rules = array('title'=>'required','content'=>'required');
$this->validation->set_rules($rules);

$this->validation->set_message('required',"%s は必須項目です");
$this->validation->set_error_delimiters(
'<div class="error">[注意]','</div>');


if($this->validation->run()){
$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);
}
}


             -‐ '´ ̄ ̄`ヽ、
             / /" `ヽ ヽ  \
         //, '/     ヽハ  、 ヽ
         〃 {_{ノ    `ヽリ| l │ i| ちなみにmylayout.css
         レ!小l●    ● 从 |、i|  にも追記を。
          ヽ|l⊃ 、_,、_, ⊂⊃ |ノ│   にょろーん
        /⌒ヽ__|ヘ   ゝ._)   j /⌒i !
      \ /:::::| l>,、 __, イァ/  /│
.        /:::::/| | ヾ:::|三/::{ヘ、__∧ |
       `ヽ< | |  ヾ∨:::/ヾ:::彡' |


mylayout.css
.error{
color: #FF0000;
text-size: 10px;
text-weight: bold;
}



          , '´ ̄ ̄` ー-、
        /   〃" `ヽ、 \
       / /  ハ/     \ハヘ
       |i │ l |リ⌒     ⌒}_}ハ
        |i | 从 ●    ● l小N 修正が終わったら
       |i (|ミ ⊂⊃ 、_,、_, ⊂li|ノ   ミhttp://localhost/igniterapp/helo/add
       | i⌒ヽ j   (_.ノ   ノi|__/⌒) へレッツアクセス!!
       | ヽ  ヽx>、 __, イl |::::ヽ/.
       | ∧ 人l||l,三|:::::/l| |l||l 从
       |  l ( ⌒ ):::V::/ | ( ⌒ )




PHP2009-46
さっきと同じにょろ。




PHP2009-47

日本語になっているにょろ!


(゚д゚)クワッ 

はい、というわけで説明。


$this->validation->set_message('required',"%s は必須項目です。");部分。

このset_messageは引数にバリデーション名と表示メッセージをそれぞれ指定して実行します。


これにより第一引数で指定したバリデーションでエラーが発生すると第二引数のメッセージが表示されます。



この第二引数「%s は必須項目です」は%sという値が埋め込まれていますがこれは項目名に置き換わるモノで。

つまりエラー時には%s→エラーが起きた項目名になるわけです。


ただし、置き換わる項目名はformタグのname=で書いたものが使われるのでここではtitleとかcontent投下になってしまうわけす。


これでメッセージの表示は日本語化できたわけですがひと手間かけてメッセージを赤くします。


$this->validation->set_error_delimiters('<div class="error">[注意]'.'</div>');

ここで実行しているset_error_delimitersは、各エラーメッセージの前後に付加するテキストを指定するものです。


<div class="error">[注意]+エラーメッセージ+</div>となるわけです。



さてバリデーションできるようになったのはいいですが、できればエラーと共に直前の入力状態が再現されたフォームを表示して再入力を求めるほうがイイ!!ですよねー。

というわけでそういうモノに作り変えませう。

validationオブジェクトを使うことで実現できます。


まずaddメソッドを修正しませう。『controller』「helo.php」


function add(){

$rules = array('title'=>'required','content'=>'required');
$this->validation->set_rules($rules);

$this->validation->set_message('required',"%s は必須項目です");
$this->validation->set_error_delimiters(
'<div class="error">[注意]','</div>');


if($this->validation->run()){
$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);
}
}

を↓のように修正。

function add(){

$rules = array('title'=>'required','content'=>'required');
$this->validation->set_rules($rules);
$fields = array('title'=>'タイトル','content'=>'コンテンツ');
$this->validation->set_fields($fields);
$this->validation->set_message('required',"%s は必須項目です");
$this->validation->set_error_delimiters(
'<div class="error">[注意]','</div>');


if($this->validation->run()){
$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);
}

}


$fields = array('title'=>'タイトル','content'=>'コンテンツ');

$this->validation->set_fields($fields);

で各フィールド名を日本語のフィールド名で名づけてます。これによりエラー時に表示される項目名が日本語になります。


つぎにビュー部分の修正。「add.php」をしゅうせいしませう。

<h1>Blog新規作成</h1>
<p>新しい記事を記述してください。</p>
<?=$this->load->library('validation') ?>
<?=$this->validation->error_string ?>
<form method="POST" action="/igniterapp/helo/add">
<table>
<tr>
<th>タイトル</th>
<td><input type="text" name="title" size="60"></td>
</tr>
<tr>
<th>コンテンツ</th>
<td><textarea name="content" cols="40" rows="3"></textarea></td>
</tr>
<tr>
<th></th>
<td><input type="submit"></td>
</tr>
</table>
</form>


↑を↓のように修正。

<h1>Blog新規作成</h1>
<p>新しい記事を記述してください。</p>

<?=$this->load->library('validation') ?>
<?=$this->validation->error_string ?>
<form method="POST" action="/igniterapp/helo/add">
<table>
<tr>
<th>タイトル</th>
<td><input type="text" name="title" size="60" value="<?=$this->validation->title ?>"></td>
</tr>
<tr>
<th>コンテンツ</th>
<td><textarea name="content" cols="40" rows="3"><?=$this->validation->content ?></textarea></td>
</tr>
<tr>
<th></th>
<td><input type="submit"></td>
</tr>
</table>
</form>



(゚д゚)こうすることでフォームへ前回入力されたデータが保管されたバリデーション変数が呼び出され、前科の入力内容が保持された状態でエラーメッセージを表示するようになります。


PHP2009-46
試しにこんてんつだけ入力。




PHP2009-48

(゚д゚)そしてクエリ押下。



PHP2009-49
タイトルねぇYO!(゚Д゚#)ゴールァ!!と怒られる。



PHP2009-50
今度は何も入力せずにクエリ送信。



PHP2009-51
両方ねぇYO!って怒られますた。


さーてエラーの日本語化も入力した内容の維持も終わり、とりあえずバリデーション編終了です。


(゚Д゚;)なんとか0時前には間に合った…。


ラスト『ヘルパー』編。次回でCodeigniterはひとまず完結となります。(´Д`;)思ったよりも時間かかったorz


(゚д゚)まぁ『フレームワークって大体こんな感じ』ってのを体感していただければそれでおkな気もするのでまぁよしとしませうか。CakePHPかそれともその前に軽くsmartyか…(´Д`;)近いうちに決めておきますorz


( ゚ω゚)ノシ TO BE CONTINUED!!

人気ブログランキングへ

(゚д゚)こんばんわ、中の人デスヨ。


量的にも中途半端だったので分けてみた。(ぉ


むしろAAを自重しるといわれそうだがAAなくしてこのブログは成り立たないので却下。(なんというry


  _n
 ( l    ハ,,ハ
  \ \ ( ゚ω゚ ) +
   ヽ___ ̄ ̄  )   AA自重お断りします
     /    /

さてcodeigniterには便利なDBツールがある。

前までのくだりでわかったように、いちいちDBへ接続してupdateを掛けたりdeleteしたりせずとも、ツールを使うことでインサート、デリート、アップロードが自由にできるようになる。


そのツールこそ"scaffold"だ。(ようやく出てきた。つかCakePHPにもsymfonyでも使える様。


DBの利用目的としては「DBによる顧客情報の管理」から『フォーム部分での質問集』(たとえが滅茶苦茶デスガキニシナイ)、変化したりしなかったりと様々デスネ。


現に社内で使う為のツールにユーザー登録機能をつける意義はあんましないデスヨネー(社員が日雇いなら需要はあるかもですが…。)あんまなければ社員が入社or退社時に直接社員テーブルにインサート、デリート文を一回実行すればいいだけだし。


ということで話はそれましたが、DBには全部の機能を必要とする場合もあれば、データの閲覧だけできればいい場合もあります。で。scaffoldは、すべての機能をオールインワンで提供してくれる便利なツールです。

なので単純にデータを確認するだけ というならscaffoldを使用して確認すれば良く、また、その利用も簡単です。


つまるところDBの臨時の管理機能といったところでしょうか。


そんであ実際に使う為の操作を。


まずは設定ファイルを修正。


『aplication』フォルダ内の『config』フォルダを開き、その中から「routes.php」を見つけ出し編集しやう。

そして次の行を検索。


$route['scaffolding_trigger'] = "";


これがscaffoldを使う為のトリガーだ。

これを編集しよう。


$route['scaffolding_trigger'] = "myscaffold";

myscaffoldへ編集してみた。これでファイルを保存すれば準備おk。

この$route['scaffolding_trigger']="myscaffold";の値は、scaffoldの機能にアクセスするためのアドレス指定に使われるものです。例えば、Heloクラスで使うならば、helo/myscaffoldというアドレスにアクセスすると、scaffoldによるページにアクセスできるようになります。


続いてコントローラーの修正をしませう。

heloコントローラーのコンストラクタ(Heloメソッド)内に次の記述を追加しませう。


$this->load->scaffolding('blogs');

このscaffoldingメソッドは、引数に指定したテーブルにアクセスするためのscaffoldをロードする働きをします。

scaffoldを利用するための記述は以上で終わりです。


メソッドで思い出したけど、昔めそ…ゲフンゲフン!!

               ヽ l / /  r  ー  -- 、
                 __ヾWi"i,i'.        i
       /,. -ー ,,.;;;;;'::"´ ,.> ,-  /   ‐┬‐    |
       //  .,,;;';;;;:::: : :    ̄^ハiレ'.    ‐┼‐    |
     / /  /;;;:;( ̄ ̄ ヽ     |...    └‐   |
      i  '、  ;';;;;;;:::  ̄`'' "     __i     ‐┼‐   i
  i.  ':、  V;;;;;::::.. ,;;;;、      (  l      ‐┼‐   ',
  ヽ、    i;;;;;;;;;;;;::`'''゙       ヽ l.      -,    ;'
         l;;;;:;;;::::: :: :        ,;;;;、`|     ‐┴   .i
        l;:::::::: ::       `'''゙ l    ,―、   ;'
.        l:::::  ,ゝ-ヘ         〈      r"   / ノ ノ
        ';:::;/::::::;:、-゙ー'      l.      o   /
,. ‐- 、...,,_ ,,.;V:::::/ヾ::.      -=',_       /:;ヽ,
     ';;;:::::::::;':::/;:::::....   .. ..     ````"''ナ'::::::i:::::':、
::...    ;;;::::::::i:::/';`ヾ、::::::::::::::::::::::::::........ ,.. -'":::::::::::::l::::::::::':、
、::..    ,;;:::::;;ノ:/ ',::::::ヾ:``''''――::::'''''";;;;;;;;;;;:::ノ::::::::'::::::::::::::
..'、::.   --=';:::ノ  ',:::::::::\::::'ヾ::::::::::`` ̄ ̄::::::::;;;:::::::::::::::::::::
 ヾ;:;;:...::.  i;;"    ';:::::::::::::\::::ヾ、::::::::::::::::::::::::;;;;:::::::::::::::::::::::
  〉;;::.   i,      ';:::::';::::::::::ヾ:::::::'::::、:::::::::::::::::::::::::::::::::::::::::::


であ実際に使って見ませう。

とりあえずhttp://localhost/igniterapp/helo/myscaffold へアクセスヽ( ^ω^)ノ サクセス!



PHP2009-36
↑これが管理画面。


PHP2009-37
Editリンク押下時


PHP2009-38
編集実行後。


このように、scaffoldでは「一覧表示」「新規作成」「レコード更新」「削除」といった基本機能が全部搭載されています。便利。


テスト用にレコードを入れるというときにも使えます。まぁあくまでレコードのツールなんでXAMPPな人はDBとかテーブルは別途PHPMyAdminで作る必要があります。


使用後は$this->load->scaffolding('blogs');をコメントアウトすればOK。

ま、あくまで臨時のDB管理機能ということで。


次はモデルの説明に移りますYO

      ノ)
  ハ,,ハ_ / ノ
 ( ゚ω゚)' ./   セクシーにお断りします
 ( -、   ~⌒`つ


   。 。
  / / ポーン!
( Д )

  * *   * *
 * * * * * *
  * *    * *
      パーン!
( Д )


とりあえずモデルがなくともDBへの接続ができてしまうわけですが、あまりにいろいろなアクセス処理が必要になると、その都度いちいちアクセスのためのための処理を書いていてはアレすぎます。


なのでDB処理もまとめてしまい、使う毎に呼び出すようにすればイイのですぉ。


というわけでモデルの核心部分、というかモデルをちゃんと扱っていきますYO


DBにアクセスして必要な処理を行うメソッドをモデルクラスに用意しておき、それをコントローラーから使用するという方法で。


でぁモデルの作成からいきまっしょい


モデルは『application』フォルダの『models』フォルダの中に用意します。名前はblogs_model.phpで。


blogs_model.php

<?php

class Blogs_model extends Model{

function Blogs_model(){
parent::Model();

}
}
?>


これは…と思うかも知れませんがコントローラーの時と一緒です。ファイル名は全部小文字、ファイル名と同じで

頭文字のみ大文字のクラス名、クラス名と同じメソッドでコンストラクタ作成。手順はまったく同じ。


モデルクラスの場合はModelクラスを継承して作ります。ちなみに継承とかオブジェクト指向関連はJava関連書物か何かで解説されているっぽいので興味(もしくはシラネって人)ある人はネットなり書籍なりで調べていただければ。ちなみに中の人は概念はわかったがよく理解していない(要はわかっていないorz)。

フレームワーク勉強し始めてようやくちょいとわかってきた…のかな(´Д`;)とりあえず実際にモノ作らなきゃ理解できない概念の様ですorz


とりあえずモデルの基本ともいええうコンストラクタ部分は生成したので実際にメソッドを追記して機能を追加していきませう。

コントローラーのindexメソッドのほうで全レコードを取得する際に$db->getを用いますが、これをget_allrecordsというメソッドにまとめます。


モデルでまとめ用のメソッドget_allrecordsを追加します。


blogs_model.php

function get_allrecords()
{
$query = $this->db->get('blogs');
return $query->result_array();
}

全部のレコードを取得するメソッドの作成完了。

続いてコントローラーのほうのindexメソッドの修正にかかりませう。

『controllers』の「helo.php」に次のメソッドを編集(゚д゚)クワッ

(´Д`;)だいぶごちゃごちゃしてきたな…helo.phpでもまだ甘いか。


helo.php

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

これを

function index(){
$data = array('head_title'=>'index','content'=>'index');
$this->load->model('Blogs_model','blogs');
$data['records'] = $this->blogs->get_allrecords();
$this->load->view('layout/mylayout',$data);
}
へ書き換え。赤字部分がかわってますぇ。


コントローラーでのモデル使用は次の通り。

モデルのロード。


$this->load->model('モデルクラス','名前');


第一引数で使用するモデルクラス名、第二引数でこのコントローラーに用意するときの変数名を指定します。

例だとblogsという変数名。


実際に$this->blogs->allrecords()で、モデルのblogsクラスのallrecordsメソッドを呼んでいます。


これにより先に設定したモデルでの全クエリー取得が発動するわけです。


           , -─- 、  , -‐- 、
        ,, -'"     `V     `‐、
      /                 \
    ./                       \
    /                      ヽ
   ./  /                   l  ヽ
  /  / /  / ./ /          l   | .l .lヽ
  |  l. l  /  / / ./ .l    |  |  l  / /  l l.〉   ∧∧∧∧∧∧∧∧∧∧∧∧
   l、 | |  l  / / ./ ./   |.  l  | ./ ./ ./ | |./   <                 >
    l、| | l // ///|   l  / / //// / /   .< 罠カード発動!!!!  .>
    l、l | /l///_/ l  / //_|/_∠| / | /     .<                 >
    /⌒ヽ | \ `ー' ゝl  // `ー' /|/⌒v'     < ずっと全クエリ取得!   >
    | l⌒l l|    ̄ ̄"//|〉 ̄ ̄ ̄  .|/^_l.l       <                 >
    ヽゝ(ー| /|   ´ \|       ll ),l'ノ         ∨∨∨∨∨∨∨∨∨∨∨∨
     lヽ_ /  |   ┌───7   /._/
     .l/   |     l ̄ ̄ ̄/    / /   ,ノ!
    /       |..   V´ ̄∨   ./ /,.-‐'" .|
    ./   (;;)   |\   `ー‐'´  / /       |
    |     _|_\       /| ./      |
   (|   ,.-‐'"    | \__/  .|/    _,.-─;
   |/    .(;;) |─────┤ _,.-‐'":::::::::/
   ̄         |::::::::::::::::::::::::::::::|^l::::::::::::::::::/

ずっと俺のターン!!

表示できん!!とおもたら


function get_allrecords()
{
$query = $this->db->get('blogs');
return $query->result_array();
}

クラス内に入れ忘れてたorz(}の位置が…orz)

      `` ‐- 、l'          |  ||| |       l,:-‐'"
                       |. ||| .|
                 ,へ.     |. |||  |    ./゙l     ./
``‐ 、_       .iヽ  .l   \   |    |   /  .| /l/
、   ` ‐、    .|. \l    \  |     .| ./    |/  .|〃〃
. ゙ヽ、   `゙‐;l\|.  │      \|    .l/      .| ||| |〃./
\  ゙ヽ、  ミ l.  | ||| .| |||     ヽ.   /     ||| |. ||| .l/
  \   ゙ヽ、.l ||| | ||| .| |||  |ミヾ丶 ヽ /,,",- '"´| . ||| . l. ||| .l
    \,  `| ||| | ||| .| |||  |:: `゙`‐-、V〃" :::::::::l . ||| . l.   l
""´~ ̄   _| |||..|   ./.   │::          :::::l、   l.   l__   .∧∧∧∧∧∧∧∧∧∧
,,.: -‐''"´ ̄   ./  /   ./::          ::::::::l、  .|____ .<                >
  三三三  /  /   . ∠_::          ::::::::::::::l、         < 罰ゲーム!!      >
────/ヽ/   | ||| |ー-`ニ::、、_:::::::::::::::::::::::::::::_;;ニ-\____  <               >
゙ヽ、   //ヽ| ||| | ||| |、 ○ ノ  i`‐、::::::::::,:‐''/ !、○  ノ /::;l/‐゙iヽ < ──挿入位置ずれ──>
  ゙ヽ. l l/ゝ| ||| |...||| | `‐-‐'´   l::  :::  /   `ー-'" /::::l/ / l. ) <                >
.    \\ー,| ||| |.   `iヽ--──-  :::::::::::::::::ー─---一丶i‐-,"///<                >
.      \\|   | .   |::      ::::::::: |〉:::::::::::::: :::::::::::::::;l ),ノ/   <   Fatal error: !  >
、 ̄ ̄ ̄ ̄   |   |   |::                 :::::::;l-‐'´ ̄ ̄ <                 >
. `` ‐ 、      l   |.   |:       ,.-─‐-、      :::;l         ∨∨∨∨∨∨∨∨∨∨
     `` ‐、  l  ||   |        i' ̄ ̄ ゙̄i     ::::;!
        ゙ヽl.  |.l.  |、       l,.-─‐-、l     ./   .,. ‐'´
           l. |、!. | `‐:、      ヽ、_,,ノ   ,.‐"   , ‐'´
        .i--─l.│.l . |、. |`゙ ‐、       .,.‐´|  ,‐'"─‐--i
         | |   l | . l. | `‐,|.    ``ヽ、.__,. ‐'´  .|,/     | |
         .|(l   ∥ . l.|  l`‐- 、____ _,, -‐"!      |)|
         _| |   |  .l| (;)  | ____l´   (:)       | |
  ,ヘ,. -‐''"´ l |       |../l.   | !___    _,|`ヽ...   l |
''"´       .|(l.    ,:-‐(..(`゙‐ 、|____l_,, -‐"/‐l )-;.  |)|


GYAAAAAAAAAA!!!!!!!!!




PHP2009-39
とりあえず}の位置修正したら普通に表示されたorz

(´・ω・)これまでのDBアクセスは$dbにある専用のメソッドを使って結果を受け取るというものでした。


$dbには一通りの機能があるようですが、万能ではない。とのこと。

ぶっちゃけコードイグナイターの最低限の法則(勝手に名づけた(ぉぃ)に従って全部が全部あるわけじゃないから


自分が足りないと思ったらその都度足していけばいいわけで。

ということで実際に直でSQLクエリーを発行するぜ!という手順の解説?


とりあえず例として簡単な検索機能。陳腐とか言わないお約束。


  ∧ ガラッ ∧
 (.,,゚Д|゚д゚)っ|゚)<中の人などいない!

  ∧∧ピシャッ
 (.,,゚Д|゚)Σ

例によって『views』のindex.phpを変更。


index.php

<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>

今の段階ではおそらくこうなっているかと。

それを↓のように修正。


赤字部分が変更部分。ちなみに☆ミキラッ は入れても入れなくてもおk。




findに送信されます。


PHP2009-40
こんな感じで検索窓が増加。

次に送られる先、findの作成に。


コントローラーにfindメソッドを作成しませう。

流れとしてはビューでリクエストを受け取り、コントローラーを解してモデルでデータを検索するという

流れにします。

コントローラーにfindメソッドを追加してからモデルに移りますぉ。


helo.php

function find(){
$data = array('head_title'=>'index','content'=>'index','records'=>array());
if($this->input->post('find') != null){
$find = $this->input->post('find');
$this->load->model('Blogs_model','blogs');
$data['records'] = $this->blogs->get_findrecords($find);
}
$this->load->view('layout/mylayout',$data);
}

フォームからpostされてくるfindが空ならnot発動。もしあれば$findにfindの値を入れる。

そしてお定まりのテーブルロックオン作業の後にクエリで引数($find)。このfindを検索する処理関数をモデルで

つくっちゃいますYO!!

次はモデル作成。『models』の「blogs_model.php」を修正しまつ。


blog_model.phpに次のようにget_findrecordsメソッドを追加。

function get_findrecords($str){
$sql = "SELECT * FROM blogs WHERE title like ? OR content like ?";
$query = $this->db->query($sql,array("%{$str}%","%{$str}%"));


return $query->result_array();
}

単純にやっていることは1つ。引数を基にしてセレクト文実行。

ってそれじゃ解説にならんのでもうちょい詳しく。

まず$strはご承知の通りコントローラーから飛んできたfindの値。


関数最初の部分はタイトル、コンテンツ内に条件の一部でも合致するもののサーチ。

?には秘密が。とりあえずLIKEはMYSQLのあいまい検索時も用いられるもの。って、おkだよね。

$queryはDBにクエリ投げる関数。queryはクエリ実行。


query('クエリ文',配列);


でsql文中の?が威力を発揮。


クエリ文の後に配列を渡してやればそれがそのまま?に入ります。つまりこの場合、フォーム(name=find)に(゚∀゚)

と入力されたら、実行されるSQL文は"SELECT * FROM blogs WHERE title like (゚∀゚) OR content luke (゚∀゚)"

に置き換わるわけです。

すげー。


つまりtitleとcontent内に(゚∀゚)を含むレコードが検索される、ということになります。

であ実際に確かめてみましょう。



PHP2009-41
(゚∀゚)と入力。もしコンテンツかタイトルに(゚∀゚)が含まれていれば表示される…はず。



PHP2009-42
(゚д゚)!!HITした模様です。


ちなみにデフォ状態では(未検索時)下のレコード欄は空です。

PHP2009-43
こんなん。


一覧見るにはhttp://localhost/igniterapp/helo/  へアクセスしなきゃいけないから困る。


まぁいいけど。


とりあえずモデル編(おまけ)はこれにて終了。


(゚ω゚)次回以降はバリデーションについて扱っていきますYO!!


( ゚ω゚)ノシ TO BE CONTINUED!!

人気ブログランキングへ


こんばんわ、中の人デス。


さて引き続きモデルについてやっていきませう。


もでるというかぶっちゃけDBだろ。


   _,,....,,_  _人人人人人人人人人人人人人人人_
-''":::::::::::::`''>   ゆっくりしていってね!!!   <
ヽ::::::::::::::::::::: ̄^Y^Y^Y^Y^Y^Y^Y^Y^Y^Y^Y^Y^Y^Y^ ̄
 |::::::;ノ´ ̄\:::::::::::\_,. -‐ァ     __   _____   ______
 |::::ノ   ヽ、ヽr-r'"´  (.__    ,´ _,, '-´ ̄ ̄`-ゝ 、_ イ、
_,.!イ_  _,.ヘーァ'二ハ二ヽ、へ,_7   'r ´          ヽ、ン、
::::::rー''7コ-‐'"´    ;  ', `ヽ/`7 ,'==─-      -─==', i
r-'ァ'"´/  /! ハ  ハ  !  iヾ_ノ i イ iゝ、イ人レ/_ルヽイ i |
!イ´ ,' | /__,.!/ V 、!__ハ  ,' ,ゝ レリイi (ヒ_]     ヒ_ン ).| .|、i .||
`!  !/レi' (ヒ_]     ヒ_ン レ'i ノ   !Y!""  ,___,   "" 「 !ノ i |
,'  ノ   !'"    ,___,  "' i .レ'    L.',.   ヽ _ン    L」 ノ| .|
 (  ,ハ    ヽ _ン   人!      | ||ヽ、       ,イ| ||イ| /
,.ヘ,)、  )>,、 _____, ,.イ  ハ    レ ル` ー--─ ´ルレ レ´


今回はレコードの更新。


まずは行進用…更新用のビューを用意。

ファイル名「edit.php」をビューに用意します。もち『views』フォルダのことね。


  |l、{   j} /,,ィ//|     / ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄
  i|:!ヾ、_ノ/ u {:}//ヘ     | あ…ありのまま 今 起こった事を話すぜ!
  |リ u' }  ,ノ _,!V,ハ |     < 『おれは更新用のビューと打ったと
  fト、_{ル{,ィ'eラ , タ人.    |  思ったら行進用に摩り替わっていた』
 ヾ|宀| {´,)⌒`/ |<ヽトiゝ   | 催眠術だとか超スピードだとか
  ヽ iLレ  u' | | ヾlトハ〉.   | そんなチャチなもんじゃあ 断じてねえ
   ハ !ニ⊇ '/:}  V:::::ヽ. │ もっと恐ろしいものの片鱗を味わったぜ…
  /:::丶'T'' /u' __ /:::::::/`ヽ \____________________

スタープラチガが通過したようです。


edit.php

<h1>Blogの編集</h1>
<p>記事を修正してください</p>
<form method="post" action="/igniterapp/helo/update">
<input type="hidden" name="id" value="<?=$record->id ?>">
<input type="hidden" name="timestamp" value="<?=$record->timestamp ?>">
<table>
<tr>
<th>TITLE</th>
<td><input type="text" name="title" size="60" value="<?=$record->title ?>"></td>
</tr>

<tr>
<th>CONTENT</th>
<td><textarea name="content" cols="40" rows="3"><?=$record->content ?></textarea></td>
</tr>

<tr>
<th></th>
<td><input type="submit"></td>
</tr>
</table>
</form>


ここでは2つの非表示フォーム(hidden)と2つのフォーム(編集用)が用意されています。


それぞれを用いて、id,timestamp,title,contentの値をを保管します。


送信先は/igniterapp/helo/update。


エディットにアクセスしてクエリ送信をすると、updateに処理が渡される仕組みです。


それではコントローラーに核となる『edit』と『update』メソッドを追加しませう。


まずはDBからデータを奪って(!?)エディトフォームに出力させるところ。


とりあえず『controller』フォルダのhelo.phpに「edit」メソッドを追加しやう。


helo.php

function edit($id = null){
$data = array('head_title'=>'EDIT BLOG','content'=>'edit');
$query = $this->db->get_where('blogs',array('id' => $id));
$data['record'] = $query->row();
$this->load->view('layout/mylayout',$data);
}


これで指定したIDの記事の編集画面が表示されるようになる。(まだ完成ではない)

http://localhost/helo/edit/ 記事ID(記事IDはhttp://localhost/helo/ で調べておこう。記事Noのないのを指定するとエラー。)


PHP2009-26

例。記事No2を指定した場合。(http://localhost/igniterapp/helo/edit/2 )



PHP2009-27
ちなみに記事全体



PHP2009-28
存在しないNo(13)を指定して実行した場合。



ここまででとりあえずデータ取り出し。編集用にフォームに出力まででけたので、次は更新するメソッドの追加。

helo.php末尾に次のようにメソッド追加。


helo.php

function update(){
if($this->input->post('title') != null){
$data = array(
'timestamp' => $this->input->post('timestamp',true),
'title' => $this->input->post('title',true),
'content' => $this->input->post('content',true)
);
$this->db->where('id',$this->input->post('id',true));
$this->db->update('blogs',$data);
}
redirect(base_url().'helo/index');
}

フォームからのpostデータを受け取り、dbのupdateで更新していますYO。

(´・ω・)本当かいな というわけで動かしてみる。


実験台はこいつだ!(゚∀゚)アヒャヒャ(ぇ


PHP2009-29

これの内容を編集…



PHP2009-30
このブログを書き始めてから口癖が『困る』に変化するから困る。



PHP2009-31
クエリボタン押下後。ID2の内容を↑のほうの「記事全体」と見比べていただければわかるかと。


(゚∀゚)とりあえずこれで編集もできるようになりますた。不完全ですが。


解説~。

helo.php

function edit($id = null){
$data = array('head_title'=>'EDIT BLOG','content'=>'edit');
$query = $this->db->get_where('blogs',array('id' => $id));
$data['record'] = $query->row();
$this->load->view('layout/mylayout',$data);
}


($id = null)$idの初期化ぶっちゃけなくても変わんないじゃね?と思って取っ払うと差異が発生。

差異は次の通り。ブラウザはIE7です。


⇒** /edit/1 でID1の記事編集。クエリ押下で一覧へととび入力内容が更新される。問題はここから。

再度ブラウザのアドレス欄で**/edit/1と入力するとクッキーの影響か編集前の状態のデータがフォームに入っている。その状態でF5キーで更新かけると分岐発生。


($id = null)→更新すると更新された一覧のほうのデータに更新される(つまりフォームに表示される編集内容が編集前⇒編集後・一覧表示のと同一内容に更新される。)


()→更新するとエラー発生。んなIDねぇYO!!的な(多分)エラー発生。



PHP2009-32

恐らくCodeigniterではメソッド側で(GET形式で扱いたい変数名 = null)と初期化することでGET形式での値を変数で受け取れる模様。前にコードイグナイターはGET形式のデータは受け取れない云々の説明はしたと思うが、これはそのGET系の設定の書き換えなしで使える裏技?的なGET値の受け取り。


試しに

function edit($hoge = null){
$data = array('head_title'=>'EDIT BLOG','content'=>'edit');
$query = $this->db->get_where('blogs',array('id' => $hoge));
$data['record'] = $query->row();
$this->load->view('layout/mylayout',$data);
}

でやってみたところ変わらずに動く。

しかし暑い…。


       ,;r''"~ ̄^'ヽ,
      ./       ;ヽ    暑い季節は皆真夏だ!
      l  _,,,,,,,,_,;;;;i
      l l''|~___;;、_y__ lミ;l      逃げないやつはよく訓練された真夏だ!
      ゙l;| | `'",;_,i`'"|;i |
     ,r''i ヽ, '~rーj`c=/      ホント 温暖化は地獄だぜ!フゥハハハーハァー
   ,/  ヽ  ヽ`ー"/:: `ヽ
  /     ゙ヽ   ̄、:::::  ゙l,
 |;/"⌒ヽ,  \  ヽ:   _l_        ri                   ri
 l l    ヽr‐─ヽ_|_⊂////;`ゞ--―─-r| |                   / |
 ゙l゙l,     l,|`゙゙゙''―ll___l,,l,|,iノ二二二二│`""""""""""""|二;;二二;;二二二i≡三l
 | ヽ     ヽ   _|_  _       "l ̄ ̄ ̄ ̄ ̄ ̄ |二;;二二;;二=''''''''''' ̄ノ
 /"ヽ     'j_/ヽヽ, ̄ ,,,/"''''''''''''⊃r‐l'二二二T ̄ ̄ ̄  [i゙''''''''''''''''"゙゙゙ ̄`"
/  ヽ    ー──''''''""(;;)   `゙,j"  |  | |
  _,,,,,,,,,ヽ、        ,,,,,r-'''''ーー'''|   |  | |
''"    ヽ,,___,,,r‐''''''二__    |__|  | |
          \'''"   /     ノ    | |

フゥハハハーハァー。


$query = $this->db->get_where('blogs',array('id' => $id));
部分は説明せずともわかるだろーけどSQL文で$idと合致するレコードを呼び出しています。


$変数 = $this->db->get_where(テーブル,検索条件の連想配列);

上記の場合where 'id' = {$id} という文が生成されることになります。暑い…(´Д`;)


$data['record'] = $query->row();
上記はクエリ結果をレコードの連想配列に格納しています。こうすることで、ビューで<?=$record->**のように値を使いまわすことができたわけですね。


次にupdateの部分。


helo.php

function update(){
if($this->input->post('title') != null){
$data = array(
'timestamp' => $this->input->post('timestamp',true),
'title' => $this->input->post('title',true),
'content' => $this->input->post('content',true)
);
$this->db->where('id',$this->input->post('id',true));
$this->db->update('blogs',$data);
}
redirect(base_url().'helo/index');
}


もしpostされてくるtitleが空でなければ処理を開始。つまるところ普通にブラウザで表示する際には勝手にアップデートは実行されない、というところです。


とりあえずアップデートの対象はタイムスタンプとタイトル、コンテンツだけなのでそれらを$dataへ格納します。

IDはアップデートしないのかよ!!(三村風に)とか言われそうですが「IDアップデートしてどうするんだよ!(三村風に)」で返しておきます。つか、IDアップデートしちゃだめだろ。常考。


で。書き換える内容はすでに$dataに渡されているので、後は書き換えるレコードの特定と、実際に書き換える部分だけっす。で、レコード特定は次の通り。


$this->db->where('id',$this->input->post('id',true));
これでidが書き換えられる対象のidのレコードへ。


         __O)二)))(・ω・`)
   0二━━ )____)┐ノヽ
         A   ||ミ|\ くく

         __O)二)))(´・ω・`)
   0二━━ )____)┐ノヽ
         A   ||ミ|\ くく

              .○ω・`)ロックオン!
             (●)┐ノ)
              A  くく


$dbオブジェクトのwhereメソッドを呼んで、条件を$dbオブジェクトに設定する働きだけします。


あとはupdate('テーブル',レコードの内容配列)でアップデート完了。



(゚д゚)…つぎは削除。


      ,.=-''' ̄ ̄ ̄ ̄ ̄ ̄` -、
    /               \
   ./                 .\
   {                   }
   .|   / ̄""''-=,,,,_,,,,,,==-'''"\  |
   .l,  .(  ,. - ' .、     ,. - ,  .} |
   l   > ,=ニ\ ゛ | ''゛_,=ヘ、 r' {_
  /~''i //_\_..`7| l、{''″/__`>ヽ |r`i
  l .{`|./ ヽ二・ニゝチ、 ! .ゝrニ・二r  } ! i l
  { {(l {      ノ | | ヽ   ::  }| ソ/  把握した
  ヽヽ|.{    /  | |  \    i.|//
   \|.i   /  ,,.. | l._,, . \  i !/
    乂i  /    - (__,)-゛   ' {丿
    .l .!、.      ,. !.,  .,   / |
    人 \   .!''''" ̄~ ̄`''!  / 人
   ./ | .\ ,\  '-"" ゛-'  / / | .ヽ
  ノ  .{  \ .ヽ,.,   .:   ,イ /  }  ヽ
-'″  l    `' 、`.───″    .}    ヽ


(((´Д`;)))


まずは『vews』フォルダにdel.phpを用意します。


del.php

<h1>Blog削除</h1>
<p>削除するIDを記入してください。</p>
<form method="post" action="/igniterapp/helo/delete">
<table>
<tr>
<th>ID</th>
<td><input type="text" name="id" size="20"></td>
<td><input type="submit"></td>
</tr>
</table>
</form>




PHP2009-33
画面的にはこんなん。


で、当然コントローラーにも削除用メソッドを追加しませう。


helo.php

function del(){
$data = array('head_title'=>'DELETE BLOG','content'=>'del');
$this->load->view('layout/mylayout',$data);
}


function delete(){
if($this->input->post('id') !=null){
$this->db->where('id',$this->input->post('id',true));
$this->db->delete('blogs');
}
redirect(base_url().'helo/index');
}

前半のdelメソッドはデリート用画面をビューで出す部分だーね。

deleteメソッドこそが黒幕(違


もしidがpostされてきたら処理開始。postされてこなかったらなんもしない。放置プレイ。


アップデート同様まずはidでレコードをロックオン。


              .○ω・`)ロックオン!
             (●)┐ノ)
              A  くく

んでdelete('テーブル名')でロックオンされているレコードを削除。

うはwww簡単www簡潔すぐるだろ…常考。



ちなみにwhereを忘れると

          ,,-'  _,,-''"      "''- ,,_   ̄"''-,,__  ''--,,__
           ,,-''"  ,, --''"ニ_―- _  ''-,,_    ゞ    "-
          て   / ,,-",-''i|   ̄|i''-、  ヾ   {
         ("  ./   i {;;;;;;;i|    |i;;;;;;) ,ノ    ii
     ,,       (    l, `'-i|    |i;;-'     ,,-'"   _,,-"
     "'-,,     `-,,,,-'--''::: ̄:::::::''ニ;;-==,_____ '"  _,,--''"
         ̄"''-- _-'':::::" ̄::::::::::::::::;;;;----;;;;;;;;::::`::"''::---,,_  __,,-''"
        ._,,-'ニ-''ニ--''" ̄.i| ̄   |i-----,, ̄`"''-;;::''-`-,,
      ,,-''::::二-''"     .--i|     .|i          "- ;;:::`、
    ._,-"::::/    ̄"''---  i|     |i            ヽ::::i
    .(:::::{:(i(____         i|     .|i          _,,-':/:::}
     `''-,_ヽ:::::''- ,,__,,,, _______i|      .|i--__,,----..--'''":::::ノ,,-'
       "--;;;;;;;;;;;;;;;;;""''--;;i|      .|i二;;;;;::---;;;;;;;::--''"~
               ̄ ̄"..i|       .|i         
                 .i|        |i 
                 i|        |i    
                 .i|          .|i 
                 i|        .|i  
                .i|           |i 
               .i|      ,,-、 、  |i 
               i|      ノ::::i:::トiヽ、_.|i
           _,,  i|/"ヽ/:iヽ!::::::::ノ:::::Λ::::ヽ|i__n、ト、
     ,,/^ヽ,-''":::i/::::::::/:::::|i/;;;;;;/::::;;;;ノ⌒ヽノ::::::::::::ヽ,_Λ
     ;;;;;;:::::;;;;;;;;;;:::::;;;;;;;;:::/;;;;;;:::::::::;;;;;;/;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::::::::::;;:;;;;:::ヽ

┣¨┣¨┣¨┣¨┣¨┣¨┣¨┣¨┣¨┣¨┣¨┣¨・・・


ってなるので注意。レコード全破壊してしまうぉ!




PHP2009-34
ID3と入力してみる。



PHP2009-35
みごとに…ない。(1は実験段階ですでに削除ry)


毎回思うけど、フレームワークの記述は簡潔すぐる。


     ヽ       j   .す
  簡.   ゙,      l.    ご
  潔    !      ',     く
  で    ',        ',    :
  す    ト-、,,_    l
   :    !   `ヽ、 ヽ、    _
   ;    /      ヽ、`゙γ'´
      /         \
      !   ト,       ヽ
ヽ__  ___ノ ,!   | | ト,       ゙、
  レ'゙ ,イ ./|!  .リ | リ ! .|! | ト|ト}
 ,イ ,/ ./〃/ / | / .リ/ //イ|.リ
// //ノノ  //゙ ノ'////|.リ/
´彡'゙,∠-‐一彡〃 ト.、,,,,,,,,,,,レ゙
二ニ-‐'''"´      /`二、゙゙7
,,ァ''7;伝 `        {.7ぎ゙`7゙
  ゞ‐゙''  ,. ,. ,.  l`'''゙" ,'
  〃〃"      !   |
              !  l
 !       (....、 ,ノ  !
 j        `'゙´  ,'
     ー--===ァ   /
      _ _   ./    ・・・ゴクリ
\     ` ̄   ,/
  ` .、       /
   :ミ:ー.、._  /``'''ー-、
    `゙三厂´



…ゴクリなのはいいとして。あまりにも冗長すぐるので真のモデル部分は補足で補おうか。(ぉ


というわけでcodeigniterのDB系の便利ツールおよびモデル部分はおまけへ持ち越し。


(゚∀゚)ゝフヒヒサーセンwwww

人気ブログランキングへ