文档章节

CI:CodeIgniter框架简单开发笔记

康师傅
 康师傅
发布于 06/28 22:48
字数 2524
阅读 37
收藏 0

=====================================
CodeIgniter框架(邹义良老师讲课大纲)
=====================================
主要内容
    CI简介
    深入MVC设计模式
    CI中控制器与视图
    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.不需要加后缀
    2.文件名全部小写  例如 user.php
    3.所有的控制器,直接或间接继承自CI_Controller类
    4.控制器中,对动作(方法)要求:
        public
        不能以_开头
    
视图
    1.在控制器中如果加载视图
        //直接写视图名字,不写扩展名,如果有子目录,则写上目录名
        $this->load->view(视图);
        可以多次调用$this->load->view(视图);
    2.视图中,直接使用原生php代码
    3.推荐使用
        <?php foreach($list as $item):?>
        <?=$item['name']?>
        <?php endforeach;?>
        
超级对象
    当前的控制器对象
    提供了很多属性:
    $this->load
        装载器类的实例system/core/Loader.php
        装载器类提供方法:
        view()        装载视图
        vars()        分配变量到视图
        database()    装载数据库操作对象 
        model()        装载模型对象
        helper()    
        
    $this->uri
        是CI_URI类的实例 system/core/URI.php
        CI_URI类提供方法:
        segment(n) 用于获取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=0){
            echo $p;//输出6
        }
        上面说明不一定要使用segment参数,直接在方法中说明参数,就可以接受地址栏中的分段参数
        

    $this->input
        输入类
        是CI_Input类的实例 system/core/Input.php
        CI_Input类提供方法:
        $this->input->post('username');        //$_POST['username']
        $this->input->server('DOCUMENT_ROOT');    //$_SERVER['DOCUMENT_ROOT']
        
    在视图中,直接用$this来访问超级对象中的属性,原理就是将视图include到控制器的PHP文件中了。
    
    
数据库访问
    
    修改配置文件
    application/config/database.php
    
    将数据库访问对象,装载到超级对象的属性中 $this->db
    $this->load->database();
    
    $sql='select * from blog_user';
    $res=$this->db->query($sql);//返回对象
    $res->result();//返回数组,数组中是一个一个的对象
    $res->result_array();//返回二维数组,里面是关联数组
    $res->row()//返回第一条数据,直接是一个对象
    
    在SQL语句中使用参数,并将参数绑定到?
    $name='lily';
    $sql="select * from blog_user where name=?";
    $this->db->query($sql,$name);//如果有多个问号时,需要传入一个索引数组
    如:
    $data[0]='lily';
    $data[1]='lily';
    $sql="insert into blog_user(name,password) vlaues(?,md5(?))";
    $this->db->query($sql,$data);
    if ($bool)
     {
        echo '受影响行数:'.$this->db->affected_rows();
        echo '自动ID:'.$this->db->insert_id();
     }

    表前缀
    $db['default']['dbprefix'] = 'blog_';
    $db['default']['swap_pre'] = 'new_';
        配置为一样,代码中,直接硬编码表前缀就行了,如果以后项目数据库表前缀发生变化,
    只需要修改$db['default']['dbprefix'] = 'new_';代码中的blog_会自动替换为new_
    即:$sql="insert into new_user(name,password) vlaues(?,md5(?))";
    将来运行的时候,会将new_替换为blog_,这样,就可以省了好多事
    仔细想想,应该是写成一样的,以后修改的时候,就可以了。

    
    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 id 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'))->get('user');
    //$res=$this->db->where(array('name'=>'mary','id >'=>2))->get('user');

    复杂的查询,请用$this->db->query($sql,$data);//使用问号绑定参数
    
    
扩展CI控制器
    application/core/MY_Controller.php,在此位置定义自己的控制类,让application/controller下的
    控制器都继承MY_Controller
    而在
    控制器就要以继承自MY_Controller
    
    application/config/config.php
    $config['subclass_prefix'] = 'MY_';  //注意,这个就是用户自定的控制器,用户自定义的控制器继承此MY_控制器
    
