CI框架-學習筆記
CodeIgniter框架
-
- 1、MVC
-
- 1.1、M:模型,提供數據,保存數據
- 1.2、V:視圖,只負責顯示,表單form
- 1.3、C:控制器,協調模型和視圖
- 1.4、action:動做,是控制器中的方法,用於被瀏覽器請求
-
- 2、CI中的MVC
- CI簡介:CodeIgniter是一個輕量級但功能強大的php框架,基於MVC的設計模式。提供了一套豐富的類庫
-
- 2.1、訪問的url使用的pathinfo
- 2.2、格式:入口文件/控制器/動做(默認pathinfo格式)
- 2.3、application目錄:
-
- Controllers控制器
- Models模型
- Views視圖
-
- 2.4、默認的控制器是welcome
- 2.5、默認的動做是index
- 2.6、文件名所有小寫
-
- 3、控制器(controller):
- 3.1、不須要加後綴,直接是類名.php
- 3.2、文件名所有小寫,例如 user.php(大寫的文件名瀏覽器不支持)
- 3.3、全部的控制器,直接或間接繼承自CI_Controller類,類名首字母大寫
- 3.4、方法名不區分大小寫
-
- 動做要求:1.必須以public開頭
-
- 2.不能如下劃線(_)開頭
- 注意!方法名與類名相同,會被php當作構造方法(__construct)
-
- 4、視圖(view)
-
- 4.1、在控制器中加載視圖:$this->load->view(「user_add」);//不加擴展名
- 4.2、在控制器中加載視圖:$this->load->view(「user/add」);//不加擴展名
- 注意:能夠屢次調用$this->load->view(視圖);
- 4.3、視圖中,直接使用原生php代碼
- 4.4、在控制器中分配變量:$this->load->vars(「視圖中變量名」,php中變量名);
-
- 例如:$str=「abcdefg」;
- $this->load->vars(「str」,$str);
- 視圖中使用:<?php echo $str;?>
-
- 4.5、在控制器中分配多個變量:
-
- 例如:$str=「abcd」;
- $list = array(「id」=>」1」,」name」=>」zhangsan」,」pwd」=>」1234」);
- $data[「str」]= $str;
- $data[「list」]= $list;
- $this->load->vars($data);
-
- 4.6、CI框架會本身解決php中的短標籤<?=…?>
- 4.7、推薦使用:<?phpforeach($listas $key=>$val):?>…<?php endforeach;?>
-
- 5、超級對象:當前控制器對象,提供了不少屬性
-
- 5.1、$this->load屬性
- 5.1.1、裝載器類的實例 system/core/Loader.php
- 5.1.2、CI_Loader提供的方法:
- $this->load->view()裝載視圖
- $this->load->vars()分配變量到視圖
- $this->load->database()裝載數據庫操做對象
- $this->load->model()裝載模型對象
- $this->load->helper()幫助對象
- $this->load->view(「視圖名」,$變量名)裝載視圖時分配變量
-
- 5.2、$this->uri屬性
- 5.2.1、裝載器類的實例 system/core/URI.php
- 5.2.2、CI_URI提供的方法:
- $this->uri->Segment(n)用於獲取URL中的第n個參數
- 控制器表明1,動做表明2,值1表明3,值2表明爲4…
- 用法1:入口文件/控制器/動做/值1/值2
- echo $this->uri->segment(3);//輸出值1
- 用法2:index.php/控制器/動做/6
- //能夠直接獲取;參數必定要對應正確
- publicfunction($id=0){
- echo $id;//輸出6
- }
-
- 5.3、$this->input屬性
- 5.3.1、裝載器類的實例 system/core/Input.php
- 5.3.2、CI_Input提供的方法:
-
- $this->input->post(‘username’);//$_POST[「username」];
- $this->input->server(「DOCUMENT_ROOT」);//$_SERVER[「DOCUMENT_ROOT」]
- $this->input->server(「REMOTE_ADDR」);//客戶端IP
- $this->input->server(「SERVER_ADDR」);//服務器端IP
- 注意:在視圖中,能夠直接用$this來訪問超級對象中的屬性
-
- 6、訪問數據庫
-
- 6.1、修改配置文件:application/config/database.php
- 6.2、裝載數據庫操做類:$this->load->database();
- 加載成功後,會放入超級對象的屬性中,默認屬性名是db
- $this->db
- 6.3、$query= $this->db->query($sql);//返回值是對象(array_fetch_object)
- $sql = $this->db->last_query($sql);//顯示最後一條執行的sql語句
- 6.3.1、$query= $this->db->escape();//此函數會肯定數據類型,對字符串類型數據轉義
- 6.4、$list= $query->result();//返回數組,數組中是一個一個的對象
- 6.5、$list= $query->result_array();//返回二維數組,裏面是關聯數組
- 6.6、$row= $query->row();//返回第一條數據,直接是一個對象
- 6.7、$row= $query->row_array();//返回第一條數據,是一個數組
- 6.8、$count= $query->num_rows();//返回結果集的行數
- 6.9、$field= $query->num_fields();//返回請求的字段數
- 6.10、$count= $query->affected_rows();//返回受影響的行數
- 6.11、$id= $query->insert_id();//返回自增ID
-
- 7、數據庫中的配置
- 7.1、自動加載db:
- 在application/config/autoload.php中配置:
- $autoload[「libraries」]= array(「database」);
- 這樣就不須要 $this->load->database();
-
- 7.2、參數綁定
- $name = $this->input->post(「name」);
- $pwd = $this->input->post(「pwd」);
- //使用問號綁定參數
- $data[0]= $name;
- $data[1]= $pwd;//用二維數組傳遞值
- $sql =「insertinto ci_user(name,pwd) values (?,?)」;//多個問號,須要傳一個索引數組
- $bool = $this->db->query($sql,$data);//返回值是boolean
- 7.3、表前綴配置
- 在application/config/database.php中配置:
- $db[‘default’][‘dbprefix’]=‘ci_’;
- $db[‘default’][‘swap_pre’]=‘ci_’;
- 配置爲同樣,代碼中,直接編寫表前綴後面的名就好了,若是之後項目表前綴發生變化,只須要修改$db[‘default’][‘dbprefix’]=‘new_’,代碼中ci_會自動替換爲new_
-
- 8、數據庫操做(AR模型)
- 8.1、配置application/cinfig/database.php中
- $active_record = TRUE;
- 8.2、在配置文件中,配置表前綴後,會自動添加
- 8.3、查找(get):
- $res = $this->db->get(‘表名’);//返回結果集對象
- $list = $res->result();//返回數組,數組中是一個一個的對象
- $list = $res->result_array();//返回二維數組,裏面是關聯數組
- 8.4、插入(insert):
- //數據使用關聯數組
- $data[「數據庫字段名」]=值;//$this->input->post(「name」);
- $data[「數據庫字段名」]=值;
- $res = $this->db->insert(「數據表名」,$data);//返回結果boolean;
- 8.5、修改(update):
- //數據使用關聯數組
- $data[「數據庫字段名」]=值;//$this->input->post(「name」);
- $data[「數據庫字段名」]=值;
- $where = array(「id」=>」4」);
- $res = $this->db->update(「數據表名」,$data,$where);//返回結果boolean;
- 8.6、刪除(delete):
- $where = array(「id」=>」4」);
- $res = $this->db->dalete(「數據表名」, $where);//返回結果boolean;
-
- 9、AR的連貫操做
-
- 9.1、$res= $this->db->select("id,name")//查找的字段
- ->from("user")//數據表名
- ->where("id >",3)//條件 id與>之間必需要有空格
- ->order_by("id desc")//排序
- ->limit(3,1)//分頁;表示跳過1條,取3條,與tp相反
- ->get();//獲取數據
- $list = $res->result_array();
- 9.2、where()條件
- 條件符:「>」、「>=」、「<」、「<=」、「=」、「!=「;不指定條件付默認是」=「
- 1、只有單個條件時:
- 9.2.1、$res= $this->db->where(「字段」,」值」)->get();
- 例如:$res= $this->db->where(「name」,」admin」)->get();//自動會加上「=」
- 9.2.2、$res= $this->db->where(「字段=」,」值」)->get();
- 例如:$res= $this->db->where(「name=」,」admin」)->get();//必需要有空格
- 2、有多個條件時:用array()
- 9.2.3、$res= $this->db->where(array(「字段」=>」值」,「字段」=>」值」))->get();
- 例如:$res= $this->db->where(array(「name」=>」admin」,「id>3」=>」2」))->get();
- 9.2.4、複雜的查詢語句使用$this->db->query($sql,$data);//使用問號綁定參數
- 9.3、join鏈接查詢
- 9.3.1、默認爲左查詢(left join … on)
- $this->db->select(「字段」)
- ->from(「數據表名」)
- ->join('鏈接表','鏈接條件')
- ->get(); //默認爲左查詢(left join … on) 例如:
- $this->db->select(「*」)
- ->from(「user」)
- ->join('category', user.id= category.id)//默認爲左查詢(left join )
- ->get();
9.3.二、經過join()第三個可選參數選擇鏈接,可選參數包括:left、 right、outer、 inner、left outer、right outer
- 例如:
- $this->db->select(「*」)
- ->from(「user」)
- ->join(「category」, 「user.id = category.id」,」left」)//經過第三個參數指定
- ->get();
- 十、擴展CI控制器
-
- 10.一、擴展控制器
- 一、在application/core新建一個本身的控制器(MY_Controller),新建的控制器繼承CI_Controller類,能夠從本身建立的控制器中進行擴展。
- 例如:class MY_Controller extends CI_Controller{
- Public function __consreuct(){
- Parent::__construct(); //調用父類的構造方法
- //登錄驗證
- //權限驗證
- }
- }
- 二、讓welcome.php繼承本身建立的控制器(MY_Controller),間接繼承CI_Controller。
- 三、控制器前綴能夠修改
- 在application/config/config.php中修改:
- $config['subclass_prefix'] = 'MY_';
- 十一、模型(model)
- 11.一、模型文件命名:user_model.php 、category_model.php,文件名小寫
- 建議:模型文件名使用_model爲後綴,防止與控制器類名衝突!
- 11.二、全部的模型,直接或間接繼承自CI_Model類,類名首字母大寫
- 11.三、裏面建立所須要的方法:getAll()…
- 11.四、控制器中加載模型:$this->load->model(「模型文件名」); //不加後綴
- 11.五、控制器中加載模型時起別名:$this->load->model(「模型文件名」,」別名」);
- 加載成功後,會放入超級對象的屬性中,默認屬性名是模型文件名或別名
- 11.六、控制器中調用模型,獲取數據:$this->模型文件名->方法名();
- 例如:$this->load->model(「User_model」); //注意大小寫
- $this->User_model->getAll(); //調用模型,獲取數據
- 11.6.一、控制器中調用模型,獲取數據:$this->別名->方法名();
- 例如:$this->load->model(「User_model」,」user」); //注意大小寫
- $this->user->getAll(); //調用模型,獲取數據
- 十二、CI中url相關函數
- 12.一、加載輔助函數:$this->load->helper(「url」);
- 配置自動加載輔助函數:在application/config/autoload.php中配置
- $autoload['helper'] = array('url');
- 就不用寫$this->load->helper(「url」);
- 輔助函數:
- site_url(「控制器/動做/參數」) ; //處理url及參數
- 在視圖中使用<?php echo site_url(「控制器/動做/參數」)?>
- base_url();//返回網站的根目錄(「ci/」);
- 1三、CI中的路由與僞靜態、隱藏index.php入口文件
- 13.一、路由設置
-
- 在application/config/routes.php中設置/修改:
-
- $route['default_controller'] = "welcome"; //默認的控制器爲welcome
-
- 13.二、僞靜態設置
- 在application/config/routes.php中設置/修改:
- //正則匹配(控制器/)
- $route['news/[\d]{6}/([\d\w]+)\.html'] = 'user/show/$1';
- http://localhost/CI/index.php/news/201401/caolizhi66.html
- 將動做news中的參數路由到user/show/$1
-
- 13.三、隱藏入口文件index.php
- 13.3.一、開啓apache配置文件:LoadModule rewrite_module modules/mod_rewrite.so
- 13.3.二、在入口文件統計目錄中,建立一個.htaccess文件,內容以下:
- <IFModule mod_rewrite.c>
- RewriteEngine on //啓用僞靜態
- RewriteCond %{REQUEST_FILENAME} !-d //匹配不存在的目錄
- RewriteCond %{REQUEST_FILENAME} !-f //匹配不存在的文件
- RewriteRule ^(.*)$ index.php/$1 [QSA,PT,L] //重寫規則
- </IFModule>
-
- 這樣就不用寫入口文件index.php了
-
- 1四、CI中的分頁
- $this->load->library('pagination');
- 1 $config['base_url'] = $url;
- 2 /* 分頁的基礎 URL
- 3 若是你想用a、b的連接形式,則該url應該形式如/news/page/
- 4 若是連接是c、d的形式,則url應該如/news?
- 5 */
- 6 $config['total_rows'] = $total;//記錄總數,這個沒什麼好說的了,就是你從數據庫取得記錄總數
- 7 $config['per_page'] = $pagesize; //每頁條數。額,這個也沒什麼好說的。。本身設定。默認爲10好像。
- 8 $config['page_query_string'] = TRUE;
- 9 /*傳參形式。開啓true則會自動在你的url後面加上&per_page=3。(這個per_page是默認的查詢字符,固然你也能夠用$config['query_string_segment']來本身設定)
- 10 所以c、d中的形式通常是爲localhost/news?&per_page=2不過都同樣,沒什麼影響。get的per_page仍是3
- 11 */
- 12 $config['first_link'] = '首頁'; // 第一頁顯示
- 13 $config['last_link'] = '末頁'; // 最後一頁顯示
- 14 $config['next_link'] = '下一頁>'; // 下一頁顯示
- 15 $config['prev_link'] = '<上一頁'; // 上一頁顯示
- 16 $config['cur_tag_open'] = '<aclass="current">'; // 當前頁開始樣式
- 17 $config['cur_tag_close'] = '</a>';
- 18 /*當前頁結束樣式。這些你能夠本身嘗試一下。
- 19好比說我想讓當前頁的分頁數字樣式好看一點,紅色字體等。你就能夠在current上加上css代碼
- 20*/
- 21 $config['num_links'] = 2;//當前鏈接先後顯示頁碼個數。意思就是說你當前頁是第5頁,那麼你能夠看到3、4、5、6、7頁。
- 22 $config['uri_segment']=4;
- 23/*這個是你在用a)、b)連接樣式的時候,用來判斷頁頁數。
- 24 好比localhost/news/page/3 這個uri_segment就要設定爲3。localhost/news/title/page/3這個就要設定爲4
- 25 */
- 26 $config['use_page_numbers']= TRUE;
- 27/*這個就是a)、b)的差異了。開啓了,page就會表示頁數。false就會表示記錄數
歡迎關注本站公眾號,獲取更多信息