控制器
1.文件名不須要加後綴,所有小寫
2.類名首字母大寫,繼承CI_Controller基類
3.如下劃線開頭或者非public的方法不能被瀏覽器請求
4.在config/routes.php中能夠配置默認控制器$route['default_controller']
5.與類名相同(不管大小寫)的方法會被當作類的構造方法
視圖
1.在控制器中若是加載視圖,直接使用視圖名字,不寫擴展名,若是有子目錄,則寫上目錄名:
$this->load->view(視圖);
能夠屢次調用。
分配變量時,能夠在載入視圖時分配(第二個參數,關聯數組或單個變量),也可使用:
$this->load->vars(name, value);
2.視圖中,直接使用原生php代碼,也能夠移植smarty
3.循環輸出變量時,推薦使用
<?php foreach($list as $item):?>
<?=$item['name']?>
<?=$item['value']?>
<?php endforeach?>
這種寫法在php5.4以上被支持,即便不支持,CI也會自動處理好以使這種寫法有效。
更多的還有if、for、while等。php
1.控制器文件名與類名相同,類名首字母大寫,繼承CI_Controller基類。
不須要加後綴。如下劃線開頭的方法不能被瀏覽器請求。
2.載入視圖文件使用$this->load->view('view.html');後綴名能夠不寫。
能夠按文件夾載入$this->load->view('folderpath/view.html')。
3.給視圖分配數據,直接在載入視圖時添加第二個參數便可。載入多個
視圖時,一樣的數據分配一次則便可。能夠分配變量,也能夠是數
組(數組中的每個元素都被分配給變量)。
4.載入輔助函數使用$this->load->helper('name');能夠在autoload.php
中配置自動加載函數。html
***CI中讀取配置項使用config_item()函數,修改配置項使用$this->config->set_item('name', 'value')
5.url輔助函數:
site_url() 以index.php單入口文件結束的網站url
base_url() index.php單入口文件所在目錄的url
index_page() 單入口文件名
current_url() 當前的url
redirect() 重定向到指定的url,參數:url,重定向方式,狀態碼
6.自定義函數能夠添加到system/core/Common.php中,會全局自動加載
7.超級對象
$this->load屬性其實是相似這樣實現的(僅用於理解):
$obj = new CI_Loader();
$this->load = $obj;
CI_Loader()是裝載器類/system/core/Loader.php的實例
方法:
view() 裝載視圖
vars() 分配變量
database() 裝載數據庫操做對象
model() 裝載模型對象
helper() 裝載輔助函數
...
$this->uri是/system/core/URI.php CI_URI類的實例,用於處理URL。
傳統pathinfo:入口文件.php/控制器/動做/參數名1/參數1/參數2/參數2/參數3/參數3...
CI中的pathinfo:入口文件.php/控制器/動做/參數1/參數2/參數3...
在CI中,使用pathinfo方式的URL時沒法直接經過$_GET['var']的方式
獲取參數,只能經過$this->uri->segment(n)的方式獲取第n個參數
能夠設置方法的默認參數
$this->input是/system/core/Input.php CI_Input類的實例
$this->input->post('var');
$this->input->get('var');
$this->input->get_post('var');
$this->input->server('var');
$this->input->cookie('var');
$this->input->set_cookie('var');
$this->input->ip_address('var');
$this->input->user_agent('var');
....
在視圖中能夠直接使用$this訪問超級對象
使用這種方法獲取的參數已經通過安全處理
$this->db 是system/database/drivers/mysql/mysql_driver.php CI_DB_mysql_driver的實例
使用前須要先配置數據庫,而後使用$this->load->database()裝載。
$this->load->database('name'); //裝載時能夠傳入參數以選擇不一樣的數據庫配置,這裏對應
$db['name']這一組配置項。
$res = $this->db->query('sql語句'); //執行sql語句,若是是增刪改則返回布爾值。
//$affect_rows = $this->db->affected_rows();
//$insert_id = $this->db->insert_id();
$result = $res->result(); //由查詢結果組成的一維數組,每條結果爲一個對象。
其實是調用了mysql_fetct_object()方法。
$result = $res->result_array(); //二維數組,每條結果爲一個關聯數組。
$result = $res->row(); //返回第一條數據的對象數組,相似與TP的find方法。
$result = $res->row_array(); //返回第一條數據的關聯數組。
PDO參數綁定:
$sql = "SELECT name,value,desc FROM tbname WHERE name=? AND pwd=?";
$data[0] = $this->input->post('name'); //傳入對應的索引數組
$data[1] = $this->input->post('pwd');
$res = $this->db->query($sql, $data);
動態表前綴須要設置交換表前綴
全部執行的sql語句中的交換表前綴都會被替換成實際使用的表前綴
$db['default']['swap_pre'] = 'swap_';
$db['default']['dbprefix'] = 'blog_';
$sql = 'SELECT FROM swap_user WHERE id>100';
這樣就至關於'SELECT FROM blog_user WHERE id>100'。
建議使這兩個配置項相同,當須要更改表前綴時只要修改dbprefix便可。
數據庫的自動加載:
配置application/config/autoload.php中$autoload['libraries'] = array('database')便可
AR模型:mysql
1. application/config/database.php $active_record = TRUE; 2. 必須先設置數據庫自動加載 3.在配置文件中,配置表前綴名,會自動添加 獲取: $res = $this->db->get('表名');//返回結果集對象 插入: $data = array('name'=>'mary', 'passwd'=>md5('mary')); $bool = $this->db->insert('user', $data); $last_id = $this->db->insert_id(); $affected_rows = $this->db->affected_rows(); 更新: $bool = $this->db->insert('user', $data, array('id'=>3)); 刪除: $where = array('name like'=>'zhang%', 'id >='=>3); $bool = $this->db->delete('user', $where); 連貫操做: $res = $this->db->select('name', 'id', 'sex') ->from('user') ->where('id >=', 3) #***注意查詢條件id與>=之間的空格*** ->limit(2, 3) #***這裏的limit參數順序和mysql語句中的limit參數相反!!!*** ->order_by('id desc') ->get(); #***不要忘了get*** var_dump($res->result()); echo $this->db->last_query(); #最後一條執行的sql語句
1.文件名全小寫,類名首字母大寫,建議增長_model後綴, 須要繼承CI_Model。構造函數中必須先執行parent::__construct()。 ***當方法名與類名相同時會被視做構造方法*** 2.在模型中能夠直接使用超級對象的屬性。 例: controllers\user.php\User class //加載模型並指定別名,加載後自動成爲超級對象的屬性 $this->load->model('User_model', 'user'); //首字母大小寫無所謂 //$data = $this->User_model->getAll(); //獲取數據,這裏使用的是別名 $data = $this->user->getAll(); $this->load->view('user/index', array('list'=>$list)); models\user_model.php\User_model class public function getAll(){ $res = $this->db->get('user'); return $res->result(); }
10.路由
application/config/routes.php
$route['default_controller'] = 'welcome';
$route['show/([\d]+).html'] = 'welcome/index/$1';
直接在配置文件中配置路由規則便可。
隱藏入口文件
開啓apache的rewrite模塊,在htpd.conf中開啓;
在網站根目錄添加.htaccess文件。
11.分頁
$thsi->load->library('pagination');
$this->load->helper('url');
$page_size = 10;
$config['base_url'] = site_url('user/test');
$config['total_rows'] = 100;
$config['per_page'] = $page_size;
$config['first_link'] = '首頁';
$config['last_link'] = '尾頁';
$config['pre_link'] = '上一頁';
$config['next_link'] = '下一頁';
$config['uri_segment'] = 3;
$this->pagination->initialize($config);
$offset = intval($this->uri->segment(3));
$sql = "select * from blog_user limit $offset, $page_size";
12.文件上傳(上傳目錄須要手動建立)
$config['upload_path'] = './uploads/';
$config['allowed_types'] = 'gif|png|jpg|jpeg|';
//生成文件名
$config['filename'] = uniqid();
//裝載文件上傳類
$this->load->library('upload', $config);
//這裏的pic爲input的name
$this->upload->do_upload('pic');
//獲取上傳成功後返回的數據
$data = $this->upload->data();
$filename = $data['filename'];
13.Session
CI的session實際上存儲在cookie中,而且cookie的大小不能超過4kb,
保存和讀取時都會將session數據與加密字符串鏈接並進行md5校驗,
若是讀取時校驗失敗則session失效。所以必須保證加密字符串不被泄露。
配置session加密:$config['sess_encrypt_cookie'] = TRUE;
Login class\login method
//裝載session類並設置session
$this->load->library('session');
$user = array('id'=>3, 'name'=>'jack');
$this->session->set_userdata('user', $user);
//設置一次性數據,獲取一次後即失效
$this->session->set_flashdata('test', 'aaaaaa');
//在這裏是沒法直接獲取到的,只有本方法被從新請求或跳轉到其餘URl時才能獲取到
//生成加密key,將這個key配置爲$config['encryption_key']便可
//$encryption_key = md5(uniqid());
Login class\login_check method
$this->load->library('session');
$user = $this->session->userdata('user');
//獲取flash數據,讀取一次後失效,主要用於跳轉回以前頁面
echo $this->session->flashdata('test');
14.驗證碼
1.必須在網站根目錄手動建立captcha文件夾
2.載入驗證碼類
$this->load->helper('captcha');
3.配置參數並生成驗證碼(img標籤)
$vals = array(
'img_path' => './captcha/',
'img_url' => base_url() . 'captcha/',
'img_width' => '150',
'img_height' => '30',
//能夠自定義驗證碼字符串
'word' => rand(1000,9999),
//若是是中文驗證碼,須要指定中文字體
'font_path' => './path/to/fonts/texb.ttf',
//過時時間(s),每次生成驗證碼時會刪除過時的驗證碼
'expiration' => 7200
);
$cap = create_captcha($vals);
echo $cap['image'];
4.將驗證碼字符串放到數據庫或原生session中
$_SESSION['cap_str'] = $cap['word'];
15.表單驗證
$this->load->library('form_validation');
$this->form_validation->set_rules('name', '用戶名', 'required');
$this->form_validation->set_rules('email', '郵箱', 'valid_email');
$bool = $this->form_validation->run();
if($bool){
//成功後的操做
}else{
//失敗後則返回
$this->load->view('user/add');
}
在視圖中能夠這樣輸出全部錯誤:
<?php echo validation_errors(); ?>
<?php echo form_error('name', '<span>', '</span>')?>
同時能夠經過set_value()函數保存以前的表單數據:
<input type="text" name="username" value="<?php echo set_value('username')?>" />sql