主要内容
CI简介
深入mvc设计模式
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,不需要加后缀,直接是类名.php
2.文件名全部小写 例如 user.php
3. 所有的控制器,直接或间接继承CI_Controller类
4.控制器中,对动作(方法)要求:
public
不能以下划线开头
视图
1,在控制器中如何加载视图
//直接写视图名字,不写扩展名,如果有子目录,则写上目录名
$this->load->view(视图);
可以多次调用$this->load->view(视图);
2, 视图中,直接 使用原生php代码
3.推荐使用 <? foreach($list as $item:)?>
<?=$item['name']?>
<? endforeach;?>
超级对象
当前的控制对象
属性
$this->load
转载器类的实例 system/core/Loader.php
转载器提供的方法:
view() 转载视图
vars() 分配变量到视图
database() 转载数据库操作对象
model() 转载数据库对象
help()
$this->uri
是CI_URI类的实例 system/core/URI.php
CI_URI类提供的方法:
segment()用于获取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){
echo $p;//输出6
}
$this->input;
输入类
是CI_URI类的实例 system/core/input.php
CI_input类提供方法
$this->input->post('username'); //$_POST['username']
$this->input->server('DOCUMENT_ROOT'); //$_SERVER['DOCUMENT_ROOT']
在试图中,直接用$this来访问超级对象
数据库访问
修改配置文件
application/config/database.php
将数据库访问对象,转载到超级对象的属性中 $this->db
$this->load->database();
$res=$this->db->query($sql);//返回对象
$res->result();//返回数组,数组中是一个一个对象
$res->result_array();返回二维数组,里面是关联数组
$res->row();//返回第一条记录,直接是一个对象
参数绑定
$sql="select * from blog_user where name=?";
$this->db->query($sql,$name);//如果有多个问号时,需要传入一个索引数组
表前缀
/application/config/database.php
到配置文件中
$db['default']['dbprefix'] = 'blog_';
$db['default']['swap_pre'] = 'blog_';
配置为 代码中,直接硬编码表前缀就行了,如果以后项目数据库表前缀发生变化,只需要修改$db['default']['dbprefix'] = 'new_';代码中的blog_会自动替换为new_
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 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','id >'=>'2'))->get('user');
echo $this->db->last_query();
复杂的查询,请用$this->db->query($sql,$data);//使用问号绑定参数
扩展CI控制器
application/core/MY_Controller.php
控制器就要以继承自My_Controller.php
application/config/config.php
$config['subclass_prefix'] = 'MY_';
模型
继承自CI_Model
在模型中,可以直接使用超级对象中的属性
文件名, 全小写
类名首字母大写
建议使用_model作为后缀,防止和控制器类名冲突
url相关函数
$this->load->helper('url');
//可以根据配置自动加载
//application/config/autoload.php
//$autoload['helper'] = array();
site_url('控制器/方法');
base_url();
设置路由
//application/config/routes.php
//默认控制器
$route['default_controller'] = "welcome";
http://192.168.220.129/index.php/new/201329/2.html
$route['new/[\d]{6}/([\d]+)\.html']='article/show/$1';
隐藏入口文件
开启apache的rewrite模块,在httpd.conf文件中
LoadModule rewrite_module modules/mod_rewrite.so
重启apache
在入口文件同级目录中,放入一个.htaccess
内容如下:
<IfModule mod_rewrite.c>
RewriteEngine on
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(.*)$ index.php/$1 [QSA,PT,L]
</IfModule>
分页
//转载类文件
$this->load->library('pagination');
$this->load->helper('url');
//每页显示10条数据
$page_size=10;
$config['base_url']=site_url('user/test3');
//每页显示条数
$config['total_rows']=100;
$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_user limit $offset,$page_size";
echo $sql;
$data['links']=$this->pagination->create_links();
$this->load->view('user/test3',$data);
文件上传
1.手动创建好目录
2.
<form action="<?php echo site_url('user/upload')?>" method="post" enctype="multipart/form-data">
<input type="file" name="pic" >
<input type="submit" value="上传" >
</form>
//上传目录需要手工创建
$config['upload_path'] = './uploads/';
//允许
$config['allowed_types'] = 'gif|jpg|png|jpeg';
$config['max_size'] = '1000';
//生成新文件名
$config['file_name'] = uniqid();
//转载文件上传类
$this->load->library('upload', $config);
$this->upload->do_upload('pic');
var_dump($this->upload->data());
//获取上传之后的数据
$data=$this->upload->data();
echo $data['file_name'];
session
验证码
public function login(){
//生成一个随机不重复的字符串作为加密用的key
//保存到application\config\config.php
//$config['encryption_key'] = 'd76f362f8a03f1ee0026d3f263a7de76';
//echo md5(uniqid());exit;
$this->load->library('session');
$user=array('id'=>3,'name'=>'jack');
//sesion_start();
//$_SESSION['user']=$user;
$this->session->set_userdata('user',$user);
//不在这里获取刚放入的数据
//只有页面从新加载或者跳转到别的Url中,才能获取到
//一次性的数据,只能读取一次
$this->session->set_flashdata('test','aaaaaaaaaaaaaa');
}
public function show_session(){
$this->load->library('session');
//去CI_session中的数据
$user=$this->session->userdata('user');
var_dump($user);
//下次刷新,就没有了
$test=$this->session->flashdata('test');
var_dump($test);
}
public function captcha(){
$this->load->helper('url');
$this->load->helper('captcha');
$vals = array(
'word'=>rand(1000,9999),//使用自己生成的数字
'img_path' => './captcha/',//此目录需要手动创建
'img_url' => base_url().'/captcha/',
'img_width' => '100',
'img_height' => 30,
'expiration' => 60*10//过期时间,时间一到,会自动删除图片
);
$cap = create_captcha($vals);
//echo $cap['image'];
$this->load->view('/user/captcha',array('cap'=>$cap['image']));
session_start();
$_SESSION['cap']=$cap['word'];
//验证时,对比$_SESSION['cap'];
}
表单验证
控制器中的代码
public function insert(){
//var_dump($this->input->post('name'));
$this->load->helper('url');
$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/adduser');
}
}
视图中的代码
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>无标题文档</title>
</head>
<body>
<?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="<? echo set_value('email')?>"/>
<?php echo form_error('email','<span>','</span>');?>
<br/>
<input type="submit" name="submit"/>
</form>
<img src="<?php echo base_url();?>/uploads/jh.jpg" alt="" width="100"/>
</body>
</html>
CI简介
深入mvc设计模式
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,不需要加后缀,直接是类名.php
2.文件名全部小写 例如 user.php
3. 所有的控制器,直接或间接继承CI_Controller类
4.控制器中,对动作(方法)要求:
public
不能以下划线开头
视图
1,在控制器中如何加载视图
//直接写视图名字,不写扩展名,如果有子目录,则写上目录名
$this->load->view(视图);
可以多次调用$this->load->view(视图);
2, 视图中,直接 使用原生php代码
3.推荐使用 <? foreach($list as $item:)?>
<?=$item['name']?>
<? endforeach;?>
超级对象
当前的控制对象
属性
$this->load
转载器类的实例 system/core/Loader.php
转载器提供的方法:
view() 转载视图
vars() 分配变量到视图
database() 转载数据库操作对象
model() 转载数据库对象
help()
$this->uri
是CI_URI类的实例 system/core/URI.php
CI_URI类提供的方法:
segment()用于获取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){
echo $p;//输出6
}
$this->input;
输入类
是CI_URI类的实例 system/core/input.php
CI_input类提供方法
$this->input->post('username'); //$_POST['username']
$this->input->server('DOCUMENT_ROOT'); //$_SERVER['DOCUMENT_ROOT']
在试图中,直接用$this来访问超级对象
数据库访问
修改配置文件
application/config/database.php
将数据库访问对象,转载到超级对象的属性中 $this->db
$this->load->database();
$res=$this->db->query($sql);//返回对象
$res->result();//返回数组,数组中是一个一个对象
$res->result_array();返回二维数组,里面是关联数组
$res->row();//返回第一条记录,直接是一个对象
参数绑定
$sql="select * from blog_user where name=?";
$this->db->query($sql,$name);//如果有多个问号时,需要传入一个索引数组
表前缀
/application/config/database.php
到配置文件中
$db['default']['dbprefix'] = 'blog_';
$db['default']['swap_pre'] = 'blog_';
配置为 代码中,直接硬编码表前缀就行了,如果以后项目数据库表前缀发生变化,只需要修改$db['default']['dbprefix'] = 'new_';代码中的blog_会自动替换为new_
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 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','id >'=>'2'))->get('user');
echo $this->db->last_query();
复杂的查询,请用$this->db->query($sql,$data);//使用问号绑定参数
扩展CI控制器
application/core/MY_Controller.php
控制器就要以继承自My_Controller.php
application/config/config.php
$config['subclass_prefix'] = 'MY_';
模型
继承自CI_Model
在模型中,可以直接使用超级对象中的属性
文件名, 全小写
类名首字母大写
建议使用_model作为后缀,防止和控制器类名冲突
url相关函数
$this->load->helper('url');
//可以根据配置自动加载
//application/config/autoload.php
//$autoload['helper'] = array();
site_url('控制器/方法');
base_url();
设置路由
//application/config/routes.php
//默认控制器
$route['default_controller'] = "welcome";
http://192.168.220.129/index.php/new/201329/2.html
$route['new/[\d]{6}/([\d]+)\.html']='article/show/$1';
隐藏入口文件
开启apache的rewrite模块,在httpd.conf文件中
LoadModule rewrite_module modules/mod_rewrite.so
重启apache
在入口文件同级目录中,放入一个.htaccess
内容如下:
<IfModule mod_rewrite.c>
RewriteEngine on
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(.*)$ index.php/$1 [QSA,PT,L]
</IfModule>
分页
//转载类文件
$this->load->library('pagination');
$this->load->helper('url');
//每页显示10条数据
$page_size=10;
$config['base_url']=site_url('user/test3');
//每页显示条数
$config['total_rows']=100;
$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_user limit $offset,$page_size";
echo $sql;
$data['links']=$this->pagination->create_links();
$this->load->view('user/test3',$data);
文件上传
1.手动创建好目录
2.
<form action="<?php echo site_url('user/upload')?>" method="post" enctype="multipart/form-data">
<input type="file" name="pic" >
<input type="submit" value="上传" >
</form>
//上传目录需要手工创建
$config['upload_path'] = './uploads/';
//允许
$config['allowed_types'] = 'gif|jpg|png|jpeg';
$config['max_size'] = '1000';
//生成新文件名
$config['file_name'] = uniqid();
//转载文件上传类
$this->load->library('upload', $config);
$this->upload->do_upload('pic');
var_dump($this->upload->data());
//获取上传之后的数据
$data=$this->upload->data();
echo $data['file_name'];
session
验证码
public function login(){
//生成一个随机不重复的字符串作为加密用的key
//保存到application\config\config.php
//$config['encryption_key'] = 'd76f362f8a03f1ee0026d3f263a7de76';
//echo md5(uniqid());exit;
$this->load->library('session');
$user=array('id'=>3,'name'=>'jack');
//sesion_start();
//$_SESSION['user']=$user;
$this->session->set_userdata('user',$user);
//不在这里获取刚放入的数据
//只有页面从新加载或者跳转到别的Url中,才能获取到
//一次性的数据,只能读取一次
$this->session->set_flashdata('test','aaaaaaaaaaaaaa');
}
public function show_session(){
$this->load->library('session');
//去CI_session中的数据
$user=$this->session->userdata('user');
var_dump($user);
//下次刷新,就没有了
$test=$this->session->flashdata('test');
var_dump($test);
}
public function captcha(){
$this->load->helper('url');
$this->load->helper('captcha');
$vals = array(
'word'=>rand(1000,9999),//使用自己生成的数字
'img_path' => './captcha/',//此目录需要手动创建
'img_url' => base_url().'/captcha/',
'img_width' => '100',
'img_height' => 30,
'expiration' => 60*10//过期时间,时间一到,会自动删除图片
);
$cap = create_captcha($vals);
//echo $cap['image'];
$this->load->view('/user/captcha',array('cap'=>$cap['image']));
session_start();
$_SESSION['cap']=$cap['word'];
//验证时,对比$_SESSION['cap'];
}
表单验证
控制器中的代码
public function insert(){
//var_dump($this->input->post('name'));
$this->load->helper('url');
$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/adduser');
}
}
视图中的代码
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>无标题文档</title>
</head>
<body>
<?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="<? echo set_value('email')?>"/>
<?php echo form_error('email','<span>','</span>');?>
<br/>
<input type="submit" name="submit"/>
</form>
<img src="<?php echo base_url();?>/uploads/jh.jpg" alt="" width="100"/>
</body>
</html>