模型
    继承自CI_Model
    在模型中,可以直接使用超级对象中的属性,如$this->db
    文件名,全小写
    类名首字母大写
    建议使用_model作为后缀,防和控制器类名冲突
    
    
url相关函数
    $this->load->helper('url');//这个是必须要加载的
    //可以根需要配置自动加载
    //application/config/autoload.php
    //$autoload['helper'] = array('url');
    
    site_url('控制器/方法')
    base_url()    //网站的根目录
     
    
路由
    application/config/routes.php
    //默认控制器
    $route['default_controller'] = "welcome";
    
    
    $route['news/[\d]{6}/([\d]+)\.html']='article/show/$1'; 通过这个路由规则,产生如下的地址:
    //http://localhost/ci/index.php/news/201309/4.html

隐藏入口文件
    开启apache的rewrite模块,在httpd.conf文件中
    LoadModule rewrite_module modules/mod_rewrite.so
    重启apache
    在CI对应应用的入口文件同级目录中,放入一个.htaccess文件
    内容如下:
        <IfModule mod_rewrite.c>
           RewriteEngine on
           RewriteCond %{REQUEST_FILENAME} !-d
           RewriteCond %{REQUEST_FILENAME} !-f
           RewriteRule ^(.*)$ index.php/$1 [QSA,PT,L]  这就是将apache找不到的文件,全部路由到index.php文件中
        </IfModule>

分页
    //装载类文件
    $this->load->library('pagination');
    $this->load->helper('url');
    //每页显示10条数据
    $page_size=每页显示的记录条数;
    
    $config['base_url'] =site_url('user/test');//特别注意:此处是分页时用的网址
    //一共有多少条数据
    $config['total_rows'] = 总的记录数;
    //每页显示条数
    $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_category limit $offset, $page_size";
    echo $sql;
    
    
    $data['links']=$this->pagination->create_links();
    
    $this->load->view('user/test',$data);

    在view中,应该如下语句:
    <body>
     <?php 
        echo '查询的语句:'.$sql.'<br>';
        foreach ($rs as $key => $value)
        {
            echo $value->name.'<br>';
        }
        
        echo $links;        
        
        ?>
    </body>
    

文件上传
    1.手动创建好上传目录
    
    这是view中的上传文件视图,注意enctype的类型
    <form action="<?php echo site_url('user/upload')?>" method="post" enctype="multipart/form-data">
        <input type="file" name="pic"  />
        <input type="submit" value="上传" >
    </form>
    
    //上传目录需要手工创建,注意 .就是当前目录,ci的入口就是index.php,.当前目录就是index.php所在的目录
    $config['upload_path']='./uploads/';
    //允许的图片类型
    $config['allowed_types']='gif|png|jpg|jpeg';
    $config['max_size'] = '10000';
    //生成新文件名,也可以通过date()函数配置为含有时间特征的文件名
    $config['file_name']=uniqid();
    //装载文件上传类
    $this->load->library('upload',$config);
    $this->upload->do_upload('pic'); //pic是表单中的文件字段的名称
    
    var_dump($this->upload->data()); //data() 是上传之后的文件相关属性集合
    
    //获取上传之后的数据
    $data=$this->upload->data();
    echo $data['file_name'];

    
验证码
        //使用CI的session时,要注意:
        //生成一个随机不重复的字符串作为加密用的key
        //保存到application/config/config.php
        //$config['encryption_key'] = 'adb8bf6d0ac4e17b42a80941582497a4';
        //echo md5(uniqid());exit;这一句不用管,是用来生成加密key的
        $this->load->library('session'); //调用session
        $user=array('id'=>3,'name'=>'jack');
        //session_start();
        //$_SESSION['user']=$user;
        $this->session->set_userdata('user',$user); //设置相应的session数据
        //不能在这这里获取刚放入的数据
        //只有页在重新加载或跳转到别的url中(就是显示view之后),才能获取到
        
        //这是单独使用的一次性session数据,只能读取一次
        $this->session->set_flashdata('test','aaaaaaaaaaaaaa');
        
    }
    
    public function show_session(){  //显示session
        
        $this->load->library('session');
        //取CI session中的数据
        $user=$this->session->userdata('user');
        var_dump($user);
        
        //下次刷新或者再取一次,test就没有了
        $test=$this->session->flashdata('test');
        echo $test;
        
    }
    
