>php教程 >PHP开发 >CodeIgniter 연구 노트 Item10--CI 요약 본질

CodeIgniter 연구 노트 Item10--CI 요약 본질

黄舟
黄舟원래의
2016-12-29 10:40:121377검색

Yii 

CI 

ThinkPHP 

ZF

主要内容

CI简介

深入MVC设计模式

CI中控制器与视图

CI的超级对象

数据库访问

AR模型

如何扩展CI的控制器(登录验证)

模型

url相关函数

设置路由

隐藏入口文件

分页

文件上传

Session

验证码

表单验证

CI是什么? 

CodeIgniter是一个轻量级但功能强大的PHP框架 

基于MVC设计模式,提供了一套丰富的类库 

简单易学,高效实用

官方网站

www.codeigniter.com

中文网站

http://codeigniter.org.cn

下载当前最新版本 

CodeIgniter_3.0.2.zip

有什么特点?

[code]你想要一个小巧的框架
你需要出色的性能
你需要广泛兼容标准主机上的各种 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 

可以自定义方法,通过index.php/welcome/test来访问。

控制器

[code]1.不需要加后缀
2.文件名全部小写  例如 user.php
3.所有的控制器,直接或间接继承自CI_Controller类,为了避免重复,自己定义的类不要以CI开头
4.控制器中,对动作(方法)要求:
    public      /protected和private不能被浏览器请求,
    不能以_开头,在内部调用的可以这么用。
    方法名不区分大小写
    不要建立与控制器类名相同的方法,会被解析成构造方法,买一送一

视图

1.在控制器中如果加载视图

[code]//直接写视图名字,不写扩展名,如果有子目录,则写上目录名
        $this->load->view(视图);
        可以多次调用$this->load->view(视图);
[code]2.视图中,直接使用原生php代码

3.推荐使用


