CI 框架简单入门笔记

1.mvc一般思路

C层: 入口文件-URL获取控制器$_GET['c']和方法$_GET['a']--包含c的文件类(控制器文件)- 实例化c控制器对象-调用方法a(并协调模型和视图),C层不直接调用DB,下面会有提到。

V层: 在C层中include views下对应的文件即可展现C中变量,require ./views/xxView.html

M层:通过连接DB获取所有的数据,return 给C层,这时候需要在C层require ./models/xxModel.php,最后在C中通过view 让数据显示出来。注意M只提供数据,做数据复用

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

目录结构

index.php

Model

UserModel.class.php

View

index.html

Controller

UserController.class.php

2.CI中的pathinfo访问模式

入口文件/控制器/方法

其中action中为protected functon 和private 不能被浏览器请求,注意Controller文件名需要小写。方法中action (public functions)不能用_开始。

方法名不区分大小写。

CI中都extends CI_CONTROLLER,注意前缀都为CI

注意不要建立Index控制器的index方法,类名相同的会当作构造方法。因为CI的控制器没有后缀,所以类名会和方法名一样,导致构造函数加载。

3.CI中的视图

视图文件可以用下划线区分,例如user_区分,但一般都建立单独的文件夹,可以直接load视图,不用写扩展名。

$this->load->view('user/index');
$this->load->view('user_index');

注意视图中可以直接写php源码。

CI中如果没用smarty ,如果需要加载变量可以用

$this->load->var('title','this is title');

如果是二维数组,

$data[]=1;
$data[]=2;
$this->load->var($data);

可以多次load view,以加载不同的view公共部分。

推荐使用

<?php foreach ($list as $item):?>
<?=$item['id']?>
<?=$item['name']?>
<?php endforeach;?>

4.CI的超级对象-LOAD

$this->load ===

$obj=new CI_LOADER();
$this->load=$obj;
$this->load->view();

注意但ci并不是做的自动加载,并不是以上面那种方式运行的。当时有面试官还问过,我以为所有的框架都是spl_autoload_register,真是汗颜..

load的属性有view var database model helper

5.CI的超级对象-CI_URI类

分段获取
segment 从入口文件.php后,分断获取
$this->uri->segment(4)是按照index.php/后面开始的第一个段开始。

之前的:入口文件.php/控制器/动作/参数1/值1/参数2/值2
CI中: 入口文件.php/控制器/动作/值1/值2

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

可以在方法的参数中传递参数,ci会按照顺序获取值

index.php/控制器/index/6/12

public function index($p=0,$age){
    echo $p,$age;//6,12
}

6.CI的超级对象 input对象

CI_INPUT类

$this->input->post('username');

注意get的参数 用uri分段获取..

$this->input->server('DOCUMENT_ROOT')

视图里也可以通过$this访问超级对象,因为就是include进来的

7.CI中的数据库操作

数据库访问SQL

先配置config/database.php

装载数据库操作类,可以加载多个数据库

$this->load->databases();
//var_dump($this->db);
$res=$this->db->query("select * from user");// return object
$user_list=$res->result();
//注意返回的返回数组下的某(多)个对象,对应mysql_fetch_object

$data['user_list']=$user_list
$this->load->view('user/list/',$data)//view 层用 user_list展现

$res->result_array();返回关联数组
$res->row();返回第一条数据,也是个对象
$res->row_array();返回第一条数据,数组

更多官方参考

插入数据

$this->load->database();//可以在auto中自动加载db类

$sql="insert into user ('name','pwd') values('tom','md5(123)')";

$this->db->query();//MYSQL_QUERY() [return RES or BOOL]

MYSQL_AFFECT_ROWS 对应CI中的$this->db->affect_rows();
MYSQL_INSERT_ID 对应CI 中的 $this->db->insert_id();

用此db处理方法,第一需要自己写表前缀,第二需要自己处理安全措施。

