CI是什么?
codeIgniter 轻量级 功能强大的php框架
基于MVC设计模式,提供了一套丰富的类库
简单易学,高效实用
官方网站
中文网站 里面有中文的学习文档,可以多看看。
有什么特点?
一个小巧的框架
出色的性能
广泛兼容标准主机上的各种php版本和配置
几乎只需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(视图);视图中可以多次调用
2 视图中使用原生php代码,不使用模板
3 推荐使用
<?php foreach($listas $item)?>
<?=item[‘id’]?>
<?phpendforeach?>
CI的超级对象
当前的控制器对象
提供了很多属性
1 $this->load装载器
装载器类的实例 system/core/Loader.php
转载器类提供的方法
View() 装载视图
Vars() 分配变量到视图
Database() 装载数据库对象
Model() 装载模型对象
Helper() 提供了辅助函数
2 $this->uri
CI_URI url相关的解析,比如获取get参数 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
Pulbi c functionindex($p=0)
{
Echo $p; //将输出6
}
3 $this->input 输入类
是CI_Input类的实例system/core/input.php
CI_Input提供的方法:
Post()方法
Server(‘DOCUMENT_ROOT’)
在视图中,直接用$this来访问超级对象的属性
数据库访问
1 修改配置文件
Application/config/database.php
2 将数据库访问对象,装载到超级对象的属性中$this->db
$this->load->database();
$res = $this->db-query($sql); //返回对象
$res->result(); //返回数组,数组中是一个一个的数组
$res->result_array(); //返回数据,里面是关联数据
$res->row(); //返回第一条数据,直接是一个对象
$res->row_array(); //返回第一个数据,一个关联数组
3 参数绑定
$sql = “select* from blog_user where name?”;
$this->db->query($sql, $name); //如果有多个问号时,需要传入一个索引数组
4 表前缀
$db['default']['dbprefix']= 'blog_';
$db['default']['swap_pre']= 'blog_';
配置为一样,代码中,直接编码表前缀就行了,如果以后项目数据库表前缀发生变化,只需要修改$db['default']['dbprefix'] = 'new_';代码中的blog_会自动替换为
5 db的自动加载
配置自动加载db在application/config/autoload.php
$autoload['libraries'] = array('database');
不需要:$this->load->database();
6 自增id
$this->db->insert_id();
7 受影响行数
$this->db-affected_rows();
Active Record
1 application/config/database.php
确保$active_record = TRUE;
2 自动加载设置
Application/config/autoload.php里的
$autoload[‘libraries’]= array(‘database’);
3 配置文件中,配置表前缀,会自动添加
4 具体操作
Select查询
$res = $this->db->get(‘表名’); //返回结果集对象
$res->result();
Insert插入
$bool =$this->db->insert(“表名”, 关联数组);
Update更新
$bool =$this->db->update(‘表名’, 关联数组, 条件);
Delete操作
$bool =$this->db->delete(‘表名’, 条件);
连贯操作
$res= $this->db->select('id, name')
->from('user')
->where('id>=', 3)
->limit(3,1) // 跳过2条,取出3条数据
->order_by('id desc')
->get();
执行最近一条sql语句
Echo$this->db->last_query();
条件where
$res = $this->db->where('name', 'm
ary')->get('user');
$res = $this->db->where('name !=','mary')->get('user');
$res =$this->db->where(array('name' => 'mary', 'id' =>2))->get('user');
复杂的查询:请用$this->db-query($sql, $data); //使用问号绑定参数
模型
继承自CI_Model
在模型中可以直接使用超级对象中的属性
文件名全是小写
类名首字母大写
建议使用_model作为后缀,防止和控制器类名发生冲突
url相关函数
this->load->helper(‘url’);
// 可以根据需要配置自动自动加载
// application/config/autoload.php
// $autoload[‘helper’] = array(‘url’);
site_url(‘控制器/方法’)
base_url();网站的根目录
设置路由
Application/config/routers.php
默认控制器
$route['default_controller'] = "welcome";
Http://localhost/ci/index.php/news/201309/4.html
$route['news/[\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/test');
/* 一共有多少条数据 */
$config['total_rows'] = 100;
/* 每页显示条数 */
$config['per_page'] = $page_size;
$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_user limit ".$offset.",".$page_size;
echo $sql;
$data['links'] = $this->pagination->create_links();
$this->load->view('user/test', $data);
文件上传类
1 手动创建好上传目录
<form action="<?php echosite_url('user/upload')?>" method="post" enctype="multipart/form-data">
<input type="file"name="pic"/>
<input type="submit" value="上传">
</form>
//上传目录需要手工创建
$config['upload_path'] = './upload/';
/* 允许 */
$config['allowed_types'] = 'gif|png|jpg|jpeg';
/* 生成新文件名 */
$config['max_size'] = '10000';
$config['allowed_types'] = 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
// 生成一个随机不重复的字符串作为加密用的key
// 保存到配置文件application/config/config.php
// $config['encryption_key'] = '9b552db80f226f042fb02be80456902a';
// echo md5(uniqid());exit;
$this->load->library('session');
$user = array(
'id'=> 3,
'name'=> 'jack'
);
$this->session->set_userdata('user', $user);
// 不要在这里获取刚放放入的数据
// 只有页面在新加载或跳转到别的url中才能获取到
// 一次性的数据,只能读取一次
$this->session->set_flashdata('test', 'aaaaaa');
// 下面获取到存入的数据
$this->load->library('session');
// 取CI_session中的数据
$user = $this->session->userdata('user');
var_dump($user);
// 下次刷新,就没有了
$test = $this->session->flashdata('test');
var_dump($test);
验证码
$this->load->helper('url');
$this->load->helper('captcha');
$vals= array(
'word'=> 'Random word', //使用自己生成的随机字符串
'img_path'=> './captcha/',
'img_url'=> base_url().'/captcha/',
'img_width'=> '150',
'img_height'=> 30,
'expiration'=> 5 // 过期时间,时间一到会自动回删除图片,单位为秒
);
$cap = create_captcha($vals);
$this->load->view('user/test2', array('cap' =>$cap['image']));
session_start();
$_SESSION['cap'] = $cap['cap'];
注: 这里面需要装gd库,其jpeg是可以用的才可以自动生成验证码的图片的