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

相关文章
相关标签/搜索