SlideShare une entreprise Scribd logo
1  sur  50
PHP	
  フレームワーク入門	

       Dec.	
  7,	
  2011	
  
    第1回 岡山PHP勉強会	



               sho	
  <sho@codeigniter.jp>
本発表の主な対象者	

	
  
       Web	
  アプリをつくったことがある	
  
	
  
                 &&	
  
	
  
       フレームワークを使ったことがない	
  


                                  2
 
	
  
	
  

       フレームワークってなに?	
  



                          3
その前に…	

	
  
	
  
	
  

       こんな経験はありませんか?	
  



                           4
いつも同じようなコード書いてね?	

•  煩雑な入力検査	
  

   if	
  (empty($_POST[‘name’]))	
  
               	
  $error[]	
  =	
  ‘お名前が未入力です。’;	
  
   	
  
   if	
  (!preg_match(‘/^[a-­‐z0-­‐9-­‐_.]@[a-­‐z0-­‐9-­‐.]$/i’,$_POST[‘mail’]))	
  
                 	
  $error[]	
  =	
  ‘E-­‐Mail	
  を正しく入力してください。’;	
  
   	
  
   if	
  (strlen($_POST[‘tel’])	
  >	
  13)	
  
                 	
  $error[]	
  =	
  ‘電話番号は13文字以内で入力してください。’;	
  




                                                                                           5
いつも同じようなコード書いてね?	

•  HTML	
  のエスケープ	
  
  ようこそ、<?php	
  echo(htmlspecialchars($_POST[‘name’]));	
  ?>	
  さん!	
  



•  SQL	
  のエスケープ	
  
  $sql	
  =	
  ‘SELECT	
  *	
  FROM	
  users	
  ’;	
  
  $sql	
  .=	
  ‘WHERE	
  NAME	
  LIKE	
  %‘	
  .	
  mysql_real_escape_string($_GET[‘key’])	
  .	
  ‘%	
  ’;	
  
  $sql	
  .=	
  ‘AND	
  age	
  >=	
  ’	
  .	
  sprin1(‘%d’,	
  $_GET[‘year’]);	
  




                                                                                                                   6
いつも同じようなコード書いてね?	

•  よくある機能	
  
  –  ページ送り	
  
  –  ユーザ認証	
  
  –  設定値の取得	
  
  –  ファイルアップロード	
  
  –  メール送信	
  

•  セッション管理	
  
•  データベースアクセス	
  etc.	
  

                            7
だれだよこんなコード書いたの…	

•  ロジックとデザインがごちゃまぜ	
  

<html><body>	
  
<table>	
  
<?php	
  
require_once('conf.inc.php');	
  
$db	
  =	
  DB::connect('mysql://'.DB_USER.':'.DB_PASS.'@'.DB_HOST.'/'.DB_NAME);	
  
$so	
  =	
  $db-­‐>prepare(’SELECT	
  *	
  FROM	
  users	
  ORDER	
  BY	
  user_id	
  ASC;');	
  
$rs	
  =	
  $db-­‐>execute($so);	
  
while	
  ($row	
  =	
  $rs-­‐>fetchRow(DB_FETCHMODE_ASSOC))	
  {	
  
?>	
  
	
  	
  	
  	
  <tr>	
  
	
  	
  	
  	
  	
  	
  	
  	
  <th><?=	
  $row[‘id’]	
  ?></th><td><?=	
  htmlspecialchars($row[‘name’])	
  ?></td>	
  
	
  	
  	
  	
  </tr>	
  
<?php	
  }	
  ?>	
  
</table>	
  
</body></html>	
  
                                                                                                                           8
だれだよこんなコード書いたの…	

•  ルールが統一されていない	
  
 –  命名規則	
  
 –  ディレクトリ構成	
 –  インデント	




                      9
サーバを移したら動かなくなった	

•  よくある原因	
  (PHP):	
  
   –  バージョンの違い	
  
   –  設定値の違い	
  
   –  外部ライブラリの不足	
  




                          10
セキュリティが不安……	

•  SQL	
  Injecuon	
  
•  XSS	
  (Cross	
  Site	
  Scripung)	
  
•  セッションハイジャック	
  
•  ディレクトリトラバーサル	
  
        	
  :	
  




                                            11
 
	
  
	
  

       心当たりがありましたか?	
  



                          12
 
	
  
	
  

       フレームワークで解決!	
  
            (するかも)	
  



                         13
“フレームワーク”	

•  framework	
  【名】	
  骨組み、枠組み、骨格	
  
•  なにかの土台となるもの	
  




                                        14
 
	
  
	
  

       フレームワークの主な役割	
  



                          15
標準的な機能の提供	

•  ライブラリ	
  
  –  ページ送り,ユーザ認証,ファイルアップロード,メール送
     信	
  	
  etc.	
  

•  ヘルパ関数	
  
  –  例)	
  CakePHP	
  の pr():	
  
      print_r()	
  の結果を	
  <pre>	
  </pre>	
  で囲って出力	
  


                echo(‘<pre>’);	
  
                print_r($hoge);	
             pr($hoge);	
  
                echo(‘</pre>’);	
  


                                                               16
MVC	
  モデルの実現	

•  ソフトウェアを次の	
  3	
  つの構造に分割する手法	
  
  –  Model	
  
      •  データの読み書きを行なう	
  

  –  View	
  
      •  データを表示する	
  

  –  Controller	
  
      •  Model	
  と View	
  を制御し,ユーザの入力に応答する	



                                                 17
MVC	
  モデル	

•  イメージ	

                       Controller	



              View	
                      Model	

     HTML	



                                 File	
      データベース	


                                                        18
MVC	
  モデルのメリット	

     •  独立性を確保	
  
            –  機能ごとの役割が明確に	
  

     •  依存性の抑制	
  
            –  変更の影響を受けにくく	
  
            –  部品の再利用性が向上	
  

     •  保守性の向上	
  
            –  デザインとビジネスロジックの切り分け	
  

参考:	
  hop://www.atmarkit.co.jp/zava/javafaq/j2ee/j2e07.html	
   19
OR	
  マッピング	

•  Object-­‐Relauonal	
  Mapping	
  
•  DB	
  をオブジェクトとして扱う手法	
  
               id	
 name	
   mail	
               1	
 前田 敦子	
 a-­‐maeda@example.com	
                                           Members_model	
  	
  
                                                                                                Object	
               2	
 大島 優子	
 yohshima@example.net	
               3	
 北原 里英	
 kitarie@example.co.jp	

                                                                      $members_model	
  
                              Member	
  Object	
                           -­‐>get_row(3)	
                              (	
  
                              	
  	
  	
  	
  	
  	
  	
  	
  [id]	
  =>	
  3	
  
                              	
  	
  	
  	
  	
  	
  	
  	
  [name]	
  =>	
  北原 里英	
  
                              	
  	
  	
  	
  	
  	
  	
  	
  [mail]	
  =>	
  kitarie@example.co.jp	
  
                              )	
                                                                             20
ルールの制定	

•  命名規則	
  
  –  変数名,テーブル名	
  

•  ディレクトリ構成	
  

•  コーディングスタイル	
  




                     21
メリットのまとめ	

•  開発工数の短縮	
  
       –  同じようなコードを繰り返し書かなくて良い	
  
	
  
•  品質の均一化	
  
•  保守性の向上	
  
•  セキュリティの向上	
  
       –  ルールが統一されるため	
  


                                     22
フレームワークのデメリット	

•  学習コストがかかる	
  
