=====================================
CodeIgniter框架(鄒義良老師講課大綱)
=====================================
主要內容
CI簡介
深刻MVC設計模式
CI中控制器與視圖
CI的超級對象
數據庫訪問
AR模型
如何擴展CI的控制器
模型
url相關函數
設置路由
隱藏入口文件
分頁
文件上傳
Session
驗證碼
表單驗證php
-------------------------------------html
CI是什麼?
CodeIgniter是一個輕量級但功能強大的PHP框架
基於MVC設計模式,提供了一套豐富的類庫
簡單易學,高效實用sql
官方網站
www.codeigniter.com
中文網站
http://codeigniter.org.cn
下載當前最新版本
CodeIgniter_2.1.4.zip
有什麼特色?
你想要一個小巧的框架
你須要出色的性能
你須要普遍兼容標準主機上的各類 PHP 版本和配置
CI 2.1.4 須要 PHP5.1.6
你想要一個幾乎只需 0 配置的框架
你想要一個不需使用命令行的框架
你想要一個不需堅守限制性編碼規則的框架
你不但願被迫學習一門模板語言(雖然能夠選擇你喜歡的模板解析器)
你不喜歡複雜,熱愛簡單
你須要清晰、完整的文檔數據庫
目錄結構說明
license.txt 許可協議
user_guide 用戶手冊
system 框架核心文件
application 應用目錄
index.php 入口文件
------------------------------
MVC
1.入口文件
惟一一個讓瀏覽器直接請求的腳本文件
2.控制器controller
協調模型和視圖
3.模型model
提供數據,保存數據
4.視圖view
只負責顯示
表單...
5.動做action
是控制器中方法,用於被瀏覽器請求
CI中的MVC
訪問url使用的是pathinfo
入口文件.php/控制器/動做
application目錄中:
controllers 控制器
models 模型
views 視圖
默認控制器是welcome
默認動做是index
控制器
1.不須要加後綴
2.文件名所有小寫 例如 user.php
3.全部的控制器,直接或間接繼承自CI_Controller類
4.控制器中,對動做(方法)要求:
public
不能以_開頭
視圖
1.在控制器中若是加載視圖
//直接寫視圖名字,不寫擴展名,若是有子目錄,則寫上目錄名
$this->load->view(視圖);
能夠屢次調用$this->load->view(視圖);
2.視圖中,直接使用原生php代碼
3.推薦使用
<?php foreach($list as $item):?>
<?=$item['name']?>
<?php endforeach;?>
超級對象
當前的控制器對象
提供了不少屬性:
$this->load
裝載器類的實例system/core/Loader.php
裝載器類提供方法:
view() 裝載視圖
vars() 分配變量到視圖
database() 裝載數據庫操做對象
model() 裝載模型對象
helper()
$this->uri
是CI_URI類的實例 system/core/URI.php
CI_URI類提供方法:
segment(n) 用於獲取url中的第n個參數(值)
傳統的:入口文件.php/控制器/動做/參數1/值1/參數2/值2
入口文件.php/控制器/動做/值1/值2
echo $this->segment(3);//值1
echo $this->segment(4);//值2
//index.php/控制器/index/6
public function index($p=0){
echo $p;//輸出6
}
上面說明不必定要使用segment參數,直接在方法中說明參數,就能夠接受地址欄中的分段參數
apache
$this->input
輸入類
是CI_Input類的實例 system/core/Input.php
CI_Input類提供方法:
$this->input->post('username'); //$_POST['username']
$this->input->server('DOCUMENT_ROOT'); //$_SERVER['DOCUMENT_ROOT']
在視圖中,直接用$this來訪問超級對象中的屬性,原理就是將視圖include到控制器的PHP文件中了。
數據庫訪問
修改配置文件
application/config/database.php
將數據庫訪問對象,裝載到超級對象的屬性中 $this->db
$this->load->database();
$sql='select * from blog_user';
$res=$this->db->query($sql);//返回對象
$res->result();//返回數組,數組中是一個一個的對象
$res->result_array();//返回二維數組,裏面是關聯數組
$res->row()//返回第一條數據,直接是一個對象
在SQL語句中使用參數,並將參數綁定到?
$name='lily';
$sql="select * from blog_user where name=?";
$this->db->query($sql,$name);//若是有多個問號時,須要傳入一個索引數組
如:
$data[0]='lily';
$data[1]='lily';
$sql="insert into blog_user(name,password) vlaues(?,md5(?))";
$this->db->query($sql,$data);
if ($bool)
{
echo '受影響行數:'.$this->db->affected_rows();
echo '自動ID:'.$this->db->insert_id();
}設計模式
表前綴
$db['default']['dbprefix'] = 'blog_';
$db['default']['swap_pre'] = 'new_';
配置爲同樣,代碼中,直接硬編碼表前綴就好了,若是之後項目數據庫表前綴發生變化,
只須要修改$db['default']['dbprefix'] = 'new_';代碼中的blog_會自動替換爲new_
即:$sql="insert into new_user(name,password) vlaues(?,md5(?))";
未來運行的時候,會將new_替換爲blog_,這樣,就能夠省了好多事
仔細想一想,應該是寫成同樣的,之後修改的時候,就能夠了。數組
db的自動加載
application/config/autoload.php
$autoload['libraries'] = array('database');
不須要:$this->load->database();
自增id
$this->db->insert_id();
受影響行數
$this->db->affected_rows();瀏覽器
Active Record
1.application/config/database.php
$active_record = TRUE;
2.application/config/autoload.php
$autoload['libraries'] = array('database');
3.在配置文件中,配置表前綴後,會自動添加
$res=$this->db->get('表名');//返回結果集對象
$res->result();
$bool=$this->db->insert('表名',關聯數組);
$bool=$this->db->update('表名',關聯數組,條件);
$bool=$this->db->delete('表名',條件);
//select id,name from tableName where id>=3 order by id desc limit 2,3
$res=$this->db->select('id,name')
->from('user')
->where('id >=',3)
->limit(3,2)//跳過2條,取出3條數據
->order_by('id desc ')
->get();
//顯示最近一條SQL
echo $this->db->last_query();
//where
//$res=$this->db->where('name','mary')->get('user');
//$res=$this->db->where('name !=','mary')->get('user');
//$res=$this->db->where(array('name'=>'mary'))->get('user');
//$res=$this->db->where(array('name'=>'mary','id >'=>2))->get('user');session
複雜的查詢,請用$this->db->query($sql,$data);//使用問號綁定參數
擴展CI控制器
application/core/MY_Controller.php,在此位置定義本身的控制類,讓application/controller下的
控制器都繼承MY_Controller
而在
控制器就要以繼承自MY_Controller
application/config/config.php
$config['subclass_prefix'] = 'MY_'; //注意,這個就是用戶自定的控制器,用戶自定義的控制器繼承此MY_控制器
模型
繼承自CI_Model
在模型中,能夠直接使用超級對象中的屬性,如$this->db
文件名,全小寫
類名首字母大寫
建議使用_model做爲後綴,防和控制器類名衝突
url相關函數
$this->load->helper('url');//這個是必需要加載的
//能夠根鬚要配置自動加載
//application/config/autoload.php
//$autoload['helper'] = array('url');
site_url('控制器/方法')
base_url() //網站的根目錄
路由
application/config/routes.php
//默認控制器
$route['default_controller'] = "welcome";
$route['news/[\d]{6}/([\d]+)\.html']='article/show/$1'; 經過這個路由規則,產生以下的地址:
//http://localhost/ci/index.php/news/201309/4.htmlapp
隱藏入口文件
開啓apache的rewrite模塊,在httpd.conf文件中
LoadModule rewrite_module modules/mod_rewrite.so
重啓apache
在CI對應應用的入口文件同級目錄中,放入一個.htaccess文件
內容以下:
<IfModule mod_rewrite.c>
RewriteEngine on
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(.*)$ index.php/$1 [QSA,PT,L] 這就是將apache找不到的文件,所有路由到index.php文件中
</IfModule>
分頁
//裝載類文件
$this->load->library('pagination');
$this->load->helper('url');
//每頁顯示10條數據
$page_size=每頁顯示的記錄條數;
$config['base_url'] =site_url('user/test');//特別注意:此處是分頁時用的網址
//一共有多少條數據
$config['total_rows'] = 總的記錄數;
//每頁顯示條數
$config['per_page'] = $page_size;
$config['first_link'] = '首頁';
$config['next_link'] = '下一頁';
$config['uri_segment']=3;//分頁的數據查詢偏移量在哪一段上
$this->pagination->initialize($config);
$offset=intval($this->uri->segment(3));//與$config['uri_segment']對應
$sql="select * from blog_category limit $offset, $page_size";
echo $sql;
$data['links']=$this->pagination->create_links();
$this->load->view('user/test',$data);
在view中,應該以下語句:
<body>
<?php
echo '查詢的語句:'.$sql.'<br>';
foreach ($rs as $key => $value)
{
echo $value->name.'<br>';
}
echo $links;
?>
</body>
文件上傳
1.手動建立好上傳目錄
這是view中的上傳文件視圖,注意enctype的類型
<form action="<?php echo site_url('user/upload')?>" method="post" enctype="multipart/form-data">
<input type="file" name="pic" />
<input type="submit" value="上傳" >
</form>
//上傳目錄須要手工建立,注意 .就是當前目錄,ci的入口就是index.php,.當前目錄就是index.php所在的目錄
$config['upload_path']='./uploads/';
//容許的圖片類型
$config['allowed_types']='gif|png|jpg|jpeg';
$config['max_size'] = '10000';
//生成新文件名,也能夠經過date()函數配置爲含有時間特徵的文件名
$config['file_name']=uniqid();
//裝載文件上傳類
$this->load->library('upload',$config);
$this->upload->do_upload('pic'); //pic是表單中的文件字段的名稱
var_dump($this->upload->data()); //data() 是上傳以後的文件相關屬性集合
//獲取上傳以後的數據
$data=$this->upload->data();
echo $data['file_name'];
驗證碼
//使用CI的session時,要注意:
//生成一個隨機不重複的字符串做爲加密用的key
//保存到application/config/config.php
//$config['encryption_key'] = 'adb8bf6d0ac4e17b42a80941582497a4';
//echo md5(uniqid());exit;這一句不用管,是用來生成加密key的
$this->load->library('session'); //調用session
$user=array('id'=>3,'name'=>'jack');
//session_start();
//$_SESSION['user']=$user;
$this->session->set_userdata('user',$user); //設置相應的session數據
//不能在這這裏獲取剛放入的數據
//只有頁在從新加載或跳轉到別的url中(就是顯示view以後),才能獲取到
//這是單獨使用的一次性session數據,只能讀取一次
$this->session->set_flashdata('test','aaaaaaaaaaaaaa');
}
public function show_session(){ //顯示session
$this->load->library('session');
//取CI session中的數據
$user=$this->session->userdata('user');
var_dump($user);
//下次刷新或者再取一次,test就沒有了
$test=$this->session->flashdata('test');
echo $test;
}
表單驗證
$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();?>
<form action="<?php echo site_url('user/insert');?>" method="post">
name <input type="text" name="name" value="<?php echo set_value('name')?>" />
<?php echo form_error('name','<span>','</span>')?>
<br>
password <input type="password" name="password" /><br>
email <input type="text" name="email" value="<?php echo set_value('email')?>" />
<?php echo form_error('email')?>
<br>
<input type="submit" value="submit" />
</form>
注意:使用中文的語言包,請將語言包拷貝到:application/language目錄中,而且在application/config.php 中將語言支持更改成:zh_cn,這樣,全部的驗證信息均可以被翻譯爲中文的。