CI 框架簡單入門筆記

牙小木木發表於2019-02-16

1.mvc一般思路

C層: 入口檔案-URL獲取控制器$_GET[`c`]和方法$_GET[`a`]–包含c的檔案類(控制器檔案)- 例項化c控制器物件-呼叫方法a(並協調模型和檢視),C層不直接呼叫DB,下面會有提到。

V層: 在C層中include views下對應的檔案即可展現C中變數,require ./views/xxView.html

M層:通過連線DB獲取所有的資料,return 給C層,這時候需要在C層require ./models/xxModel.php,最後在C中通過view 讓資料顯示出來。注意M只提供資料,做資料複用

注意action 是控制器中的方法,用於被瀏覽器直接請求

目錄結構

index.php

Model

UserModel.class.php

View

index.html

Controller

UserController.class.php

2.CI中的pathinfo訪問模式

入口檔案/控制器/方法

其中action中為protected functon 和private 不能被瀏覽器請求,注意Controller檔名需要小寫。方法中action (public functions)不能用_開始。

方法名不區分大小寫。

CI中都extends CI_CONTROLLER,注意字首都為CI

注意不要建立Index控制器的index方法,類名相同的會當作構造方法。因為CI的控制器沒有字尾,所以類名會和方法名一樣,導致建構函式載入。

3.CI中的檢視

檢視檔案可以用下劃線區分,例如user_區分,但一般都建立單獨的資料夾,可以直接load檢視,不用寫副檔名。

$this->load->view(`user/index`);
$this->load->view(`user_index`);

注意檢視中可以直接寫php原始碼。

CI中如果沒用smarty ,如果需要載入變數可以用

$this->load->var(`title`,`this is title`);

如果是二維陣列,

$data[]=1;
$data[]=2;
$this->load->var($data);

可以多次load view,以載入不同的view公共部分。

推薦使用

<?php foreach ($list as $item):?>
<?=$item[`id`]?>
<?=$item[`name`]?>
<?php endforeach;?>

4.CI的超級物件-LOAD

$this->load ===

$obj=new CI_LOADER();
$this->load=$obj;
$this->load->view();

注意但ci並不是做的自動載入,並不是以上面那種方式執行的。當時有面試官還問過,我以為所有的框架都是spl_autoload_register,真是汗顏..

load的屬性有view var database model helper

5.CI的超級物件-CI_URI類

分段獲取
segment 從入口檔案.php後,分斷獲取
$this->uri->segment(4)是按照index.php/後面開始的第一個段開始。

之前的:入口檔案.php/控制器/動作/引數1/值1/引數2/值2
CI中: 入口檔案.php/控制器/動作/值1/值2

$this->segment(3);//值1
$this->segment(4);//值2

可以在方法的引數中傳遞引數,ci會按照順序獲取值

index.php/控制器/index/6/12

public function index($p=0,$age){
    echo $p,$age;//6,12
}

6.CI的超級物件 input物件

CI_INPUT類

$this->input->post(`username`);

注意get的引數 用uri分段獲取..

$this->input->server(`DOCUMENT_ROOT`)

檢視裡也可以通過$this訪問超級物件,因為就是include進來的

7.CI中的資料庫操作

資料庫訪問SQL

先配置config/database.php

裝載資料庫操作類,可以載入多個資料庫

$this->load->databases();
//var_dump($this->db);
$res=$this->db->query("select * from user");// return object
$user_list=$res->result();
//注意返回的返回陣列下的某(多)個物件,對應mysql_fetch_object

$data[`user_list`]=$user_list
$this->load->view(`user/list/`,$data)//view 層用 user_list展現

$res->result_array();返回關聯陣列
$res->row();返回第一條資料,也是個物件
$res->row_array();返回第一條資料,陣列

更多官方參考

插入資料

$this->load->database();//可以在auto中自動載入db類

$sql="insert into user (`name`,`pwd`) values(`tom`,`md5(123)`)";

$this->db->query();//MYSQL_QUERY() [return RES or BOOL]

MYSQL_AFFECT_ROWS 對應CI中的$this->db->affect_rows();
MYSQL_INSERT_ID 對應CI 中的 $this->db->insert_id();