表前缀可以借助配置文件读取 常量,CI中有**SWAP_PRE**,交换的前缀来处理表前缀。万一数据库表前缀修改,只需要修改DBPREFIX就行了。

安全措施可以借助 $this->input->post('name');

$data[0]='tom';
$data[1]='123';

参数绑定插入

$sql="insert into user ('name','pwd') values('?','?')";

将data拼装为数组,作为$this->db->query($sql,$data);

参数绑定查询

$sql="select * from user where username=?";
$this->query($sql,$username);

8.CI中的AR模型

是CI中访问数据库的第二种方式,第一种就是上面的load->database();增删改差 都是query。需要写大量sql语句

配置文件autoload 自动加载database

$auto_load['librarys']=array('database');

CI_DB_ATCIVE_record extends ci_db_driver

config/database中的active_record需要打开,这样才会继承ACTIVE

$res=$this->db->get('user');//user 表名,会自动加表前缀

var_dump($res->result);

插入:

$data=['name'=>'tom','pwd'=>'md5(123)'];
$this->db->insert('user',$data);//表名+关联数组=》return bool

修改:

$data=['email'=>tom@126.com,'pwd'=>'md5(1234)'];
$this->db->update('user',$data,array('id'=>3));// 表名,数据,where 条件。=?return bool

删除

$this->db->delete('user',array(id=>3));

AR中连贯操作

$this->db
    ->select('id,name')//字段名
        ->where ('id  '>=3)//需要有空格
        ->limit(3,2)//跳过2条,取三条
        ->order_by('id desc');
        ->get();

调试sql语句输出最后一条sql ,可以结合log函数输出到指定日志文件

$this->db->last_query();

$res=$this->db->where('name','tom')->get('USER');//SELECT * FROM USER WHERE NAME=TOM;

具体可点击这里查看更多连贯操作

如果太复杂的,那就写SQL吧,记得用?绑定参数,过滤接受参数等

自增id

$this->db->insert_id();

受影响行

$this->db->affect_rows();

9.对CI控制器扩展

APPLICATION和SYSTEM文件夹中相同的部分 ,只需要在application中对应的Core中写MY_扩展。
比如在application/core/MY_Controller.php

class MY_Controller extends CI_Controller{
    
        public function __construct(){
            parent::construct();
            //登录验证

        }
}

可以修改类前缀 在
config/config.php/$config['subclass_prefix']中,默认为MY_

10.CI中的模型Model

一些注意事项:文件需要全小写,但是类名要大写,并且需要用User_model,为了和控制器保持区分不冲突。

在模型MODEL中可以用所有超级对象的属性,可以具体查看system/core/CI_MODEL.php 文件

不要在控制器直接调用$this->db->get()文章头提到【虽然可以实现相同功能,但是很不规范】应该放在model中,控制器中只允许从user_model中load

user controoler中代码:在控制器中加载模型

$this->load->model('user_model');//第二个参数为别名,可选

 $list=$this->user_model->getall();
 $this->load->view('user/index',array('list'=>$list));

user_model代码:

 class user_model extends ci_model{
    public function getall(){
        $res=$this->db->get('user');
                return $res->result();
    }
}

11.url相关函数

需要手动加载:

$this->load->helper('url');

解决不同环境,不同路径的问题
site_url
base_url
类似与wordpress那些东西

可以自动加载

 $autoload['helper']=array('url')

12.路由配置

默认控制器 default_controller

通过路由规则,实现url与实际控制器相分离.实现url的高度定制

http://site.com/index.php/news/20170108/4.html
$route['news/[\d]{6}/([\d]+\.html)']='article/show/$1'

另外结合apache/nginx的rewrite 隐藏index.php

13.分页

$this->laod->library('pagination');

注意load url,然后用site_url,放入page的初始化函数中,用segment获取对应的intval(段),作为offset

CI中更多细节请点这里

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值