CodeIgniter(CI)学习笔记整理

深入理解 MVC 设计模式
CI 的超级对象
数据库访问

AR 模式
如何扩展 CI 的控制器
模型

uri 的相关函数
设置路由
隐藏入口文件
分页
文件上传
session
验证码
表单验证

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.推荐使用
result() as $item): ?>
title ?>

超级对象
当前控制器对象
提供了很多属性:
$this-> load
装载器类的实例 system/core/loader.php
装载器类提供方法:
view 装载视图
vars() 分配变量到视图
datebase() 装载数据库操作对象
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-> uri-> segment(3) //值 1
echo $this-> uri-> 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->sever(‘DOCUMENT_ROOT’);//$_SERVER[‘DOCUMENT_ROOT’]

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

数据库访问
修改配置文件
application/config/database.php
将数据库访问对象,装载到超级对象的属性中 $this-> db
$this-> load-> database();
$rs->$ this-> db-> query($sql);//返回对象
$res-> result();//返回数组。数组是一个一个的对象
$rs-> result_array();//返回二维数组,里面是关联数组
$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(‘databae’);
不需要:$this-> load-> database();

自增 id
$this-> insert_id();
受影响行数
$this-> db-> affected_rows();
Active Record
1.application/config/database.php
$active_recors = TRUE;
2.application/config/autolaod.php
$sutoload[‘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-> db-> where(‘name’,’mary’)-> get(‘user’);
  $res-> db-> where(‘name !=’,’mary’)-> get(‘user’);
  $res-> db-> where(array(‘name’=>’mary’))-> get(‘user’);
  $res-> 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_modle
   在模型中,可以直接使用超级对象中的属性
   文件名,全小写
   类名字首字母大写
   建议使用_modle 作为后缀,防止和控制器类名冲突
  
  
   url 相关函数
   $this-> load-> helper(‘url’);
   //可以根据需要配置自动加载
   //application/config/autoload.php
   //$autoload[‘helper’]= array(‘url’);
   site_url(‘控制器/方法’)
   base_url()
  
路由

application/config/routes.php
//默认控制器
$router[‘default_controller’]=’welcome’;
//http://127.0.0.1/ci/index.php/news/20148/15.html
$route[‘news/[\d]{6}/([\d]+)\.html’]=’article/shoe/$ 1’;
隐藏入口文件
开启 apache 的 rewite 模块,在 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]     

分页
        $this-> load-> library(‘pagination’);//装载类文件
        $this-> load-> helper(‘url’); //加载 url 库
        $page_sise = 5;
        $config[‘base_url’] = base_url(‘user/showlist’); //文件路径
        $config[‘total_rows’] = $ this-> db-> count_all_results(‘yyx_posts’);
        ; //总共条数
        $config[‘per_page’] = $ page_sise; //每页显示条数
        $config[‘use_page_numbers’] = TRUE;
        $config[‘full_tag_open’] = ‘< p >’;
        $config[‘full_tag_close’] = ‘

‘;

        $this->pagination->initialize($ config);
        $offset = intval($ this-> uri-> segment(3));
        $re = $ this-> db-> get(‘yyx_posts’, $page_sise, $ offset);
        //var_dump($re);
        $data[‘showlist’] = $ re;
        $this->load->view(‘user/showlist’, $ data);
       
文件上传

1.手动创建好上传目录

具体看参考手册,很详细

session
   生成一个随机不重复的字符串作为加密用的 key  //   //echo md5(uniqid()); exit;
   //保存在 application/config/config.php

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
//$config\['encryption\_key'\]='';

public function login() {
$this-> load-> library('session');
$user = array('id' => 1, 'name' => 'admin');
$this->session->set\_userdata('user', $ user);
//一次性的数据,只能读取一次
$this-> session-> set\_flashdata('test', '123456789');
}

public function show\_session() {
//   echo md5(uniqid());
$this-> load-> library('session');
//取 ci session 中的数据
$u = $ this-> session-> userdata('user');
var\_dump($u);
$t = $ this-> session-> flashdata('test'); //只能区一次
echo $t;
}

   
验证码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
public function yzm() {  
$this-> load-> helper('url');
$this-> load-> helper('captcha');
$vals = array(
//  'word' => 'Random word',
'img\_path' => './captcha/',
'img\_url' => base\_url() . '/captcha/',
//       'font\_path' => './path/to/fonts/texb.ttf',
'img\_width' => '80',
'img\_height' => 25,
'expiration' => 7200
);

$cap = create\_captcha($ vals);
//echo $cap\['image'\];
$this->load->view('user/showyzm', array('cap' => $ cap\['image'\]));
session\_start();
$r = $\_SESSION\['cap'\] = $cap\['word'\];
echo $r;
}

   
表单验证

  

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
public function add\_user() {  
$this-> load-> helper('url');
$this-> load-> library('form\_validation');
$this-> form\_validation-> set\_rules('username', '用户名', 'required');
//$this-> form\_validation-> set\_rules('email', '邮箱', 'required');
$this-> form\_validation-> set\_rules('email', '邮箱', 'required|valid\_email|is\_unique\[users.email\]');
$bool = $ this-> form\_validation-> run();
if ($bool) {
echo 'OK';
} else {
// $this-> load-> view('formsuccess');
// echo 'OK';
$this-> load-> view('user/add\_user');
}
}

   
///////////////   

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
<!DOCTYPE HTML>  
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<title>表单测试</title>
</head>
<body>
<form method="post" action="<?php echo site\_url('user/add\_user') ?>" >
名字:<input type="text" name="username" value="<?php echo set\_value('username')?>"/>
<?php echo form\_error('username','<span>','</span>') ;?><br/>
邮箱:<input type="text" name="email" value="<?php echo set\_value('email')?>" />
<?php echo form\_error('email','<span>','</span>') ;?><br/>
<input type="submit" value="submit" />
</form>
</body>
</html>