用此db處理方法,第一需要自己寫表字首,第二需要自己處理安全措施。

表字首可以藉助配置檔案讀取 常量,CI中有**SWAP_PRE**,交換的字首來處理表字首。萬一資料庫表字首修改,只需要修改DBPREFIX就行了。

安全措施可以藉助 $this->input->post(`name`);

$data[0]=`tom`;
$data[1]=`123`;

引數繫結插入

$sql="insert into user (`name`,`pwd`) values(`?`,`?`)";

將data拼裝為陣列,作為$this->db->query($sql,$data);

引數繫結查詢

$sql="select * from user where username=?";
$this->query($sql,$username);

8.CI中的AR模型

是CI中訪問資料庫的第二種方式,第一種就是上面的load->database();增刪改差 都是query。需要寫大量sql語句

配置檔案autoload 自動載入database

$auto_load[`librarys`]=array(`database`);

CI_DB_ATCIVE_record extends ci_db_driver

config/database中的active_record需要開啟,這樣才會繼承ACTIVE

$res=$this->db->get(`user`);//user 表名,會自動加表字首

var_dump($res->result);

插入:

$data=[`name`=>`tom`,`pwd`=>`md5(123)`];
$this->db->insert(`user`,$data);//表名+關聯陣列=》return bool

修改:

$data=[`email`=>tom@126.com,`pwd`=>`md5(1234)`];
$this->db->update(`user`,$data,array(`id`=>3));// 表名,資料,where 條件。=?return bool

刪除

$this->db->delete(`user`,array(id=>3));

AR中連貫操作

$this->db
    ->select(`id,name`)//欄位名
        ->where (`id  `>=3)//需要有空格
        ->limit(3,2)//跳過2條,取三條
        ->order_by(`id desc`);
        ->get();

除錯sql語句輸出最後一條sql ,可以結合log函式輸出到指定日誌檔案

$this->db->last_query();

$res=$this->db->where(`name`,`tom`)->get(`USER`);//SELECT * FROM USER WHERE NAME=TOM;

具體可點選這裡檢視更多連貫操作

如果太複雜的,那就寫SQL吧,記得用?繫結引數,過濾接受引數等

自增id

$this->db->insert_id();

受影響行

$this->db->affect_rows();

9.對CI控制器擴充套件

APPLICATION和SYSTEM資料夾中相同的部分 ,只需要在application中對應的Core中寫MY_擴充套件。
比如在application/core/MY_Controller.php

class MY_Controller extends CI_Controller{
    
        public function __construct(){
            parent::construct();
            //登入驗證

        }
}

可以修改類字首 在
config/config.php/$config[`subclass_prefix`]中,預設為MY_

10.CI中的模型Model

一些注意事項:檔案需要全小寫,但是類名要大寫,並且需要用User_model,為了和控制器保持區分不衝突。

在模型MODEL中可以用所有超級物件的屬性,可以具體檢視system/core/CI_MODEL.php 檔案

不要在控制器直接呼叫$this->db->get()文章頭提到【雖然可以實現相同功能,但是很不規範】應該放在model中,控制器中只允許從user_model中load

user controoler中程式碼:在控制器中載入模型

$this->load->model(`user_model`);//第二個引數為別名,可選

 $list=$this->user_model->getall();
 $this->load->view(`user/index`,array(`list`=>$list));

user_model程式碼:

 class user_model extends ci_model{
    public function getall(){
        $res=$this->db->get(`user`);
                return $res->result();
    }
}

11.url相關函式

需要手動載入:

$this->load->helper(`url`);

解決不同環境,不同路徑的問題
site_url
base_url
類似與wordpress那些東西

可以自動載入

 $autoload[`helper`]=array(`url`)

12.路由配置

預設控制器 default_controller

通過路由規則,實現url與實際控制器相分離.實現url的高度定製

http://site.com/index.php/news/20170108/4.html
$route[`news/[d]{6}/([d]+.html)`]=`article/show/$1`

另外結合apache/nginx的rewrite 隱藏index.php

13.分頁

$this->laod->library(`pagination`);

注意load url,然後用site_url,放入page的初始化函式中,用segment獲取對應的intval(段),作為offset

CI中更多細節請點這裡

相關文章