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