CodeIgniter学习笔记 Item10--CI总结精华

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

有什么特点?

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

控制器

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

视图

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

//直接写视图名字,不写扩展名,如果有子目录,则写上目录名
        $this->load->view(视图);
        可以多次调用$this->load->view(视图);
2.视图中,直接使用原生php代码
3.推荐使用
        <?php foreach($list as $item):?>
        <?=$item['name']?>
        <?php endforeach;?>

超级对象

当前的控制器对象 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('user/index');
    装载器类提供方法:
    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
    }

$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来访问超级对象中的属性<?php echo $this->input->server('REMOTE_ADDR')?>

数据库访问

修改配置文件
application/config/database.php

将数据库访问对象,装载到超级对象的属性中 $this->db
$this->load->database();

$res=$this->db->query($sql);//返回对象
$res->result();//返回数组,数组中是一个一个的对象$result->id
$res->result_array();//返回二维数组,里面是关联数组$result['id']
$res->row()//返回第一条数据,直接是一个对象

参数绑定
$sql="select * from blog_user where name=?";
$this->db->query($sql,$name);//如果有多个问号时,需要传入一个索引数组

表前缀
$db['default']['dbprefix'] = 'blog_';
$db['default']['swap_pre'] = 'blog_';

配置为一样,代码中,直接硬编码表前缀就行了,如果以后项目数据库表前缀发生变化,
只需要修改$db['default']['dbprefix'] = 'new_';代码中的blog_会自动替换为new_

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
控制器就要以继承自MY_Controller
可以在自定义的控制器中扩展一些类。

application/config/config.php
$config['subclass_prefix'] = 'MY_';

模型

继承自CI_Model
在模型中,可以直接使用超级对象中的属性
文件名,全小写
类名首字母大写
建议使用_model作为后缀,防和控制器类名冲突

控制器要什么数据,model就写一个方法,model提供数据。

url相关函数

$this->load->helper('url');
//可以根需要配置自动加载
//application/config/autoload.php
//$autoload['helper'] = array('url');

site_url('控制器/方法')
base_url()//index.php的主入口。

路由

application/config/routes.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['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 echo site_url('user/upload')?>" method="post" enctype="multipart/form-data">
    <input type="file" name="pic"  />
    <input type="submit" value="上传" >
</form>

//上传目录需要手工创建
$config['upload_path']='./uploads/';
//允许
$config['allowed_types']='gif|png|jpg|jpeg';
$config['max_size'] = '10000';
//生成新文件名
$config['file_name']=uniqid();
//装载文件上传类
$this->load->library('upload',$config);
$this->upload->do_upload('pic');

var_dump($this->upload->data());

//获取上传之后的数据
$data=$this->upload->data();
echo $data['file_name'];

验证码

//生成一个随机不重复的字符串作为加密用的key
    //保存到application/config/config.php
    //$config['encryption_key'] = 'adb8bf6d0ac4e17b42a80941582497a4';
    //echo md5(uniqid());exit;
    $this->load->library('session');
    $user=array('id'=>3,'name'=>'jack');
    //session_start();
    //$_SESSION['user']=$user;
    $this->session->set_userdata('user',$user);
    //不在这这里获取刚放入的数据
    //只有页在从新加载或跳转到别的url中,才能获取到

    //一次性的数据,只能读取一次
    $this->session->set_flashdata('test','aaaaaaaaaaaaaa');

}

public function show_session(){

    $this->load->library('session');
    //取CI session中的数据
    $user=$this->session->userdata('user');
    var_dump($user);

    //下次刷新,就没有了
    $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>

    //生成一个随机不重复的字符串作为加密用的key
        //保存到application/config/config.php
        //$config['encryption_key'] = 'adb8bf6d0ac4e17b42a80941582497a4';
        //echo md5(uniqid());exit;
        $this->load->library('session');
        $user=array('id'=>3,'name'=>'jack');
        //session_start();
        //$_SESSION['user']=$user;
        $this->session->set_userdata('user',$user);
        //不在这这里获取刚放入的数据
        //只有页在从新加载或跳转到别的url中,才能获取到

        //一次性的数据,只能读取一次
        $this->session->set_flashdata('test','aaaaaaaaaaaaaa');

    }

    public function show_session(){

        $this->load->library('session');
        //取CI session中的数据
        $user=$this->session->userdata('user');
        var_dump($user);

        //下次刷新,就没有了
        $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>

最终user.php

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

你可能感兴趣的:(CodeIgniter,学习笔记)