•  どれが良いかわからない	
  
  –  CakePHP	
  
  –  Symfony	
  
  –  Zend	
  Framework	
  
  –  CodeIgniter	
  
      •  Kohana,	
  FuelPHP,	
  ……	
  


                                         23
フレームワークの選定基準	

•  実用性	
  
  –  安定性	
  
  –  機能,対応バージョン	
  
•  開発の継続性	
  
•  ライセンス	
  
•  情報の入手しやすさ	
  


                      24
 
	
  
	
  

       CodeIgniter	
  の紹介	
  



                                25
CodeIgniter	
  とは	

•  	
  [kóud ig・nít・er]	
  
•  ignite:	
  [自動]	
  発火する	
  	
  [他動]	
  点火する	
  
       	
  
•  無料,オープンソース (3.0	
  から	
  OSL)	
  
•  2006年 2月に登場	
  
•  EllisLab,	
  Inc.	
  が開発	
  
	
  
*	
  CodeIgniter	
  and	
  its	
  logo	
  are	
  property	
  of	
  ElisLab	
  Inc.	
  


                                                                                         26
「高速」 「軽量」 「低い学習コスト」	

•  高速	
  
   –  他のフレームワークと比較しても圧倒的	
  
   –   	
  
       CodeIgniter	
   ベンチマーク	
   検索	

•  軽量	
  
   –  ソースの容量は約 1.2MByte	
  

•  低い学習コスト	
  
   –  規約,覚えることが少ない	
  

                                         27
とっつきやすい	

•  日本語のユーザガイドが完備	
  

•  コマンドライン操作が不要	
  

•  レンタルサーバでも幅広く動作	
  
 –  System	
  は原則,外部ライブラリを不使用	
  
 –  PHP	
  のバージョンや設定の違いを (ある程度)	
  吸収	
  

•  ほとんど設定が不要	


                                            28
Apple	
  も使ってる?	
  




                                                                      CodeIgniter	




hop://jobs.apple.com/index.ajs?method=mExternal.showJob&RID=92938	
                   29
CodeIgniter	
  の	
  URL	

      hop://example.jp/hoge/index.php/	
  fuga	
  /	
  piyo	
  /	
  foo	
  
                                                                           機能名	
 操作名	
 引数	




      	
  
                                                                                                         Controller	
      	
  	
  class	
  Fuga	
  extends	
  CI_Controller	
  {	
  
      	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  (中略)	
  
      	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  funcuon	
  piyo($arg1,	
  $arg2	
  =	
  ‘test’)	
  {	
  
      	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  …	
  
      	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  }	
  
      	
  	
  }	
                                                             	
                                                                                                                        30
 
	
  
	
  

       CodeIgniter	
  の機能の一例	
  



                                   31
フォーム検証	
  

•  検証ルールをセット	
  
   –  $this-­‐>form_validauon-­‐>set_rules(	
  
       	
      	
  ‘name	
  属性の値’,	
  	
  
       	
      	
  ‘表示名’,	
  	
  
       	
      	
  ‘検証ルール’	
  
      );	
  


•  検証	
                                      成功:	
  TRUE	
  /	
  失敗:	
  FALSE	

   –  $this-­‐>form_validauon-­‐>run()	
  

                                                                                  32
フォーム検証	
  

•  検証ルールの一例	
  
   ルール名	
            用途	
   required	
        なにか入力されているか	
   matches[hoge]	
   他のフィールドと一致するか	
  
                     (例:	
  E-­‐mailの確認入力)	
   max_length[n]	
   文字数が n	
  以内か	
   alpha_numeric	
   半角英数字か	
   valid_email	
     E-­‐mail	
  アドレスとして正しい書式か	


 –  複数指定するときはパイプ |	
  で区切る	
  
 –  自前のルールを定義することも可能	
  
                                                   33
フォーム検証	
  

•  実際のコードの例:	
  
    	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  :	
                  検証ルールをセット	
    	
  	
  	
  	
  	
  	
  	
  	
  $this-­‐>_set_validauon();	
  
    	
  	
  	
  	
  	
  	
  	
  	
  if	
  ($this-­‐>form_valida:on-­‐>run()	
  !==	
  TRUE)	
  {	
  
    	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  //	
  検証失敗	
  
    	
  	
  	
  	
  	
  	
  	
  	
  }	
  else	
  {	
  
                                                                                   検証実行	
    	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  //	
  検証成功	
  
    	
  	
  	
  	
  	
  	
  	
  	
  }	
  
    }	
  

                                                                                                            検証ルール	
   funcuon	
  _set_valida:on()	
  {	
  
   	
  	
  	
  	
  	
  	
  	
  	
  $this-­‐>form_validauon-­‐>set_rules('mail',	
  'E-­‐Mail',	
  	
  
   	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  'required|valid_email|max_length[100]');	
  
   	
  	
  	
  	
  	
  	
  	
  	
  $this-­‐>form_validauon-­‐>set_rules('birth',	
  '生年月日',	
  	
  
   	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  'required|is_natural|exact_length[8]');	
  
   }	
  	
  	
  	
  	
  
                                                                                                                      34
フォーム検証	
  

•  ユーザにエラーを表示 (検証失敗時)	
  
       –  set_value():	
  入力値	
  
       –  form_error():	
  エラーの内容	
  
	
  
•  例)	
  
          <tr>	
  
          	
  	
  	
  	
  	
  	
  	
  	
  <th>E-­‐Mail</th>	
  
          	
  	
  	
  	
  	
  	
  	
  	
  <td><input	
  type="text"	
  name="mail"	
  size="30"	
  
          	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  value="<?php	
  echo	
  set_value('mail');	
  ?>"	
  />	
  
          	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  <?php	
  echo	
  form_error('mail');	
  ?></td>	
  
          </tr>	
  
          	
  
                                                                                                                                                                        35
データベースアクセス	

•  対応 DBMS	
  
   –  MySQL,MS	
  SQL,Postgres,Oracle,SQLite	
  	
  etc.	
  

•  Acuve	
  Record	
  
   –  取得や挿入,更新を最小限のコードで	
  
   –  各 DBMS	
  間の SQL	
  構文の違いを吸収	
  
   –  値を自動的にエスケープ	
  
※	
  もちろん自分で SQL	
  文を書くことも可能	
  


                                                               36
Acuve	
  Record	
  の使用法 (の一部)	

•  取得:	
  get()	
  
    –  $query	
  =	
  $this-­‐>db-­‐>get(‘mytable’,	
  10,	
  20);	
  
    	
  
           SELECT	
  *	
  FROM	
  `mytable`	
  	
  LIMIT	
  20,	
  10;	
  
    	
  
•  条件を指定:	
  where()	
  
    –  $this-­‐>db-­‐>where(array(‘id’	
  =>	
  123));	
  
       $query	
  =	
  $this-­‐>db-­‐>get(‘mytable’);	
  

           SELECT	
  *	
  FROM	
  `mytable`	
  WHERE	
  id=123;	
  
                                                                             37
Acuve	
  Record	
  の使用法 (の一部)	

