CI框架学习
一、简介
www.CodeIgniter.com 英文网 www.codeigniter.org.cn 中文网
优点:小巧、轻量级、原生php开发,移植性高、不用命令行解压即可使用;
二、CI目录介绍
application 用户目录
controllers 控制器文件夹
models 模型文件夹
config配置文件夹
core 核心文件夹(自定义存放相对核心内容,如基类控制器)
helpers 帮助函数
language 语言包
libraries 类库
views 视图文件夹
models 模型类文件夹
system CI框架系统目录
core 核心目录
Controller CI_Controller 核心类
Loader 加载对象 被CI_controller 当做属性加载(常使用view、vars等属性)
database 数据库文件夹 也是被CI_controller加载
数据库DB类
helpers 帮助函数
core 核心文件夹(自定义存放相对核心内容,如基类控制器)
helpers 帮助函数
language 语言包
libraries 类库
index.php 入口文件
三、控制器
1.控制器规则
- 控制器不需要加特定前后缀规则,入Laravel的控制器 userController如此
- 控制器名为小写 user.php CI中控制器名若大写,用户浏览器输入地址则大写 (当前失效,可以改成大写)
- 所有控制器,需直接或间接继承CI_controller(若不继承则无法使用CI核心中提供的方法)
- 控制器中的方法不能和类名相同,否则当做构造方法使用
- 控制器中的方法不能以 "_"开头,否则当做受保护的方法使用
2.访问规则
- 访问控制器pathinfo方式
- index.php需要在nginx中隐藏起来
- CI中默认访问的控制器是welcome 默认访问的动作为index
四、视图
1.视图规则
视图位于application/views中
视图支持分模块进行管理
视图名小写
2.使用视图
加载视图 $this->load->view(“视图名称”)可以加.php后缀,也可以不加;
如果分模块管理,那么 view("文件夹名称/页面名称")
public function setUserInfo(){ //加载视图文件 $this->load->view("user/index"); }页面结构公共部分经常是分离的,在其它的框架中有很多都是拼合的,CI中可以多次调用load->view进行拼合
public function setUserInfo(){ //加载html的头部文件 $this->load->view("head"); //加载html的body文件 $this->load->view("user/index"); }
3.给视图传参
- 视图中传参使用语法
$this->load->vars("变量名","变量的值") - 页面中使用方式为原生php模式
<?php echo $title?>这种 - 如果
$this->load->vars(["key"=>value])形式,那么键会被用于变量,值作为值的形式;我记得php中有个专门的数组方法是组合的;(回头找找,放到自己所会的数组中去) - 使用过程
控制器
public function setUserInfo(){ //加载html的头部文件 $this->load->view("head"); //分配变量-形式一 $this->load->vars("title","学生信息一览表"); //分配变量-形式二 $title = "学生信息一览表"; $slist = array( array("id"=>1,"name"=>"张三丰","class"=>"小班"), array("id"=>2,"name"=>"张无忌","class"=>"中班"), array("id"=>3,"name"=>"宋青书","class"=>"小班"), ); $data["title"] = $title; $data["slist"] = $slist; $this->load->vars($data); //加载html的body文件 $this->load->view("user/index"); }视图
<body> <table border="1" class="liststyle"> <caption><b><?php echo $title?></b></caption> <?php foreach($slist as $value):?> <tr> <td><?=$value['id']?></td> <td><?=$value['name']?></td> <td><?=$value['class']?></td> </tr> <?php endforeach;?> </table> </body>注意事项:在使用原生的php进行输出的时候,尽量不要都是echo输出html标签的方式,如此不利于维护(如下图1-1),我们要常使用html包裹着php的方式(如下图1-2)

(图:1-1)

(图:1-2)
五、CI中的超级对象
1.装载器
超级对象指的就是CI_controller 这个,超级对象主要加载了core database helper函数到超级对象里面去
比如装在类$this->load (其实就是system/core/Loader.php)文件
常用的变量为
view() 装在视图
vars() 分配变量
database() 装载数据库操作对象
model() 装载模型对象
helper() 帮组函数
2.路由
不用说任何一个php框架都支持原生的数据方式获取,在ci框架中还支持pathinfo的方式进行获取数据;这个利用的是超级对象中的UTI对象;
pathinfo方式: www.app.com/控制器名/方法名/name/名字/id/56
传统路由方式:www.app.com/控制器/方法名/?id=1&name=“名字”
但是CI中的pathinfo和传统的pathinfo也是不同的,传统的也是key和vvalue形式,但是ci中是获取的片段数据;

语法为
$this->uri->segment(number);
还有一种方式可以获取参数
如果pathinfo中参数多出了,那么会自动传到方法中,按照顺序传递,传递2个参数如下

3.input类
获取用户信息
`$this->input->post("username");
$this->input->server("Cocument_Root")`
超级对象可以直接在视图类中进行使用;
六、操作数据库
1.原生sql操作
原因:因为ar对于一些复杂的sql操作还是比较麻烦的,所以复杂的逻辑还是需要sql进行操作的(操作数据库的方式:原生sql,pdo(封装的mysqli的),mysqli(php带的))
操作sql在ci中使用db类;位于database文件夹
配置数据库
配置文件位于:application/config中,配置如下,并关注表前缀的配置
$db['default'] = array( 'dsn' => '', 'hostname' => 'localhost', 'username' => 'root', 'password' => 'root', 'database' => 'pre_shopping', 'dbdriver' => 'mysqli', 'dbprefix' => 'pre_',//表前缀,会被下面的swqp_pre替换 'pconnect' => FALSE, 'db_debug' => (ENVIRONMENT !== 'production'), 'cache_on' => FALSE, 'cachedir' => '', 'char_set' => 'utf8', 'dbcollat' => 'utf8_general_ci', 'swap_pre' => 'pre_',//原生sql中使用的表前缀 'encrypt' => FALSE, 'compress' => FALSE, 'stricton' => FALSE, 'failover' => array(), 'save_queries' => TRUE );
操作数据库的步骤
-
将DB类include到控制器中 使用语法
$this->loaddatabase(); -
所有sql都放到db提供的方法query中进行使用
$this->db->query(sql) -
查询 与 增删改
-
查询:
-
$res = $this->db->query(sql); 查询数据,返回DB模型
$res->result() 返回的是数组,里面是一个个对象
$res->result_array() 返回的是二维数组,是关联数组
$res->row() 返回第一条数据,直接是一个对象
-
增删改:
-
增删改返回的是布尔值true与false
获取受影响行数
$this->db->affected_rows();自增ID
$this->db->insert_id()
-
案例:想数据库中查询全部的数据
#获取全部用户的信息
public function getALLUserinfo()
{
echo "<pre>";
#装载对象
$this->load->database();
#装载完成之后就可以使用db类
$sql = "select * from pre_user";
$res = $this->db->query($sql);#返回的CI_DB_mysqli_result对象 进行了一层封装
#转换结果集,提取数据
$result1 = $res->result();#一维是数组,里面是对象格式
$result2 = $res->result_array();#二位数组,关联数组
$result3 = $res->row();#返回结果集中的第一条数据
print_r($result3);
}

案例:添加一条数据
#插入一条用户信息
public function setUserinfos(){
#装载对象
$this->load->database();
#插入数据
$sql = "insert into pre_user (name,age) values ('mary',23)";
$res = $this->db->query($sql);#执行成功返回布尔值
if($res){
#获取受影响数和主键id
echo "受影响条数".$this->db->affected_rows();
echo "受影响条数".$this->db->insert_id();
}else{
echo "插入异常";
}
}
案例:安全措施-参数绑定
#插入一条用户信息
public function setUserinfos(){
#装载对象
$this->load->database();
#插入数据
$sql = "insert into pre_user (name,age) values (?,?)";
$data = ["张天宝",21];
$res = $this->db->query($sql,$data);#执行成功返回布尔值
if($res){
#获取受影响数和主键id
echo "受影响条数".$this->db->affected_rows();
echo "受影响条数".$this->db->insert_id();
}else{
echo "插入异常";
}
}
query方法第二个参数可以用于接收索引数组;作为参数绑定的值;

2.AR操作数据库
ar本质就是对原始的操作数据库的方式在进行封装了一次;
-
确保数据库文件的已经配置好,并且$query_builder = TRUE; 改项是开启的(config/database)
-
如果想要免去预加载load 我们可以去autoload中打开预加载某个文件
#打开自动装载 $autoload['libraries'] = array("database");
获取数据库
$res = $this->db->get("user")
$result = $res->result_array()
注意:数据表的前缀是可以不用写的,使用ar模型会被自动拼接
插入数据
$data =array("name"=>"赵锐庆",age=>"18");
$res = $this->db->insert("user",$data);//返回值是布尔值
修改数据
$data = array("name"=>"张三丰",age=>100);
$res = $this->db->update("user",$data,["id"=>1]);//形参:表明、修改的数据项、条件
删除数据
$cdn = array("id"=>1);
$res = $this->db->delete("user",$cdn)
AR链式查询(查询user表字段为name的第二条数据按照id倒叙 共计2条)
$res = $this->db->select("name,age")
->from("user")
->where("id >=2")
->limit(3,2)
->order_by("id desc")
->get();
关于where条件的深入使用
#等值情况
$this->db->where("name","赵锐庆")->get("user");
#其它条件
$this->db->where("age >=",18)->get("user");
#数组多条件情况
$this->db->where(["name"=>"赵锐庆","age"=>18])->get("user");
七、CI中的程序扩展
我们的很多需求往往是在框架中的核心类是找不到的,所以CI给我们提供了扩展的功能,扩展功能是通过ci中load加载机制 进行加载的;接下来让我们查看ci中有哪些扩展的功能。

我们可以看到ci中的设计,你自己的开发文件夹和ci的核心文件夹是保持一致的,这说明当有了扩展的需求,你根本不必要去取动ci的核心框架,你只要在对应的自己文件中进行扩展就可以了。这样做等你的框架版本升级以后,你可以直接将你的system文件夹删除替换新的框架即可升级新的版本。
1.扩展控制器
除了自己在controller进行继承的方式,还可以使用ci提供的扩展方式,使用include_once的方式进行引入即可。
新建一个基类控制器

注意事项:
- 在app下面的core中实现 需要写上前缀和controller拼合
- 继承的CI_Controller中 需要实现父类控制器的构造方法
默认的基类控制器为MY_,但是可以在config中进行修改 $config["subclass_prefix"] = “OSS_”- 直接使用 不需要引入,如果你在controller中创建,还需要include_once进行引用才能使用

八、模型的使用
为了将控制器中操作数据库的方式专门进行封装提炼到模型中去,所以CI提供了这一套的机制;
模型创建规则
模型文件位于application/model下面
模型文件创建必须小写,因为CI内部做了一定的处理机制
模型文件,最好拼接一个后缀,防止和控制文件冲突,模型文件后缀一般拼接为
_model模型文件的类名开头是大写 和类名是有所区别的
如下图所示

在模型文件中,可以使用超级对象中的数据CI_controller
2.在控制器中可以直接使用load加载模型,从而使用里面的方法 $this->load->model("加载的模型文件",“模型的别名”)

九、帮助函数的使用
1.url
$this->load->helper("url");
//可以根据需要配置自动加载
//application\config\autoload.php
//$autoload["helper"] = array("url");
site_url("控制器/方法")
base_url();
2.伪静态和隐藏入口文件

访问接口的域名可以设置重新,在laravel中体现的淋漓尽致,在CI中需要自定义正则去解决这个问题(或许这种所谓的麻烦,也正是CI高度自由的优点)
隐藏入口文件和路由没有关系,第一需要开启apache重写规则,第二写个阿帕奇的文件,就可以解决了


十、类库
1、分页功能
分页功能要加载类库中的pagination文件 用到动态获取url函数还要架子啊帮助函数中的url
用到视图,就要加载视图文件load view文件
#分页功能
public function paginate(){
//CI中的控制器文件夹是存放控制器 模型是文件夹是存放制作数据库的 视图是存放视图文件的 core文件夹是存放核心控制器,基类控制器
//route是定义路由 config是项目所需要也是提炼出去的,除此以外项目还会用到零碎的函数文件helper等等
//然后对于此项目中libraries类库 是用来做分页,等等特殊功能使用的;
//加载类库中的分页类
$this->load->library("pagination");
//配置分页参数(后面可以生成分页标签所必须的参数)
$this->load->helper("url");
$config["base_url"] = site_url("article/paginate");//CI中与众不同的地方生成url地址的地方
$pagi_size = 2;
$config["total_rows"] = 7; //总条数,用于计算分页器使用
$config["per_page"] = $pagi_size;//每页展示条数,用于计算分页器使用
//加载完成之后,传入配置
$this->pagination->initialize($config);
//路由中的pathinfo第三个参数是偏移量,这里不同以往的是 他传的不是页码 而是偏移量(可以根据偏移量计算页码)
//获取偏移量
$offset = intval($this->uri->segment(3));
$this->load->database();
$res = $this->db->from("user")->limit($offset,$pagi_size)->get();//获取数据传到视图
$data["info"] = $res->result_array();
//向视图提供分页器
$data["links"] = $this->pagination->create_links();
$this->load->view("user/pagi",$data);
}
2.上传文件

3.session的使用
首先明白CI中的session使用的是cookie机制,他是设置好,不能直接使用的,必须经过下一次请求;session的加密类似于token;
$this->load->library("session");//加载封装的session类库
$user = array("id"=>3,"name"=>"jack");
$this->session->set_userdata("user",$user);//将数据存入到cookie中(注意:向cookie中存数据必须是键值对形式)
当浏览器请求这个接口,就可以设置session了
为了安全我们可以去配置文件config中进行再配置 $config["encryption_key"] = md5(uniqid());
如果为了数据显示的安全,还可以进行再配置加密 $config[sessiom_encrypt_cookie] = TRUE
显示Cookie
$this->load->library("session");
$user = $this->session->userdata("user");
var_dump($user);
一次性cookie的使用
设置
$this->session->set_flashdata("test","bbbbbbbbbbbbbbbbbb")
显示
$test = $this->session->flashdata("test");
echo $test;
4.验证码

6.参数验证



浙公网安备 33010602011771号