1. 程式人生 > >CI:CodeIgniter框架簡單開發筆記

CI:CodeIgniter框架簡單開發筆記

=====================================
CodeIgniter框架(鄒義良老師講課大綱)
=====================================
主要內容
    CI簡介
    深入MVC設計模式
    CI中控制器與檢視
    CI的超級物件
    資料庫訪問
    
    AR模型
    如何擴充套件CI的控制器
    模型
    
    url相關函式
    設定路由
    隱藏入口檔案
    分頁
    檔案上傳
    Session
    驗證碼
    表單驗證

-------------------------------------


CI是什麼?
    CodeIgniter是一個輕量級但功能強大的PHP框架
    基於MVC設計模式,提供了一套豐富的類庫
    簡單易學,高效實用

官方網站
    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引數,直接在方法中說明引數,就可以接受位址列中的分段引數
        

    $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');

    複雜的查詢,請用$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.html

隱藏入口檔案
    開啟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,這樣,所有的驗證資訊都可以被