CI(CodeIgniter)框架

CI是什么?

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

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

  简单易学,高效实用

官方网站

  www.codeigniter.com

中文网站

  http://codeigniter.org.cn

特点

  你想要一个小巧的框架

  你需要出色的性能

  你需要广泛兼容标准主机上的各种PHP版本和配置

    CI  2.1.4 需要  php5.1.6

  你想要一个几乎只需0配置的框架

  你想要一个不需使用命令行的框架

  你想要一个不许坚守限制性编码规则的框架

  你不希望被迫学习一门模板语言(虽然可以选你你喜欢的模板解析器)

  你不喜欢复杂,热爱简单

  你需要清晰完整的文档

目录结构说明

   license.txt  许可协议

  user_guide    用户手册

  system     框架核心文件

  application  应用目录

  index.php   入口文件

 

 

 

 

 

 

扩展loder

 

-----------------------------------------------

MVC

  1.入口文件

    唯一 一个让浏览器直接请求的脚本

  2.控制器

    协调模型和视图

  3.模型

    提供数据,保存数据

  4.视图

    只负责显示

    表单。。。

  5.动作action

    是控制器中方法,用于被浏览器直接请求

CI中的MVC

  访问url使用的是pathinfo(入口文件.php/控制器/动作)

  application目录中:

    controllers  控制器

    models    模型

    views    视图

  默认控制器是welcome,默认动作是welcome

控制器

  1.不需要加后缀,直接是类名+.php

  2.文件名全部小写,例如user.php

  3.所有的控制器,直接或间接继承CI_Controller类

  4.控制器中,对动作(方法)要求,否则将不能被浏览器请求

    不能以下划线开头,应该是public的

  5.与类名相同的方法,会被当做构造方法,相当于__construct(){}

视图

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

    //直接写视图名字,不屑扩展名,如果有子目录,则写上目录名

    $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/参数2    

echo $this->segment(3);//值1
echo $this->segment(4);//值2

//index.php/控制器/index/6
public function index($p){
     echo $p;//输出6      
}

     this->input  //输入类

      是CI_URI类的实例system/core/Input.php

      CI_URI类提供的方法:

        $this->input->post('username');  //$_post['username']

        $this->input->server('DOCUMENT_ROOT');  //$_SERVER['DOCUMENT_ROOT']

    在视图中,直接用$this来访问超级对象中的一些属性

数据库访问

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

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

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

   参数绑定

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

//表前缀
//目录 application/config/database.php
$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(AR)

  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('表名',关联数组,条件);//$this->db->update('user',$data,array('id'=>3));

$bool = $this->db->delete('表名',条件);//$this->db->delete('user',array('id'=>2));

//连贯操作
$res = $this->db->select('id,name')
->from('user')
->where('id >=',3)  //id后应该有空格
->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,'id >'=>2))->get('user');

//复杂的查询,可用$this->db->query($sql,$data);使用问号绑定参数

 扩展CI控制器

  application/core/MY_Controller.php  控制器就要 以继承自MY_Controller

  控制器前缀MY_修改:application/config/config.php  $config['subclass_prefix'] = 'MY_';

模型

  继承自CI_Model,在模型中可以直接使用超级对象中的属性

  文件名全小写;类名首字母大写,建议用_model作为后缀,防止和控制器类名冲突(如:User_model)

url相关函数

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

  set_url('控制器/方法')

  base_url();//网站的根目录

路由

//application/config/route.php
//
默认控制器 $route['default_controller'] = 'welcome';
//http://localhost/ci/index.php/news/201309/4.html
$route['news/[d]{6}/([d]+).html'] = 'article/show/$1';//$1表示第一个参数,括号里得参数

 隐藏入口文件

//1.开启apache的rewrite模块
LoadModule rewrite_module moudles/mod_rewrite.so
//2.重启apache
//3.在入口文件同级目录下,放入一个.htaccess文件,内容如下:
<IfModule mod_rewrite.c>
  RewriteEngine on
  RewriteCond %{REQUEST_FILENAME} !-f
  RewriteCond %{REQUEST_FILENAME} !-d
  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_segement'] = 3;//分页的数据查询偏移量在哪一段上

$this->pagination->initialize($config);

$offset = intval($this->url->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'] = '1000';
//生成新文件名
$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'];

 session

//写入
public function login(){
  //生成一个随机不重复的字符串作为加密用的key
  //保存到application/config/config.php
  //$config['encryption_key'] = 'adb8bf6dxxxxxxxxxxxxxx';
  echo md5(uniqid());exit;
  $this->load->library('session');
  $user = array('id'=>3,'name'=>'jack');
  //session_start();
  //$_SESSION['user'] = $user;//php写入session的方式
  $this->session->set_userdata('user',$user);
  //不在这里获取刚放入的数据
  //只有页面重新加载或跳转到别的url中,才能获取到
  
  //一次性的数据,只能获取一次
  $this->session->set_flashdate('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;
}

 验证码

public function test2(){
  $this->load->helper('url');
  $this->load->helper('captcha');
  $vals = array(
    ‘word’=>rand(1000,9999),//此项不写默认为字母
    'img_path' => './captcha',//此目录需要手动创建
    'img_url' => base_url().'/captcha',
    'img_weight' => 100,
    'img_height' => 30,
    'expiration' =>60*10 //过期时间,下次生成验证码时会把过期的验证码图片删除,60s*10min
  );
  $cap = create_captcha($vals);
  $this->load->view('user/test2',array('cap'=>$cap['image']));

  session_start();
  $_SESSION['cap'] = $cap['word'];//验证时直接对比这个字符串
}

 表单验证

public function insert(){
  //var_dump($this->input->post('name'));
  $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();
  //var_dump($bool);
  if($bool){
    //调用模型保存到数据库
  }else{
    //显示错误信息
    $this->load->view('user/add');
  }
}

html:
//输出所有的错误 <?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" />
<img src="<?php echo base_url(); ?>uploads/jh.jpg" alt="" width="100"> </form>
原文地址:https://www.cnblogs.com/qjykn/p/10813441.html