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.参数验证

posted @ 2020-02-25 12:13  锐庆  阅读(370)  评论(0)    收藏  举报