表单验证
    
    $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/add');
        
    }
    
    
    
    <?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="<?php echo set_value('email')?>" />
        <?php echo form_error('email')?>
        <br>
        <input type="submit" value="submit" />
    </form>


注意:使用中文的语言包,请将语言包拷贝到:application/language目录中,并且在application/config.php
中将语言支持更改为:zh_cn,这样,所有的验证信息都可以被翻译为中文的。

© 著作权归作者所有

康师傅
粉丝 2
博文 32
码字总数 18096
作品 0
昆明
后端工程师
私信 提问
CodeIgniter 框架分析

入口文件 入口文件主要完成下列工作: 1) 指定 CodeIgniter 框架所在目录; 2) 定义 APPPATH 常量,指示应用程序文件根目录; 3) 载入 codeigniter/CodeIgniter.php 文件,启动框架。 codeig...

那些年我们一起
2012/08/10
6K
17
CodeIgniter 3.0 RC 发布,PHP 的 MVC 框架

CodeIgniter 3.0 RC 发布,此版本现已提供下载(ZIP)。详细更新内容请看这里:https://github.com/bcit-ci/CodeIgniter/blob/develop/user_guide_src/source/changelog.rst。 前几天还发布了...

愤怒的小兔
2015/01/27
5.9K
58
CodeIgniter 4 宣布开发路线图

我们综合考虑了社区的愿望和意见后,也对什么样的未来对 CI 是最合适的做了一些思考,然后,CI 理事会对框架的未来做出了一些决策。预告一下,未来将会有重大变化,但我们相信他们不仅为我们...

CodeIgniter中国
2016/03/24
8.4K
32
在 IIS 上安装和设置 CodeIgniter

我将尝试分享我在 Windows XP Service Pack 2 (IIS 5.1;PHP 4.3.11)上安装 CodeIgniter 框架的经验。PHP 手动安装为 CGI 模式。 要安装 CI,你的 IIS 可能需要一个像 mod_rewrite 这样的东西...

红薯
2009/01/16
1K
0
CodeIgniter3.0项目推荐

权限系统 https://github.com/benedmunds/CodeIgniter-Ion-Auth 国际化 https://github.com/bcit-ci/codeigniter3-translations session存储库 https://github.com/cnsaturn/codeigniter-my......

果树啊
2015/03/13
364
1

没有更多内容

加载失败,请刷新页面

加载更多

OSChina 周六乱弹 —— 不要在领导修风扇的时候打开电扇

Osc乱弹歌单(2019)请戳(这里) 【今日歌曲】 @巴拉迪维 :《Whats Up》 主唱妹子 Lina Perry 的嗓音实在太有力了,收放自如的自信才能唱出这么优秀的歌吧!#今日歌曲推荐# 《Whats Up》-...

小小编辑
今天
7
0
SpringBoot集成Elasticsearch并进行增删改查操作

一、创建工程 使用IntelliJ创建SpringBoot工程 SpringBoot版本为2.0.4 ElasticSearch为5.6.10 删掉蓝框中的文件(如上) 最后我们的目录结构(如下) 下面pom文件主要修改的是把spring boot从Int...

一字见心
今天
5
0
x001-版本介绍

python版本介绍 目前有2 和 3 有很多企业用的代码是2版本,随着技术的发展,以后用3的会成为大趋势 python3的安装 yum -y install wget gcc zlib-devel bzip2-devel openssl-devel ncurses-d...

侠客行之石头
今天
5
0
聊聊rocketmq的TransientStorePool

序 本文主要研究一下rocketmq的TransientStorePool TransientStorePool rocketmq-all-4.6.0-source-release/store/src/main/java/org/apache/rocketmq/store/TransientStorePool.java publi......

go4it
昨天
6
0
笔记

场外借贷, 质押 ,托管, 永续合约. 场外借贷,n签合同. 新功能 证券交易组负责中信证券机构及个人投资交易相关系统,服务机构及个人投资客户, 涉及到两融、期权、 期货、做市等境内境外创新业...

MtrS
昨天
6
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部