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
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。