CodeIgniter把URL中参数值为0的过滤掉了,传递的参数为0实际是NULL,测试了一下TP5是没有过滤的,这样用CI中带的函数就没办法区分URL中的参数是0还是没传递参数,只能用最原始的$_GET、$_POST、$_REQUEST了
常用小功能
标签显示激活状态(即class="active")
CodeIgniter实现:
方法一:
class="<?php if(current_url()==site_url('/book/book_list')) echo 'active';?>"
注意,如果是网站根目录,则要这么写<?php if(current_url()==site_url()) echo 'active';?>
不是site_url('/'),因为site_url('/')会在结尾多一个/斜线
方法二(推荐):
$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();
}
where
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();
like
$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 by
//传递两个参数的写法
$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';