[code]        <?php foreach($list as $item):?>
        <?=$item[&#39;name&#39;]?>
        <?php endforeach;?>


超级对象

[code]当前的控制器对象 var_dump($this)
提供了很多属性:
$this->load   var_dump($this->load)
    装载器类的实例system/core/Loader.php
        CI会自动实例化一个CI_Loader对象,放在超级对象的属性中
        $obj = new CI_Loader();
        $this->load = $obj;
        $this->load->view(&#39;user/index&#39;);
    装载器类提供方法:
    view()      装载视图
    vars()      分配变量到视图
    database()  装载数据库操作对象 
    model()     装载模型对象
    helper()


$this->uri

[code]是CI_URI类的实例 system/core/URI.php
    CI_URI类提供方法:
    segment(n) 用于获取url中的第n个参数(值)

传统的:

入口文件.php/控制器/动作/参数1/值1/参数2/值2

[code]    入口文件.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
    }

$this->input

[code]输入类
    是CI_Input类的实例 system/core/Input.php
    CI_Input类提供方法:
    $this->input->post(&#39;username&#39;);//$_POST[&#39;username&#39;]
    $this->input->server(&#39;DOCUMENT_ROOT&#39;);//$_SERVER[&#39;DOCUMENT_ROOT&#39;]
在视图中,直接用$this来访问超级对象中的属性<?php echo $this->input->server(&#39;REMOTE_ADDR&#39;)?>


数据库访问

[code]修改配置文件
application/config/database.php
将数据库访问对象,装载到超级对象的属性中 $this->db
$this->load->database();
$res=$this->db->query($sql);//返回对象
$res->result();//返回数组,数组中是一个一个的对象$result->id
$res->result_array();//返回二维数组,里面是关联数组$result[&#39;id&#39;]
$res->row()//返回第一条数据,直接是一个对象
参数绑定
$sql="select * from blog_user where name=?";
$this->db->query($sql,$name);//如果有多个问号时,需要传入一个索引数组
表前缀
$db[&#39;default&#39;][&#39;dbprefix&#39;] = &#39;blog_&#39;;
$db[&#39;default&#39;][&#39;swap_pre&#39;] = &#39;blog_&#39;;
配置为一样,代码中,直接硬编码表前缀就行了,如果以后项目数据库表前缀发生变化,
只需要修改$db[&#39;default&#39;][&#39;dbprefix&#39;] = &#39;new_&#39;;代码中的blog_会自动替换为new_
db的自动加载
    application/config/autoload.php
    $autoload[&#39;libraries&#39;] = array(&#39;database&#39;);
    不需要:$this->load->database();
自增id
$this->db->insert_id();
受影响行数
$this->db->affected_rows();


Active Record

[code]1.application/config/database.php
    $active_record = TRUE;
2.application/config/autoload.php
    $autoload[&#39;libraries&#39;] = array(&#39;database&#39;);
3.在配置文件中,配置表前缀后,会自动添加
$res=$this->db->get(&#39;表名&#39;);//返回结果集对象
$res->result();
$bool=$this->db->insert(&#39;表名&#39;,关联数组);
$bool=$this->db->update(&#39;表名&#39;,关联数组,条件);
$bool=$this->db->delete(&#39;表名&#39;,条件);
//select id,name from tableName where id>=3 order by id desc limit 2,3
$res=$this->db->select(&#39;id,name&#39;)
    ->from(&#39;user&#39;)
    ->where(&#39;id >=&#39;,3)
    ->limit(3,2)//跳过2条,取出3条数据
    ->order_by(&#39;id desc &#39;)
    ->get();
//显示最近一条SQL
echo $this->db->last_query();
//where
//$res=$this->db->where(&#39;name&#39;,&#39;mary&#39;)->get(&#39;user&#39;);
//$res=$this->db->where(&#39;name !=&#39;,&#39;mary&#39;)->get(&#39;user&#39;);
//$res=$this->db->where(array(&#39;name&#39;=>&#39;mary&#39;))->get(&#39;user&#39;);
//$res=$this->db->where(array(&#39;name&#39;=>&#39;mary&#39;,&#39;id >&#39;=>2))->get(&#39;user&#39;);
复杂的查询,请用$this->db->query($sql,$data);//使用问号绑定参数

扩展CI控制器

[code]application/core/MY_Controller.php
控制器就要以继承自MY_Controller
可以在自定义的控制器中扩展一些类。
application/config/config.php
$config[&#39;subclass_prefix&#39;] = &#39;MY_&#39;;

模型

[code]继承自CI_Model
在模型中,可以直接使用超级对象中的属性
文件名,全小写
类名首字母大写
建议使用_model作为后缀,防和控制器类名冲突
控制器要什么数据,model就写一个方法,model提供数据。


url相关函数

[code]$this->load->helper(&#39;url&#39;);
//可以根需要配置自动加载
//application/config/autoload.php
//$autoload[&#39;helper&#39;] = array(&#39;url&#39;);
site_url(&#39;控制器/方法&#39;)
base_url()//index.php的主入口。

路由

[code]application/config/routes.php
//默认控制器
$route[&#39;default_controller&#39;] = "welcome";
//http://localhost/ci/index.php/news/201309/4.html
$route[&#39;news/[\d]{6}/([\d]+)\.html&#39;]=&#39;article/show/$1&#39;;


隐藏入口文件

[code]开始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>

分页

[code]//装载类文件
$this->load->library(&#39;pagination&#39;);
$this->load->helper(&#39;url&#39;);
//每页显示10条数据
$page_size=10;
$config[&#39;base_url&#39;] =site_url(&#39;user/test&#39;);
//一共有多少条数据
$config[&#39;total_rows&#39;] = 100;
//每页显示条数
$config[&#39;per_page&#39;] = $page_size; 
$config[&#39;first_link&#39;] = &#39;首页&#39;;
$config[&#39;next_link&#39;] = &#39;下一页&#39;;
$config[&#39;uri_segment&#39;]=3;//分页的数据查询偏移量在哪一段上
$this->pagination->initialize($config);
$offset=intval($this->uri->segment(3));//与$config[&#39;uri_segment&#39;]对应
$sql="select * from blog_user limit $offset, $page_size";
echo $sql;
$data[&#39;links&#39;]=$this->pagination->create_links();
$this->load->view(&#39;user/test&#39;,$data);


文件上传

[code]1.手动创建好上传目录
<form action="<?php echo site_url(&#39;user/upload&#39;)?>" method="post" enctype="multipart/form-data">
    <input type="file" name="pic"  />
    <input type="submit" value="上传" >
</form>
//上传目录需要手工创建
$config[&#39;upload_path&#39;]=&#39;./uploads/&#39;;
//允许
$config[&#39;allowed_types&#39;]=&#39;gif|png|jpg|jpeg&#39;;
$config[&#39;max_size&#39;] = &#39;10000&#39;;
//生成新文件名
$config[&#39;file_name&#39;]=uniqid();
//装载文件上传类
$this->load->library(&#39;upload&#39;,$config);
$this->upload->do_upload(&#39;pic&#39;);
var_dump($this->upload->data());
//获取上传之后的数据
$data=$this->upload->data();
echo $data[&#39;file_name&#39;];

验证码

[code]//生成一个随机不重复的字符串作为加密用的key
    //保存到application/config/config.php
    //$config[&#39;encryption_key&#39;] = &#39;adb8bf6d0ac4e17b42a80941582497a4&#39;;
    //echo md5(uniqid());exit;
    $this->load->library(&#39;session&#39;);
    $user=array(&#39;id&#39;=>3,&#39;name&#39;=>&#39;jack&#39;);
    //session_start();
    //$_SESSION[&#39;user&#39;]=$user;
    $this->session->set_userdata(&#39;user&#39;,$user);
    //不在这这里获取刚放入的数据
    //只有页在从新加载或跳转到别的url中,才能获取到
    //一次性的数据,只能读取一次
    $this->session->set_flashdata(&#39;test&#39;,&#39;aaaaaaaaaaaaaa&#39;);
}
public function show_session(){
    $this->load->library(&#39;session&#39;);
    //取CI session中的数据
    $user=$this->session->userdata(&#39;user&#39;);
    var_dump($user);
    //下次刷新,就没有了
    $test=$this->session->flashdata(&#39;test&#39;);
    echo $test;
}

表单验证

[code]$this->load->library(&#39;form_validation&#39;);
    $this->form_validation->set_rules(&#39;name&#39;, &#39;用户名&#39;, &#39;required&#39;);
    $this->form_validation->set_rules(&#39;email&#39;, &#39;邮箱&#39;, &#39;valid_email&#39;);
    $bool=$this->form_validation->run();
    if($bool){
        //调用模型保存到数据库
    }else{
        //显示错误信息
        $this->load->view(&#39;user/add&#39;);
    }
    <?php echo validation_errors();?>
    <form action="<?php echo site_url(&#39;user/insert&#39;);?>" method="post">
        name <input type="text" name="name" value="<?php echo set_value(&#39;name&#39;)?>" />
        <?php echo form_error(&#39;name&#39;,&#39;<span>&#39;,&#39;</span>&#39;)?>
        <br>
        password <input type="password" name="password" /><br>
        email <input type="text" name="email" value="<?php echo set_value(&#39;email&#39;)?>" />
        <?php echo form_error(&#39;email&#39;)?>
        <br>
        <input type="submit" value="submit" />
    </form>
    //生成一个随机不重复的字符串作为加密用的key
        //保存到application/config/config.php
        //$config[&#39;encryption_key&#39;] = &#39;adb8bf6d0ac4e17b42a80941582497a4&#39;;
        //echo md5(uniqid());exit;
        $this->load->library(&#39;session&#39;);
        $user=array(&#39;id&#39;=>3,&#39;name&#39;=>&#39;jack&#39;);
        //session_start();
        //$_SESSION[&#39;user&#39;]=$user;
        $this->session->set_userdata(&#39;user&#39;,$user);
        //不在这这里获取刚放入的数据
        //只有页在从新加载或跳转到别的url中,才能获取到
        //一次性的数据,只能读取一次
        $this->session->set_flashdata(&#39;test&#39;,&#39;aaaaaaaaaaaaaa&#39;);
    }
    public function show_session(){
        $this->load->library(&#39;session&#39;);
        //取CI session中的数据
        $user=$this->session->userdata(&#39;user&#39;);
        var_dump($user);
        //下次刷新,就没有了
        $test=$this->session->flashdata(&#39;test&#39;);
        echo $test;
    }
表单验证
    $this->load->library(&#39;form_validation&#39;);
    $this->form_validation->set_rules(&#39;name&#39;, &#39;用户名&#39;, &#39;required&#39;);
    $this->form_validation->set_rules(&#39;email&#39;, &#39;邮箱&#39;, &#39;valid_email&#39;);
    $bool=$this->form_validation->run();
    if($bool){
        //调用模型保存到数据库
    }else{
        //显示错误信息
        $this->load->view(&#39;user/add&#39;);
    }
    <?php echo validation_errors();?>
    <form action="<?php echo site_url(&#39;user/insert&#39;);?>" method="post">
        name <input type="text" name="name" value="<?php echo set_value(&#39;name&#39;)?>" />
        <?php echo form_error(&#39;name&#39;,&#39;<span>&#39;,&#39;</span>&#39;)?>
        <br>
        password <input type="password" name="password" /><br>
        email <input type="text" name="email" value="<?php echo set_value(&#39;email&#39;)?>" />
        <?php echo form_error(&#39;email&#39;)?>
        <br>
        <input type="submit" value="submit" />
    </form>

最终user.php

[code]<?php 
    class User extends CI_Controller{
        //连接数据库操作
        public function showusers(){
            //1.装载数据库操作类
            $this->load->database();//可以传参,表示连接哪个数据库,在配置中配置多个数据库即可。
            //装载成功后,可以用$this->db;
            //var_dump($this->db);
            $sql = &#39;select * from users&#39;;
            $res = $this->db->query($sql);//msql_query();
            //var_dump($res);
            $users = $res->result();//返回对象数组;
            //echo "<pre class="brush:php;toolbar:false">";
            //var_dump($users);
            // mysql_fetch_assoc(result);//关联数组
            // mysql_fetch_object(result);//返回对象
            // 在页面中将数据带过去
            $data[&#39;user_list&#39;] = $users;
            $this->load->view(&#39;user/showusers&#39;,$data);
        }
        public function add(){
            $this->load->database();
            $sql = "insert into users (id,name,password,age,sex) values (5,&#39;xiao&#39;,&#39;34234&#39;,23,&#39;男&#39;)";
            $bool = $this->db->query($sql);
            if($bool){
                //mysql_affected_rows();
                echo "受影响的行数:".$this->db->affected_rows();
                echo "自增id为:".$this->db->insert_id();
            }
        }
        public function insert(){
            $data[&#39;id&#39;] = 6;
            $data[&#39;name&#39;] = &#39;guo&#39;;
            $sql = "insert into users (id, name) values(?,?)";
            $bool = $this->db->query($sql,$data);
            if($bool){
                //mysql_affected_rows();
                echo "受影响的行数:".$this->db->affected_rows();
                echo "自增id为:".$this->db->insert_id();
            }
        }
        //AR模型简化操作
        public function get(){
            //查询
            // $res = $this->db->get(&#39;users&#39;);
            // foreach ($res->result() as $item) {
            //  echo $item->name;
            //  echo "<br>";
            // }
            //增加
            /*$data = array(
                &#39;id&#39;=>8,
                &#39;name&#39;=>&#39;xiaoxiao&#39;,
                &#39;sex&#39;=>&#39;男&#39;
                );
            $bool = $this->db->insert(&#39;users&#39;,$data);
            var_dump($bool);*/
            //改
            /*$data = array(
                &#39;name&#39;=>&#39;果果&#39;,
                &#39;sex&#39;=>&#39;女&#39;,
                &#39;age&#39;=>44
                );
            $bool = $this->db->update(&#39;users&#39;,$data,array(&#39;id&#39;=>1));
            var_dump($bool);*/
            //删
            // $bool = $this->db->delete(&#39;users&#39;,array(&#39;id&#39;=>0));
            // var_dump($bool);
            // select id, name, age,sex,from users where id <=5 order by id desc limit 2,3;
            $res = $this->db->select(&#39;id&#39;,&#39;name&#39;,&#39;age&#39;,&#39;sex&#39;)
                    ->from(&#39;users&#39;)
                    ->where(&#39;id <=5&#39;)
                    ->order_by(&#39;id desc&#39;)
                    ->limit(3,2)
                    ->get();
            var_dump($res->result());
        }
        // private function _test(){
        //  echo "string";
        // }
        public function index(){
            //$this->_test();
            // $this->load->view(&#39;user_index&#39;);
            $list = array(
                    array(&#39;id&#39;=>1, &#39;name&#39;=>&#39;xiao&#39;, &#39;email&#39;=>&#39;xiao@gmail.com&#39;),
                    array(&#39;id&#39;=>2, &#39;name&#39;=>&#39;guo&#39;, &#39;email&#39;=>&#39;guo@gmail.com&#39;),
                    array(&#39;id&#39;=>3, &#39;name&#39;=>&#39;ping&#39;, &#39;email&#39;=>&#39;ping@gmail.com&#39;),
                );
            //标量分配,在视图中直接可以$title.获得变量
            //$this->load->vars(&#39;title&#39;,&#39;这是标题&#39;);
            $data[&#39;title&#39;] = &#39;这是标题&#39;;
            //分配多个变量
            $data[&#39;list&#39;] = $list;
            //设置为了关联数组,$title和$list;
            $this->load->vars($data);
            $this->load->view(&#39;header&#39;);
            $this->load->view(&#39;user/index&#39;);
            echo $this->uri->segment(1);
        }
        // public function user(){
        //  echo "user控制器的user方法<br>";
        // }
        // public function user2(){
        //  echo "user控制器的user2方法<br>";
        // }
        public function model(){
            //装载模型
            // $this->load->model(&#39;User_model&#39;,&#39;user&#39;);
            // //调用模型数据
            // $list = $this->user->getAllUser();
            // //视图显示
            // $this->load->view(&#39;user/index2.php&#39;,array(&#39;list&#39;=>$list));
            //加载函数
            $this->load->helper(&#39;url&#39;);
            $this->load->view(&#39;user_index&#39;);
        }
        public function submit(){
            var_dump($this->input->post(&#39;name&#39;));
        }
        // 文件上传类
        public function file(){
            $this->load->helper(&#39;url&#39;);
            $this->load->view(&#39;user/file&#39;);
        }
        public function upload(){
            $config[&#39;upload_path&#39;] = &#39;./uploads/&#39;;
            $config[&#39;allowed_types&#39;] = &#39;gif|jpg|png&#39;;
            $config[&#39;max_size&#39;] = &#39;10000&#39;;
            $config[&#39;file_name&#39;] = uniqid();
            $this->load->library(&#39;upload&#39;, $config);
            $this->upload->do_upload(&#39;pic&#39;);
            $data = $this->upload->data();
            echo $data[&#39;file_name&#39;];
            //$this->upload->initialize($config);
        }
        public function init(){
            // 生成一个随机不重复的字符串,用于加密
            // 保存到$config[&#39;encryption_key&#39;]
            // echo md5(uniqid());exit;
            $this->load->library(&#39;session&#39;);
            $user = array(&#39;id&#39;=>3,&#39;name&#39;=>&#39;jack&#39;);
            // session_start();
            // $_session[&#39;user&#39;] = $user;
            $this->session->set_userdata(&#39;user&#39;,$user);
            // 不在这里获取刚放入的数据,只有页面
            // 在重新加载或跳转到别的页面时,才能获取
            $this->session->set_flashdata(&#39;test&#39;,&#39;aaaaa&#39;);
        }
        public function show_session(){
            $this->load->library(&#39;session&#39;);
            $user = $this->session->userdata(&#39;user&#39;);
            var_dump($user);
            $test = $this->session->flashdata(&#39;test&#39;);
            echo $test;
        }
        public function captcha(){
            $this->load->helper(&#39;captcha&#39;);
            $this->load->helper(&#39;url&#39;);
            $vals = array(
                //&#39;word&#39; => rand(1000,9999),
                &#39;img_path&#39; => &#39;./captcha/&#39;,//这个目录需要手工创建
                &#39;img_url&#39; => base_url().&#39;captcha/&#39;,
                &#39;img_width&#39; => &#39;150&#39;,
                &#39;img_height&#39; => 30,
                &#39;expiration&#39; => 5
                );
            $cap = create_captcha($vals);
            $this->load->view(&#39;user/captcha&#39;,array(&#39;cap&#39;=>$cap[&#39;image&#39;]));
            session_start();
            $_SESSION[&#39;cap&#39;] = $cap[&#39;word&#39;];
            // 验证时,对比$_SESSION[&#39;cap&#39;],可以不从服务器中读取
        }
    }
 ?>

 以上就是CodeIgniter学习笔记 Item10--CI总结精华的内容,更多相关内容请关注PHP中文网(www.php.cn)!


성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.