CodeIgniter框架經常使用——持續更新

 

CodeIgniter把URL中參數值爲0的過濾掉了,傳遞的參數爲0實際是NULL,測試了一下TP5是沒有過濾的,這樣用CI中帶的函數就沒辦法區分URL中的參數是0仍是沒傳遞參數,只能用最原始的$_GET、$_POST、$_REQUEST了javascript

 

經常使用小功能

標籤顯示激活狀態(即class="active")php

CodeIgniter實現:html

方法一:java

class="<?php if(current_url()==site_url('/book/book_list')) echo 'active';?>"

注意,若是是網站根目錄,則要這麼寫<?php if(current_url()==site_url()) echo 'active';?>
不是site_url('/'),由於site_url('/')會在結尾多一個/斜線

方法二(推薦):sql

$this->router->fetch_class();//獲取控制器名  
$this->router->fetch_method();//獲取方法名

class="<?php if($this->router->fetch_class().'/'.$this->router->fetch_method()=='welcome/index') echo 'active';?>"

 

固然也能夠用js來實現:數據庫

$(document).ready(function(e){
var url=window.location
$('.treeview-menu a').each(function(e){
    var link = $(this).attr('href');
    if(link==url){
        $(this).parent('li').addClass('active');
        $(this).closest('.treeview').addClass('active');
    }
});

 

Model查詢構造器數組

查詢:

public function getExample($book_id)
{
        $where = array();
        if( ! empty($book_id))
        {
           $where = array('book_id'=>$book_id);
        }
        $result = $this->db->get_where(self::TABLE,$where)->result_array(); //或者row_array()返回一行記錄的一維數組
        return $result;
}



public function getExampleList($id,$limitCount = 0,$limitBegin = 0){
        
        $order = 'add_time desc';
        $where = array(
            'at.id' => $uid,
            'at.status' => 1 
        );
        $this->db->select('
            at.id subject_id,
            bt.id user_id,
            (select title from wx_course wc where wc.id = at.course_id) course_name,  
        ',false);  //第二個參數可選,若是設置爲 FALSE,CodeIgniter 將不保護你的 表名和字段名,這在當你編寫複合查詢語句時頗有用,不會破壞你編寫的語句。@城市之霧
        $this->db->from('a_table at');
        $this->db->join('b_table bt','at.hello_id = bt.id');
        if($limitCount) {
            $this->db->limit($limitCount,$limitBegin);
        }
        $result = $this->db->where($where)->get()->result_array();
        return $result;

        //或者能夠連寫的形式
        $result = $this->db
                ->select('*')
                ->from(self::TABLE.'cc')
                ->join('ci_user cu','cc.user_id = cu.user_id','left')
                ->where(array('cc.video_id'=>$video_id))
                ->get()
                ->result_array();
}

wheresession

where('原生寫法')   
where(數組)
get_where('表名',數組或原生)
where_in('字段',要in的數組)

經過屢次使用$this->db->where()能夠組合使用多個where條件 //$this->db->where() 方法有一個可選的第三個參數,若是設置爲 FALSE,CodeIgniter 將不保護你的表名和字段名。

要執行or的時候,就會常常用到原生寫法,由於直接的查詢構造器不少都沒法實現
好比 想要這種語句:title like '%xxx%' or author like '%xxx%',用以下寫法
$where = "(title like '%$book_title_or_author%' or author like '%$book_title_or_author%' ) ";
$this->db->where($where);
//而後下面再寫其餘條件
$where=array('status'=>1);
$this->db->where($where);
$this->db->get();

likeapp

$this->db->like('title', '演員的自我修養');  //至關於WHERE `title` LIKE '%演員的自我修養%' ESCAPE '!'
$this->db->like('title', '演員的自我修養', 'both');  // 先後都有百分號,默認不寫第三個參數就是both
$this->db->like('title', '演員的自我修養', 'before');    // 百分號在前面
$this->db->like('title', '演員的自我修養', 'after'); // 百分號在後面

order byide

//傳遞兩個參數的寫法
$this->db->order_by('title', 'DESC'); 
$this->db->order_by('name', 'ASC');
//或者直接使用原生
$this->db->order_by('title DESC, name ASC');

order by還能夠隨機排序(這樣就不用在程序中使用suffle()函數對數組進行隨機排序了) 

$this->db->order_by('title', 'RANDOM'); //第一個參數會被忽略,可是你能夠傳入一個 數字值,做爲隨機數的 seed。好比下面這種寫法
$this->db->order_by(42, 'RANDOM'); //至關於原生的order by rand(42)

可是這種方法對於大數據量的話效率很低,通常數據量超過1萬就不建議這麼使用,能夠參考下面這兩篇文章優化隨機取數據

https://blog.csdn.net/fdipzone/article/details/51541729

http://www.piaoyi.org/php/MySQL-Order-By-Rand.html

limit

$this->db->limit(10); //從第1條開始,查詢10行。至關於原生的limit 10
$this->db->limit(10, 20);  //從第20條記錄開始,查詢10行。至關於原生的limit 20,10

 

查詢結果的展現形式

返回二維數組:result_array();  用法舉例:

$this->db->get(self::TABLE)->result_array();

返回第一條記錄(一維數組):

$this->db->get(self::TABLE)->row_array();

返回一個單一的值(好比經過一個id查詢username):

CodeIgniter自帶的函數中沒有太好的方法,只能本身根據實際狀況對查詢結果進行修改,好比:

$result = $this->db->select('username')->where(array('id'=>$id))->get(self::TABLE)->row_array();
if(!empty($result)){
   return $result['username'];
}else{
   return '';
}

返回行數count(通常用於分頁等):使用count_all_results()

$result = $this->db->where("age > 1 and age < 15")->count_all_results(self::TABLE,FALSE); //第二個參數是FALSE,沒理解官網說的重置select中設置的值是什麼意思

//下面這種寫法不能夠,用了count_all_results就不能用get()了,表名要寫在count_all_results()中
// $result = $this->db->where("age > 1 and age < 15")->get(self::TABLE)->count_all_results(); 


//固然也能夠本身構造,不使用官方的方法@城市之霧
$result = $this->db->select('count(1) countAs')->where("age > 1 and age < 15")->get(self::TABLE)->row_array();
return $result['countAs'];

 

插入:

public function setExample(array $data){
        if(empty($data)){
           return 0;
        }
        $data['status'] = 1;
        $data['add_time'] = time();
        $data['edit_time'] = time();

        $this->db->insert('a_table', $data);
        return $this->db->insert_id();  //返回自增id
}

//-----------------或者使用set()方法進行設置


public function setExample(array $data){
        if(empty($data)){
           return 0;
        }
        $data['status'] = 1;
        $data['add_time'] = time();
        $data['edit_time'] = time();

        $this->db->set($array);  //直接set一個數組。固然也能夠一個值一個值的set,好比$this->db->set('name', $name);
        $this->db->insert('a_table');
        return $this->db->insert_id();  //返回自增id
}

 

更新:

public function setExample(array $data){
        /*
          data樣例:
          $data = array(
          'title' => $title,
          'name' => $name,
          'date' => $date
          );
        */

        if(empty($data)){
           return 0;
        }
        $data['edit_time'] = time();
        $this->db->where('id', $id);
        $result = $this->db->update('mytable', $data);
        return $result;
}

//-----------------或者使用set()方法進行設置

public function setExample(array $data){
        /*
          data樣例:
          $data = array(
          'title' => $title,
          'name' => $name,
          'date' => $date
          );
        */

        if(empty($data)){
           return 0;
        }
        
        $this->db->set('edit_time', time());  //設置逐個設置值
        $this->db->set($data);  //設置數組

        $this->db->where('id', $id);
        $result = $this->db->update('mytable');
        return $result;
}



//特別說明,若是要set的不是字符串,而是須要進行運算的,則set的第三個參數設置爲FALSE便可,數據將不會自動轉義。下面比較一下:

$this->db->set('field', 'field+1', FALSE);
$this->db->where('id', 2);
$this->db->update('mytable'); // 至關於原生的: UPDATE mytable SET field = field+1 WHERE id = 2


$this->db->set('field', 'field+1');
$this->db->where('id', 2);
$this->db->update('mytable'); // 至關於原生的: UPDATE `mytable` SET `field` = 'field+1' WHERE `id` = 2

 

刪除:

$this->db->where('id', $id);
$this->db->delete('mytable');

//不過這種刪除方法不經常使用,如今流行的都是假刪除,就是更新記錄的狀態,status = 0之類的

 

 

查詢最後執行的sql語句:

echo $this->db->last_query();

 

 

 

 

加載數據庫類和session類

在application/config/autoload.php中
$autoload['libraries'] = array('database','session');

或者在基控制器中加載$this->load->database();

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

常見錯誤:

忘記引入model時報錯
Call to a member function getTeam() on null

在構造函數中引入便可:$this->load->model('xxx_model');

 

URL引入錯誤

config中的base_url要寫完整訪問地址,不能光寫域名。正確寫法:

$config['base_url'] = 'http://www.xxxx.com';

相關文章
相關標籤/搜索