•  挿入:	
  insert()	
  
    –  $data	
  =	
  array(	
  
       	
  	
  	
  	
  	
  	
  	
  ‘7tle’	
  =>	
  ‘My	
  7tle’	
  ,	
  
       	
  	
  	
  	
  	
  	
  	
  ‘name’	
  =>	
  ‘My	
  Name’	
  ,	
  
       	
  	
  	
  	
  	
  	
  	
  ‘date’	
  =>	
  ‘My	
  date‘	
  
       );	
  
       $this-­‐>db-­‐>insert(’mytable’,	
  $data);	
  

           INSERT	
  INTO	
  `mytable`	
  	
  (`7tle`,	
  `name`,	
  `date`)	
  
           	
  	
  	
  	
  VALUES	
  ('My	
  Title',	
  'My	
  Name',	
  'My	
  Date');	
  


                                                                                              38
 
	
  
	
  

       アプリを作ってみよう	
  



                        39
例題アプリケーション	

•  岡山の勉強会情報サイト 「おかやまべん。」	
  




                               40
開発の流れ	
1.  機能を考える	
  

2.  どんなデータを扱うかを考える	
  

3.  テーブル構成を考える	
  

4.  Controller,	
  View,	
  Model	
  の作成	
  




                                               41
実装する機能	

•  コミュニティ情報	
  
•  イベント情報	
  
  –  一覧表示,詳細表示	
  
  –  登録,編集,削除	
  




                     42
テーブル構成	

•  コミュニティ情報	
  (communiues)	
  
       名前	
            型	
         用途	
       id	
            int	
       コミュニティ	
  ID	
       name	
          varchar	
   コミュニティ名	
       comment	
       text	
      コメント	

•  イベント情報	
  (events)	
  
       名前	
            型	
         用途	
       id	
            int	
       イベント	
  ID	
       community_id	
 int	
        コミュニティ	
  ID	
       name	
          char	
      イベント 名	
       comment	
       text	
      コメント	
                                                    43
Model	
  の作成	

•  テーブルごとに	
  1	
  つ	
  
•  models/	
  
   –  communiues_model.php	
  .……	
  コミュニティ情報 	
  
   –  events_model.php	
  ………………	
  イベント情報	
  




                                                     44
Model	
  の作成	

•  例)	
  applicauon/models/	
  events_model.php	
  
	
      Class	
  Events_model	
  extends	
  CI_Model	
  {	
  
        	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  (中略)	
  
	
      	
  	
  	
  	
  	
  	
  	
  	
  funcuon	
  get_row($id)	
  {	
  
        	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  $this-­‐>db-­‐>where(’id',	
  $id);	
           クエリを組立	
	
      	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  $query	
  =	
  $this-­‐>db-­‐>get(’event');	
  
        	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  $result	
  =	
  $query-­‐>result();	
  
	
      	
  
        	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  return	
  $result[0];	
            実行結果を取得	
	
      	
  	
  	
  	
  	
  	
  	
  	
  }	
  
	
      }	
  

※	
  Model 名とテーブル名は同じにするのがおすすめ	
  
※	
  実際には引数や結果の検査,例外処理が必要	
  

                                                                                                                                   45
View	
  の作成	

•  基本は	
  HTML	
  
•  画面	
  (ページ)	
  ごとに	
  1	
  つ	
  
•  共通部分はブロック化して	
  include	
  
•  テンプレートパーサの利用	
  
   –  変数の出力	
  
   –  繰り返し制御	
  



                                      46
Controller	
  の作成	

•  機能ごとに	
  1	
  つのコントローラ	
  
•  操作ごとに	
  1	
  つのアクション	
  	
  
•  controllers/	
  
   –  community.php	
  …	
  コミュニティ情報	
  
       •  アクション:	
  	
  index(),	
  	
  detail(),	
  	
  add(),	
  	
  edit(),	
  	
  delete(),	
  	
  …	
  
   –  event.php	
  ………….	
  イベント情報	
  
       •  アクション:	
  	
  index(),	
  	
  detail(),	
  	
  add(),	
  	
  edit(),	
  	
  delete(),	
  	
  …	
  


                                                                                                               47
Controller	
  から Model,	
  View	
  をロード	

•  例)	
  applicauon/controllers/	
  event.php	
  

             Class	
  Event	
  extends	
  CI_Controller	
  {	
  
             	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  :	
                                                      Model	
  をロード	
             	
  	
  	
  	
  	
  	
  	
  	
  funcuon	
  detail($id)	
  {	
  
       1     	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  $this-­‐>load-­‐>model(‘Event_model’);	
  
                                                                                                                                                データを取得	
      	
  




             	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  $data[‘event’]	
  =	
  	
                                                      1
      操      	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  $this-­‐>Event_model-­‐>get_row($id);	
  




                                                                                                                                                           	
  
      作      	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  $this-­‐>load-­‐>view(’detail',	
  $data);	
  
                                                                                                                                                           機
      	




             	
  	
  	
  	
  	
  	
  	
  }	
                                                                                                               能
             	
                                                                                                           View	
  に渡す	




                                                                                                                                                           	
       1
             	
  	
  	
  	
  	
  	
  	
  	
  funcuon	
  add()	
  {	
  
      	
  




             	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  :	
  
      操
      作
      	




                                                                                                                                                                  48
 
	
  
	
  

       実 演	
  



                 49
 
	
  
	
  

       おわり	
  



                 50

Contenu connexe

Tendances

Powershell勉強会 v3 (もっと新しいバージョンがあります)
Powershell勉強会 v3 (もっと新しいバージョンがあります)Powershell勉強会 v3 (もっと新しいバージョンがあります)
Powershell勉強会 v3 (もっと新しいバージョンがあります)Tetsu Yama
 
Powershell勉強会 v5 (こちらが最新です。)
Powershell勉強会 v5 (こちらが最新です。)Powershell勉強会 v5 (こちらが最新です。)
Powershell勉強会 v5 (こちらが最新です。)Tetsu Yama
 
20110820 metaprogramming
20110820 metaprogramming20110820 metaprogramming
20110820 metaprogrammingMasanori Kado
 
eZ Publish 2012年8月勉強会 - テンプレートオーバーライド
eZ Publish 2012年8月勉強会 - テンプレートオーバーライドeZ Publish 2012年8月勉強会 - テンプレートオーバーライド
eZ Publish 2012年8月勉強会 - テンプレートオーバーライドericsagnes
 
運用構築技術者の為のPSプログラミング第1回
運用構築技術者の為のPSプログラミング第1回運用構築技術者の為のPSプログラミング第1回
運用構築技術者の為のPSプログラミング第1回Shigeharu Yamaoka
 
PHP5.5新機能「ジェネレータ」初心者入門
PHP5.5新機能「ジェネレータ」初心者入門PHP5.5新機能「ジェネレータ」初心者入門
PHP5.5新機能「ジェネレータ」初心者入門kwatch
 
【アシアル塾】PHPオブジェクト指向再入門・第四回デザインパターンに学ぶクラス設計
【アシアル塾】PHPオブジェクト指向再入門・第四回デザインパターンに学ぶクラス設計【アシアル塾】PHPオブジェクト指向再入門・第四回デザインパターンに学ぶクラス設計
【アシアル塾】PHPオブジェクト指向再入門・第四回デザインパターンに学ぶクラス設計アシアル株式会社
 
Powershell基礎_20180521用
Powershell基礎_20180521用Powershell基礎_20180521用
Powershell基礎_20180521用Tetsu Yama
 
Powershell勉強会 v4 (もっと新しいバージョンがあります。)
Powershell勉強会 v4 (もっと新しいバージョンがあります。)Powershell勉強会 v4 (もっと新しいバージョンがあります。)
Powershell勉強会 v4 (もっと新しいバージョンがあります。)Tetsu Yama
 
XPagesDay2015 - 誰も教えてくれなかったデバッグ方法
XPagesDay2015 - 誰も教えてくれなかったデバッグ方法XPagesDay2015 - 誰も教えてくれなかったデバッグ方法
XPagesDay2015 - 誰も教えてくれなかったデバッグ方法Mitsuru Katoh
 
Web技術勉強会 20100925
Web技術勉強会 20100925Web技術勉強会 20100925
Web技術勉強会 20100925龍一 田中
 
SecurityとValidationの奇妙な関係、あるいはDrupalはなぜValidationをしたがらないのか
SecurityとValidationの奇妙な関係、あるいはDrupalはなぜValidationをしたがらないのかSecurityとValidationの奇妙な関係、あるいはDrupalはなぜValidationをしたがらないのか
SecurityとValidationの奇妙な関係、あるいはDrupalはなぜValidationをしたがらないのかHiroshi Tokumaru
 
eZ Publish勉強会9月〜テンプレート言語〜
eZ Publish勉強会9月〜テンプレート言語〜eZ Publish勉強会9月〜テンプレート言語〜
eZ Publish勉強会9月〜テンプレート言語〜ericsagnes
 
Gen-Template-for-Perl
Gen-Template-for-PerlGen-Template-for-Perl
Gen-Template-for-Perlnasneg
 
ビギナーだから使いたいO/Rマッパー ~Tengを使った開発~
ビギナーだから使いたいO/Rマッパー ~Tengを使った開発~ビギナーだから使いたいO/Rマッパー ~Tengを使った開発~
ビギナーだから使いたいO/Rマッパー ~Tengを使った開発~Akabane Hiroyuki
 
WordPressで投稿記事情報の取得方法
WordPressで投稿記事情報の取得方法WordPressで投稿記事情報の取得方法
WordPressで投稿記事情報の取得方法regret raym
 
WTM53 phpフレームワーク いまさらcodeigniter
WTM53 phpフレームワーク いまさらcodeigniterWTM53 phpフレームワーク いまさらcodeigniter
WTM53 phpフレームワーク いまさらcodeigniterMasanori Oobayashi
 
【アシアル塾】PHPオブジェクト指向再入門・第一回クラスとオブジェクト
【アシアル塾】PHPオブジェクト指向再入門・第一回クラスとオブジェクト【アシアル塾】PHPオブジェクト指向再入門・第一回クラスとオブジェクト
【アシアル塾】PHPオブジェクト指向再入門・第一回クラスとオブジェクトアシアル株式会社
 

Tendances (20)

Powershell勉強会 v3 (もっと新しいバージョンがあります)
Powershell勉強会 v3 (もっと新しいバージョンがあります)Powershell勉強会 v3 (もっと新しいバージョンがあります)
Powershell勉強会 v3 (もっと新しいバージョンがあります)
 
Powershell勉強会 v5 (こちらが最新です。)
Powershell勉強会 v5 (こちらが最新です。)Powershell勉強会 v5 (こちらが最新です。)
Powershell勉強会 v5 (こちらが最新です。)
 
20110820 metaprogramming
20110820 metaprogramming20110820 metaprogramming
20110820 metaprogramming
 
eZ Publish 2012年8月勉強会 - テンプレートオーバーライド
eZ Publish 2012年8月勉強会 - テンプレートオーバーライドeZ Publish 2012年8月勉強会 - テンプレートオーバーライド
eZ Publish 2012年8月勉強会 - テンプレートオーバーライド
 
運用構築技術者の為のPSプログラミング第1回
運用構築技術者の為のPSプログラミング第1回運用構築技術者の為のPSプログラミング第1回
運用構築技術者の為のPSプログラミング第1回
 
PHP5.5新機能「ジェネレータ」初心者入門
PHP5.5新機能「ジェネレータ」初心者入門PHP5.5新機能「ジェネレータ」初心者入門
PHP5.5新機能「ジェネレータ」初心者入門
 
Django boodoo
Django boodooDjango boodoo
Django boodoo
 
【アシアル塾】PHPオブジェクト指向再入門・第四回デザインパターンに学ぶクラス設計
【アシアル塾】PHPオブジェクト指向再入門・第四回デザインパターンに学ぶクラス設計【アシアル塾】PHPオブジェクト指向再入門・第四回デザインパターンに学ぶクラス設計
【アシアル塾】PHPオブジェクト指向再入門・第四回デザインパターンに学ぶクラス設計
 
Powershell基礎_20180521用
Powershell基礎_20180521用Powershell基礎_20180521用
Powershell基礎_20180521用
 
Powershell勉強会 v4 (もっと新しいバージョンがあります。)
Powershell勉強会 v4 (もっと新しいバージョンがあります。)Powershell勉強会 v4 (もっと新しいバージョンがあります。)
Powershell勉強会 v4 (もっと新しいバージョンがあります。)
 
XPagesDay2015 - 誰も教えてくれなかったデバッグ方法
XPagesDay2015 - 誰も教えてくれなかったデバッグ方法XPagesDay2015 - 誰も教えてくれなかったデバッグ方法
XPagesDay2015 - 誰も教えてくれなかったデバッグ方法
 
Phpcon2015
Phpcon2015Phpcon2015
Phpcon2015
 
Web技術勉強会 20100925
Web技術勉強会 20100925Web技術勉強会 20100925
Web技術勉強会 20100925
 
SecurityとValidationの奇妙な関係、あるいはDrupalはなぜValidationをしたがらないのか
SecurityとValidationの奇妙な関係、あるいはDrupalはなぜValidationをしたがらないのかSecurityとValidationの奇妙な関係、あるいはDrupalはなぜValidationをしたがらないのか
SecurityとValidationの奇妙な関係、あるいはDrupalはなぜValidationをしたがらないのか
 
eZ Publish勉強会9月〜テンプレート言語〜
eZ Publish勉強会9月〜テンプレート言語〜eZ Publish勉強会9月〜テンプレート言語〜
eZ Publish勉強会9月〜テンプレート言語〜
 
Gen-Template-for-Perl
Gen-Template-for-PerlGen-Template-for-Perl
Gen-Template-for-Perl
 
ビギナーだから使いたいO/Rマッパー ~Tengを使った開発~
ビギナーだから使いたいO/Rマッパー ~Tengを使った開発~ビギナーだから使いたいO/Rマッパー ~Tengを使った開発~
ビギナーだから使いたいO/Rマッパー ~Tengを使った開発~
 
WordPressで投稿記事情報の取得方法
WordPressで投稿記事情報の取得方法WordPressで投稿記事情報の取得方法
WordPressで投稿記事情報の取得方法
 
WTM53 phpフレームワーク いまさらcodeigniter
WTM53 phpフレームワーク いまさらcodeigniterWTM53 phpフレームワーク いまさらcodeigniter
WTM53 phpフレームワーク いまさらcodeigniter
 
【アシアル塾】PHPオブジェクト指向再入門・第一回クラスとオブジェクト
【アシアル塾】PHPオブジェクト指向再入門・第一回クラスとオブジェクト【アシアル塾】PHPオブジェクト指向再入門・第一回クラスとオブジェクト
【アシアル塾】PHPオブジェクト指向再入門・第一回クラスとオブジェクト
 

Similaire à PHPフレームワーク入門

CodeIgniter入門
CodeIgniter入門CodeIgniter入門
CodeIgniter入門Sho A
 
Software Development with Symfony
Software Development with SymfonySoftware Development with Symfony
Software Development with SymfonyAtsuhiro Kubo
 
CodeIgniter 〜 2008年大躍進のPHPフレームワーク
CodeIgniter 〜 2008年大躍進のPHPフレームワークCodeIgniter 〜 2008年大躍進のPHPフレームワーク
CodeIgniter 〜 2008年大躍進のPHPフレームワークkenjis
 
XPages 開発 Tips 百連発
XPages 開発 Tips 百連発XPages 開発 Tips 百連発
XPages 開発 Tips 百連発Mitsuru Katoh
 
企業におけるSpring@日本springユーザー会20090624
企業におけるSpring@日本springユーザー会20090624企業におけるSpring@日本springユーザー会20090624
企業におけるSpring@日本springユーザー会20090624Yusuke Suzuki
 
はじめてのCodeIgniter
はじめてのCodeIgniterはじめてのCodeIgniter
はじめてのCodeIgniterYuya Matsushima
 
IT Pro のための PowerShell スクリプティング
IT Pro のための PowerShell スクリプティングIT Pro のための PowerShell スクリプティング
IT Pro のための PowerShell スクリプティングKazuki Takai
 
Jubatusでマルウェア分類
Jubatusでマルウェア分類Jubatusでマルウェア分類
Jubatusでマルウェア分類Shuzo Kashihara
 
ドメイン駆動設計という仕事の流儀
ドメイン駆動設計という仕事の流儀ドメイン駆動設計という仕事の流儀
ドメイン駆動設計という仕事の流儀増田 亨
 
Windows PowerShell 2.0 の基礎知識
Windows PowerShell 2.0 の基礎知識Windows PowerShell 2.0 の基礎知識
Windows PowerShell 2.0 の基礎知識shigeya
 
スマートフォン向けサービスにおけるサーバサイド設計入門
スマートフォン向けサービスにおけるサーバサイド設計入門スマートフォン向けサービスにおけるサーバサイド設計入門
スマートフォン向けサービスにおけるサーバサイド設計入門Hisashi HATAKEYAMA
 
TreeFrog Frameworkの紹介
TreeFrog Frameworkの紹介TreeFrog Frameworkの紹介
TreeFrog Frameworkの紹介ao27
 
データマイニング+WEB勉強会資料第6回
データマイニング+WEB勉強会資料第6回データマイニング+WEB勉強会資料第6回
データマイニング+WEB勉強会資料第6回Naoyuki Yamada
 
Apexコアデベロッパーセミナー(Apexコード)071010
Apexコアデベロッパーセミナー(Apexコード)071010Apexコアデベロッパーセミナー(Apexコード)071010
Apexコアデベロッパーセミナー(Apexコード)071010stomita
 
Azure でサーバーレス、 Infrastructure as Code どうしてますか?
Azure でサーバーレス、 Infrastructure as Code どうしてますか?Azure でサーバーレス、 Infrastructure as Code どうしてますか?
Azure でサーバーレス、 Infrastructure as Code どうしてますか?Kazumi IWANAGA
 
Groovyで楽にSQLを実行してみよう
Groovyで楽にSQLを実行してみようGroovyで楽にSQLを実行してみよう
Groovyで楽にSQLを実行してみようAkira Shimosako
 
Angular.jsについてちょっとしゃべる
Angular.jsについてちょっとしゃべるAngular.jsについてちょっとしゃべる
Angular.jsについてちょっとしゃべるMasashi Haga
 
基礎から見直す ASP.NET MVC の単体テスト自動化方法 ~ Windows Azure 関連もあるかも~
基礎から見直す ASP.NET MVC の単体テスト自動化方法 ~ Windows Azure 関連もあるかも~基礎から見直す ASP.NET MVC の単体テスト自動化方法 ~ Windows Azure 関連もあるかも~
基礎から見直す ASP.NET MVC の単体テスト自動化方法 ~ Windows Azure 関連もあるかも~normalian
 
ドメインロジックの実装方法とドメイン駆動設計
ドメインロジックの実装方法とドメイン駆動設計ドメインロジックの実装方法とドメイン駆動設計
ドメインロジックの実装方法とドメイン駆動設計Tadayoshi Sato
 

Similaire à PHPフレームワーク入門 (20)

CodeIgniter入門
CodeIgniter入門CodeIgniter入門
CodeIgniter入門
 
Software Development with Symfony
Software Development with SymfonySoftware Development with Symfony
Software Development with Symfony
 
CodeIgniter 〜 2008年大躍進のPHPフレームワーク
CodeIgniter 〜 2008年大躍進のPHPフレームワークCodeIgniter 〜 2008年大躍進のPHPフレームワーク
CodeIgniter 〜 2008年大躍進のPHPフレームワーク
 
XPages 開発 Tips 百連発
XPages 開発 Tips 百連発XPages 開発 Tips 百連発
XPages 開発 Tips 百連発
 
企業におけるSpring@日本springユーザー会20090624
企業におけるSpring@日本springユーザー会20090624企業におけるSpring@日本springユーザー会20090624
企業におけるSpring@日本springユーザー会20090624
 
はじめてのCodeIgniter
はじめてのCodeIgniterはじめてのCodeIgniter
はじめてのCodeIgniter
 
IT Pro のための PowerShell スクリプティング
IT Pro のための PowerShell スクリプティングIT Pro のための PowerShell スクリプティング
IT Pro のための PowerShell スクリプティング
 
Jubatusでマルウェア分類
Jubatusでマルウェア分類Jubatusでマルウェア分類
Jubatusでマルウェア分類
 
ドメイン駆動設計という仕事の流儀
ドメイン駆動設計という仕事の流儀ドメイン駆動設計という仕事の流儀
ドメイン駆動設計という仕事の流儀
 
Windows PowerShell 2.0 の基礎知識
Windows PowerShell 2.0 の基礎知識Windows PowerShell 2.0 の基礎知識
Windows PowerShell 2.0 の基礎知識
 
スマートフォン向けサービスにおけるサーバサイド設計入門
スマートフォン向けサービスにおけるサーバサイド設計入門スマートフォン向けサービスにおけるサーバサイド設計入門
スマートフォン向けサービスにおけるサーバサイド設計入門
 
TreeFrog Frameworkの紹介
TreeFrog Frameworkの紹介TreeFrog Frameworkの紹介
TreeFrog Frameworkの紹介
 
データマイニング+WEB勉強会資料第6回
データマイニング+WEB勉強会資料第6回データマイニング+WEB勉強会資料第6回
データマイニング+WEB勉強会資料第6回
 
Apexコアデベロッパーセミナー(Apexコード)071010
Apexコアデベロッパーセミナー(Apexコード)071010Apexコアデベロッパーセミナー(Apexコード)071010
Apexコアデベロッパーセミナー(Apexコード)071010
 
Azure でサーバーレス、 Infrastructure as Code どうしてますか?
Azure でサーバーレス、 Infrastructure as Code どうしてますか?Azure でサーバーレス、 Infrastructure as Code どうしてますか?
Azure でサーバーレス、 Infrastructure as Code どうしてますか?
 
BPStudy20121221
BPStudy20121221BPStudy20121221
BPStudy20121221
 
Groovyで楽にSQLを実行してみよう
Groovyで楽にSQLを実行してみようGroovyで楽にSQLを実行してみよう
Groovyで楽にSQLを実行してみよう
 
Angular.jsについてちょっとしゃべる
Angular.jsについてちょっとしゃべるAngular.jsについてちょっとしゃべる
Angular.jsについてちょっとしゃべる
 
基礎から見直す ASP.NET MVC の単体テスト自動化方法 ~ Windows Azure 関連もあるかも~
基礎から見直す ASP.NET MVC の単体テスト自動化方法 ~ Windows Azure 関連もあるかも~基礎から見直す ASP.NET MVC の単体テスト自動化方法 ~ Windows Azure 関連もあるかも~
基礎から見直す ASP.NET MVC の単体テスト自動化方法 ~ Windows Azure 関連もあるかも~
 
ドメインロジックの実装方法とドメイン駆動設計
ドメインロジックの実装方法とドメイン駆動設計ドメインロジックの実装方法とドメイン駆動設計
ドメインロジックの実装方法とドメイン駆動設計
 

Plus de Sho A

HTTP入門
HTTP入門HTTP入門
HTTP入門Sho A
 
ドメイン名入門
ドメイン名入門ドメイン名入門
ドメイン名入門Sho A
 
Ansible ではじめるインフラのコード化入門
Ansible ではじめるインフラのコード化入門Ansible ではじめるインフラのコード化入門
Ansible ではじめるインフラのコード化入門Sho A
 
DNS 入門
DNS 入門DNS 入門
DNS 入門Sho A
 
Unix コマンド入門
Unix コマンド入門Unix コマンド入門
Unix コマンド入門Sho A
 
Unix 基礎
Unix 基礎Unix 基礎
Unix 基礎Sho A
 
Let’s translate FuelPHP docs! [RELOADED]
Let’s translate FuelPHP docs! [RELOADED]Let’s translate FuelPHP docs! [RELOADED]
Let’s translate FuelPHP docs! [RELOADED]Sho A
 
Let’s translate FuelPHP docs!
Let’s translate FuelPHP docs!Let’s translate FuelPHP docs!
Let’s translate FuelPHP docs!Sho A
 
はじめての FuelPHP
はじめての FuelPHPはじめての FuelPHP
はじめての FuelPHPSho A
 

Plus de Sho A (9)

HTTP入門
HTTP入門HTTP入門
HTTP入門
 
ドメイン名入門
ドメイン名入門ドメイン名入門
ドメイン名入門
 
Ansible ではじめるインフラのコード化入門
Ansible ではじめるインフラのコード化入門Ansible ではじめるインフラのコード化入門
Ansible ではじめるインフラのコード化入門
 
DNS 入門
DNS 入門DNS 入門
DNS 入門
 
Unix コマンド入門
Unix コマンド入門Unix コマンド入門
Unix コマンド入門
 
Unix 基礎
Unix 基礎Unix 基礎
Unix 基礎
 
Let’s translate FuelPHP docs! [RELOADED]
Let’s translate FuelPHP docs! [RELOADED]Let’s translate FuelPHP docs! [RELOADED]
Let’s translate FuelPHP docs! [RELOADED]
 
Let’s translate FuelPHP docs!
Let’s translate FuelPHP docs!Let’s translate FuelPHP docs!
Let’s translate FuelPHP docs!
 
はじめての FuelPHP
はじめての FuelPHPはじめての FuelPHP
はじめての FuelPHP
 

Dernier

論文紹介:Semantic segmentation using Vision Transformers: A survey
論文紹介:Semantic segmentation using Vision Transformers: A survey論文紹介:Semantic segmentation using Vision Transformers: A survey
論文紹介:Semantic segmentation using Vision Transformers: A surveyToru Tamaki
 
SOPを理解する 2024/04/19 の勉強会で発表されたものです
SOPを理解する       2024/04/19 の勉強会で発表されたものですSOPを理解する       2024/04/19 の勉強会で発表されたものです
SOPを理解する 2024/04/19 の勉強会で発表されたものですiPride Co., Ltd.
 
論文紹介:Automated Classification of Model Errors on ImageNet
論文紹介:Automated Classification of Model Errors on ImageNet論文紹介:Automated Classification of Model Errors on ImageNet
論文紹介:Automated Classification of Model Errors on ImageNetToru Tamaki
 
TSAL operation mechanism and circuit diagram.pdf
TSAL operation mechanism and circuit diagram.pdfTSAL operation mechanism and circuit diagram.pdf
TSAL operation mechanism and circuit diagram.pdftaisei2219
 
[DevOpsDays Tokyo 2024] 〜デジタルとアナログのはざまに〜 スマートビルディング爆速開発を支える 自動化テスト戦略
[DevOpsDays Tokyo 2024] 〜デジタルとアナログのはざまに〜 スマートビルディング爆速開発を支える 自動化テスト戦略[DevOpsDays Tokyo 2024] 〜デジタルとアナログのはざまに〜 スマートビルディング爆速開発を支える 自動化テスト戦略
[DevOpsDays Tokyo 2024] 〜デジタルとアナログのはざまに〜 スマートビルディング爆速開発を支える 自動化テスト戦略Ryo Sasaki
 
【早稲田AI研究会 講義資料】3DスキャンとTextTo3Dのツールを知ろう!(Vol.1)
【早稲田AI研究会 講義資料】3DスキャンとTextTo3Dのツールを知ろう!(Vol.1)【早稲田AI研究会 講義資料】3DスキャンとTextTo3Dのツールを知ろう!(Vol.1)
【早稲田AI研究会 講義資料】3DスキャンとTextTo3Dのツールを知ろう!(Vol.1)Hiroki Ichikura
 
Open Source UN-Conference 2024 Kawagoe - 独自OS「DaisyOS GB」の紹介
Open Source UN-Conference 2024 Kawagoe - 独自OS「DaisyOS GB」の紹介Open Source UN-Conference 2024 Kawagoe - 独自OS「DaisyOS GB」の紹介
Open Source UN-Conference 2024 Kawagoe - 独自OS「DaisyOS GB」の紹介Yuma Ohgami
 
論文紹介:Content-Aware Token Sharing for Efficient Semantic Segmentation With Vis...
論文紹介:Content-Aware Token Sharing for Efficient Semantic Segmentation With Vis...論文紹介:Content-Aware Token Sharing for Efficient Semantic Segmentation With Vis...
論文紹介:Content-Aware Token Sharing for Efficient Semantic Segmentation With Vis...Toru Tamaki
 
スマートフォンを用いた新生児あやし動作の教示システム
スマートフォンを用いた新生児あやし動作の教示システムスマートフォンを用いた新生児あやし動作の教示システム
スマートフォンを用いた新生児あやし動作の教示システムsugiuralab
 

Dernier (9)

論文紹介:Semantic segmentation using Vision Transformers: A survey
論文紹介:Semantic segmentation using Vision Transformers: A survey論文紹介:Semantic segmentation using Vision Transformers: A survey
論文紹介:Semantic segmentation using Vision Transformers: A survey
 
SOPを理解する 2024/04/19 の勉強会で発表されたものです
SOPを理解する       2024/04/19 の勉強会で発表されたものですSOPを理解する       2024/04/19 の勉強会で発表されたものです
SOPを理解する 2024/04/19 の勉強会で発表されたものです
 
論文紹介:Automated Classification of Model Errors on ImageNet
論文紹介:Automated Classification of Model Errors on ImageNet論文紹介:Automated Classification of Model Errors on ImageNet
論文紹介:Automated Classification of Model Errors on ImageNet
 
TSAL operation mechanism and circuit diagram.pdf
TSAL operation mechanism and circuit diagram.pdfTSAL operation mechanism and circuit diagram.pdf
TSAL operation mechanism and circuit diagram.pdf
 
[DevOpsDays Tokyo 2024] 〜デジタルとアナログのはざまに〜 スマートビルディング爆速開発を支える 自動化テスト戦略
[DevOpsDays Tokyo 2024] 〜デジタルとアナログのはざまに〜 スマートビルディング爆速開発を支える 自動化テスト戦略[DevOpsDays Tokyo 2024] 〜デジタルとアナログのはざまに〜 スマートビルディング爆速開発を支える 自動化テスト戦略
[DevOpsDays Tokyo 2024] 〜デジタルとアナログのはざまに〜 スマートビルディング爆速開発を支える 自動化テスト戦略
 
【早稲田AI研究会 講義資料】3DスキャンとTextTo3Dのツールを知ろう!(Vol.1)
【早稲田AI研究会 講義資料】3DスキャンとTextTo3Dのツールを知ろう!(Vol.1)【早稲田AI研究会 講義資料】3DスキャンとTextTo3Dのツールを知ろう!(Vol.1)
【早稲田AI研究会 講義資料】3DスキャンとTextTo3Dのツールを知ろう!(Vol.1)
 
Open Source UN-Conference 2024 Kawagoe - 独自OS「DaisyOS GB」の紹介
Open Source UN-Conference 2024 Kawagoe - 独自OS「DaisyOS GB」の紹介Open Source UN-Conference 2024 Kawagoe - 独自OS「DaisyOS GB」の紹介
Open Source UN-Conference 2024 Kawagoe - 独自OS「DaisyOS GB」の紹介
 
論文紹介:Content-Aware Token Sharing for Efficient Semantic Segmentation With Vis...
論文紹介:Content-Aware Token Sharing for Efficient Semantic Segmentation With Vis...論文紹介:Content-Aware Token Sharing for Efficient Semantic Segmentation With Vis...
論文紹介:Content-Aware Token Sharing for Efficient Semantic Segmentation With Vis...
 
スマートフォンを用いた新生児あやし動作の教示システム
スマートフォンを用いた新生児あやし動作の教示システムスマートフォンを用いた新生児あやし動作の教示システム
スマートフォンを用いた新生児あやし動作の教示システム
 

PHPフレームワーク入門

  • 1. PHP  フレームワーク入門 Dec.  7,  2011   第1回 岡山PHP勉強会 sho  <sho@codeigniter.jp>
  • 2. 本発表の主な対象者   Web  アプリをつくったことがある     &&     フレームワークを使ったことがない   2
  • 3.       フレームワークってなに?   3
  • 4. その前に…       こんな経験はありませんか?   4
  • 5. いつも同じようなコード書いてね? •  煩雑な入力検査   if  (empty($_POST[‘name’]))    $error[]  =  ‘お名前が未入力です。’;     if  (!preg_match(‘/^[a-­‐z0-­‐9-­‐_.]@[a-­‐z0-­‐9-­‐.]$/i’,$_POST[‘mail’]))    $error[]  =  ‘E-­‐Mail  を正しく入力してください。’;     if  (strlen($_POST[‘tel’])  >  13)    $error[]  =  ‘電話番号は13文字以内で入力してください。’;   5
  • 6. いつも同じようなコード書いてね? •  HTML  のエスケープ   ようこそ、<?php  echo(htmlspecialchars($_POST[‘name’]));  ?>  さん!   •  SQL  のエスケープ   $sql  =  ‘SELECT  *  FROM  users  ’;   $sql  .=  ‘WHERE  NAME  LIKE  %‘  .  mysql_real_escape_string($_GET[‘key’])  .  ‘%  ’;   $sql  .=  ‘AND  age  >=  ’  .  sprin1(‘%d’,  $_GET[‘year’]);   6
  • 7. いつも同じようなコード書いてね? •  よくある機能   –  ページ送り   –  ユーザ認証   –  設定値の取得   –  ファイルアップロード   –  メール送信   •  セッション管理   •  データベースアクセス  etc.   7
  • 8. だれだよこんなコード書いたの… •  ロジックとデザインがごちゃまぜ   <html><body>   <table>   <?php   require_once('conf.inc.php');   $db  =  DB::connect('mysql://'.DB_USER.':'.DB_PASS.'@'.DB_HOST.'/'.DB_NAME);   $so  =  $db-­‐>prepare(’SELECT  *  FROM  users  ORDER  BY  user_id  ASC;');   $rs  =  $db-­‐>execute($so);   while  ($row  =  $rs-­‐>fetchRow(DB_FETCHMODE_ASSOC))  {   ?>          <tr>                  <th><?=  $row[‘id’]  ?></th><td><?=  htmlspecialchars($row[‘name’])  ?></td>          </tr>   <?php  }  ?>   </table>   </body></html>   8
  • 9. だれだよこんなコード書いたの… •  ルールが統一されていない   –  命名規則   –  ディレクトリ構成 –  インデント 9
  • 10. サーバを移したら動かなくなった •  よくある原因  (PHP):   –  バージョンの違い   –  設定値の違い   –  外部ライブラリの不足   10
  • 11. セキュリティが不安…… •  SQL  Injecuon   •  XSS  (Cross  Site  Scripung)   •  セッションハイジャック   •  ディレクトリトラバーサル    :   11
  • 12.       心当たりがありましたか?   12
  • 13.       フレームワークで解決!   (するかも)   13
  • 14. “フレームワーク” •  framework  【名】  骨組み、枠組み、骨格   •  なにかの土台となるもの   14
  • 15.       フレームワークの主な役割   15
  • 16. 標準的な機能の提供 •  ライブラリ   –  ページ送り,ユーザ認証,ファイルアップロード,メール送 信    etc.   •  ヘルパ関数   –  例)  CakePHP  の pr():   print_r()  の結果を  <pre>  </pre>  で囲って出力   echo(‘<pre>’);   print_r($hoge);   pr($hoge);   echo(‘</pre>’);   16
  • 17. MVC  モデルの実現 •  ソフトウェアを次の  3  つの構造に分割する手法   –  Model   •  データの読み書きを行なう   –  View   •  データを表示する   –  Controller   •  Model  と View  を制御し,ユーザの入力に応答する 17
  • 18. MVC  モデル •  イメージ Controller View Model HTML File データベース 18
  • 19. MVC  モデルのメリット •  独立性を確保   –  機能ごとの役割が明確に   •  依存性の抑制   –  変更の影響を受けにくく   –  部品の再利用性が向上   •  保守性の向上   –  デザインとビジネスロジックの切り分け   参考:  hop://www.atmarkit.co.jp/zava/javafaq/j2ee/j2e07.html 19
  • 20. OR  マッピング •  Object-­‐Relauonal  Mapping   •  DB  をオブジェクトとして扱う手法   id name mail 1 前田 敦子 a-­‐maeda@example.com Members_model     Object 2 大島 優子 yohshima@example.net 3 北原 里英 kitarie@example.co.jp $members_model   Member  Object   -­‐>get_row(3) (                  [id]  =>  3                  [name]  =>  北原 里英                  [mail]  =>  kitarie@example.co.jp   ) 20
  • 21. ルールの制定 •  命名規則   –  変数名,テーブル名   •  ディレクトリ構成   •  コーディングスタイル   21
  • 22. メリットのまとめ •  開発工数の短縮   –  同じようなコードを繰り返し書かなくて良い     •  品質の均一化   •  保守性の向上   •  セキュリティの向上   –  ルールが統一されるため   22
  • 23. フレームワークのデメリット •  学習コストがかかる   •  どれが良いかわからない   –  CakePHP   –  Symfony   –  Zend  Framework   –  CodeIgniter   •  Kohana,  FuelPHP,  ……   23
  • 24. フレームワークの選定基準 •  実用性   –  安定性   –  機能,対応バージョン   •  開発の継続性   •  ライセンス   •  情報の入手しやすさ   24
  • 25.       CodeIgniter  の紹介   25
  • 26. CodeIgniter  とは •   [kóud ig・nít・er]   •  ignite:  [自動]  発火する    [他動]  点火する     •  無料,オープンソース (3.0  から  OSL)   •  2006年 2月に登場   •  EllisLab,  Inc.  が開発     *  CodeIgniter  and  its  logo  are  property  of  ElisLab  Inc.   26
  • 27. 「高速」 「軽量」 「低い学習コスト」 •  高速   –  他のフレームワークと比較しても圧倒的   –      CodeIgniter   ベンチマーク 検索 •  軽量   –  ソースの容量は約 1.2MByte   •  低い学習コスト   –  規約,覚えることが少ない   27
  • 28. とっつきやすい •  日本語のユーザガイドが完備   •  コマンドライン操作が不要   •  レンタルサーバでも幅広く動作   –  System  は原則,外部ライブラリを不使用   –  PHP  のバージョンや設定の違いを (ある程度)  吸収   •  ほとんど設定が不要 28
  • 29. Apple  も使ってる?   CodeIgniter hop://jobs.apple.com/index.ajs?method=mExternal.showJob&RID=92938 29
  • 30. CodeIgniter  の  URL hop://example.jp/hoge/index.php/  fuga  /  piyo  /  foo   機能名 操作名 引数   Controller    class  Fuga  extends  CI_Controller  {                              (中略)                      funcuon  piyo($arg1,  $arg2  =  ‘test’)  {                                      …                      }      } 30
  • 31.       CodeIgniter  の機能の一例   31
  • 32. フォーム検証   •  検証ルールをセット   –  $this-­‐>form_validauon-­‐>set_rules(      ‘name  属性の値’,        ‘表示名’,        ‘検証ルール’   );   •  検証   成功:  TRUE  /  失敗:  FALSE –  $this-­‐>form_validauon-­‐>run()   32
  • 33. フォーム検証   •  検証ルールの一例   ルール名 用途 required なにか入力されているか matches[hoge] 他のフィールドと一致するか   (例:  E-­‐mailの確認入力) max_length[n] 文字数が n  以内か alpha_numeric 半角英数字か valid_email E-­‐mail  アドレスとして正しい書式か –  複数指定するときはパイプ |  で区切る   –  自前のルールを定義することも可能   33
  • 34. フォーム検証   •  実際のコードの例:                                  :   検証ルールをセット                $this-­‐>_set_validauon();                  if  ($this-­‐>form_valida:on-­‐>run()  !==  TRUE)  {                                  //  検証失敗                  }  else  {   検証実行                                //  検証成功                  }   }   検証ルール funcuon  _set_valida:on()  {                  $this-­‐>form_validauon-­‐>set_rules('mail',  'E-­‐Mail',                                    'required|valid_email|max_length[100]');                  $this-­‐>form_validauon-­‐>set_rules('birth',  '生年月日',                                    'required|is_natural|exact_length[8]');   }           34
  • 35. フォーム検証   •  ユーザにエラーを表示 (検証失敗時)   –  set_value():  入力値   –  form_error():  エラーの内容     •  例)   <tr>                  <th>E-­‐Mail</th>                  <td><input  type="text"  name="mail"  size="30"                                                  value="<?php  echo  set_value('mail');  ?>"  />                                  <?php  echo  form_error('mail');  ?></td>   </tr>     35
  • 36. データベースアクセス •  対応 DBMS   –  MySQL,MS  SQL,Postgres,Oracle,SQLite    etc.   •  Acuve  Record   –  取得や挿入,更新を最小限のコードで   –  各 DBMS  間の SQL  構文の違いを吸収   –  値を自動的にエスケープ   ※  もちろん自分で SQL  文を書くことも可能   36
  • 37. Acuve  Record  の使用法 (の一部) •  取得:  get()   –  $query  =  $this-­‐>db-­‐>get(‘mytable’,  10,  20);     SELECT  *  FROM  `mytable`    LIMIT  20,  10;     •  条件を指定:  where()   –  $this-­‐>db-­‐>where(array(‘id’  =>  123));   $query  =  $this-­‐>db-­‐>get(‘mytable’);   SELECT  *  FROM  `mytable`  WHERE  id=123;   37
  • 38. Acuve  Record  の使用法 (の一部) •  挿入:  insert()   –  $data  =  array(                ‘7tle’  =>  ‘My  7tle’  ,                ‘name’  =>  ‘My  Name’  ,                ‘date’  =>  ‘My  date‘   );   $this-­‐>db-­‐>insert(’mytable’,  $data);   INSERT  INTO  `mytable`    (`7tle`,  `name`,  `date`)          VALUES  ('My  Title',  'My  Name',  'My  Date');   38
  • 39.       アプリを作ってみよう   39
  • 41. 開発の流れ 1.  機能を考える   2.  どんなデータを扱うかを考える   3.  テーブル構成を考える   4.  Controller,  View,  Model  の作成   41
  • 42. 実装する機能 •  コミュニティ情報   •  イベント情報   –  一覧表示,詳細表示   –  登録,編集,削除   42
  • 43. テーブル構成 •  コミュニティ情報  (communiues)   名前 型 用途 id int コミュニティ  ID name varchar コミュニティ名 comment text コメント •  イベント情報  (events)   名前 型 用途 id int イベント  ID community_id int コミュニティ  ID name char イベント 名 comment text コメント 43
  • 44. Model  の作成 •  テーブルごとに  1  つ   •  models/   –  communiues_model.php  .……  コミュニティ情報   –  events_model.php  ………………  イベント情報   44
  • 45. Model  の作成 •  例)  applicauon/models/  events_model.php     Class  Events_model  extends  CI_Model  {                          (中略)                    funcuon  get_row($id)  {                                  $this-­‐>db-­‐>where(’id',  $id);   クエリを組立                                  $query  =  $this-­‐>db-­‐>get(’event');                                  $result  =  $query-­‐>result();                                      return  $result[0];   実行結果を取得                  }     }   ※  Model 名とテーブル名は同じにするのがおすすめ   ※  実際には引数や結果の検査,例外処理が必要   45
  • 46. View  の作成 •  基本は  HTML   •  画面  (ページ)  ごとに  1  つ   •  共通部分はブロック化して  include   •  テンプレートパーサの利用   –  変数の出力   –  繰り返し制御   46
  • 47. Controller  の作成 •  機能ごとに  1  つのコントローラ   •  操作ごとに  1  つのアクション     •  controllers/   –  community.php  …  コミュニティ情報   •  アクション:    index(),    detail(),    add(),    edit(),    delete(),    …   –  event.php  ………….  イベント情報   •  アクション:    index(),    detail(),    add(),    edit(),    delete(),    …   47
  • 48. Controller  から Model,  View  をロード •  例)  applicauon/controllers/  event.php   Class  Event  extends  CI_Controller  {                                  :   Model  をロード                funcuon  detail($id)  {   1                                $this-­‐>load-­‐>model(‘Event_model’);   データを取得                                  $data[‘event’]  =     1 操                                                $this-­‐>Event_model-­‐>get_row($id);     作                                $this-­‐>load-­‐>view(’detail',  $data);   機              }   能   View  に渡す 1                funcuon  add()  {                                    :   操 作 48
  • 49.       実 演   49
  • 50.       おわり   50