qjykn

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>

 

分类:

技术点:

相关文章: