=====================================
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,这样,全部的验证信息均可以被翻译为中文的。