您的位置:首页 > 编程语言 > PHP开发

Thinkphp笔记3 模型

2016-04-12 21:37 495 查看
创建应用项目

a) 入口文件index.php

b) 应用常量定义define(“CSS_URL”,XXX);

c) define(“APP_DEBUG”,true); 调整模式为开发调试模式 加载25文件

d) 包含核心程序ThinkPHP/ThinkPHP.php

控制器和视图创建

a) UserController.class.php(命名空间)

b) Home/View/User/login.html

c) Home/View/User_login.html (在配置文件convertion.php里边有定义控制器和模板中间的连接符)

d) Home/View/User_register.html

路由解析

a) index.php?m=XX&c=YY&a=ZZ 基本get模式

b) index.php/XX/YY/ZZ pathinfo路径模式

c) 网址/XX/YY/ZZ rewrite重写模式,index.php被省略

d) index.php?s=/XX/YY/ZZ 兼容模式

e) echo U(“控制器/操作方法”); 查看具体url路由解析模式

配置文件(核心、公共、分组模块)及函数库文件

a) 核心:ThinkPHP/Conf/convertion.php

b) 公共:shop/Common/Conf/config.php

c) 分组模块:shop/Home/Conf/config.php

d) 上边三个配置文件后边的配置变量会覆盖前边的配置变量

e) 函数库文件:

f) 核心:ThinkPHP/Common/functions.php

g) 公共:shop/Common/Common/function.php

h) 分组模块:shop/Home/Common/function.php

模板与tp框架整合

a) 拷贝模板代码到tp框架view目录

b) 拷贝css、img、js静态资源到tp指定目录(shop/public)

c) 在入口文件处把css、img、js路径定义为常量

d) 在模板中通过常量把静态资源引入{$Think.const.常量名}

e) 调整css文件里边的图片路径

f) 常量使用注意:在入口文件是先定义常量,再引入核心文件ThinkPHP.php

空操作和空控制器处理

a) 空操作:在控制器中定义方法function _empty(m,m, arg)

b) 空控制器:定义控制器EmptyController.class.php _empty()方法

项目分组

a) Home Admin分组

跨控制器调用

a) A(“[分组模块/]控制器标志”) 实例化控制器

b) R(“[分组模块/]控制器标志/操作方法”) 实例化控制器同时直接调用指定方法

c) new UserController(); 直接实例化指定的控制器

后台“品”字形页面搭建

a) head left right

b) index (frameset)

c) frame 里边 src= 通过独立路由进行请求

数据模型model应用

mysql数据库操作(增、删、改、查)

【连接数据库配置】

convertion.php

config.php

1. 在config.php做数据库连接配置

2.

制作model模型

a) model本身就是一个类文件

b) 数据库中的每个数据表都对应一个model模型文件

c) 最简单的数据model模型类

字段缓存设置

tp框架执行过程中会使用到数据表中的字段信息,通过sql语句可以查询”show colums from table” ,处于性能考虑,可以把字段缓存,避免每次重复执行sql语句。

可以根据情况对当前的model模型进行个性化设置

在入口文件定义一个调试输出函数,便于系统开发使用

【实例化model的三种方式】

1. goods=new命名空间GoodsModel();2.goods = new 命名空间GoodsModel();
2. goods = D(‘模型标志’);

a) goods=D(“Goods”);b)该goods = D(“Goods”);
b) 该goods是父类Model的对象,但是操作的数据表还是sw_goods

c) obj=D();实例化Model对象,没有具体操作数据表,与M()方法效果一致3.obj = D(); 实例化Model对象,没有具体操作数据表,与M()方法效果一致
3. obj = M();

a) 实例化父类Model

b) 可以直接调用父类Model里边的属性,获得数据库相关操作

c) 自定义model就是一个空壳,没有必要实例化自定义model

d) obj=M(‘数据表标志′);实例化Model对象,实际操作具体的数据表obj = M(‘数据表标志’); 实例化Model对象,实际操作具体的数据表
obj = D(标志);

obj=D();obj = D();
obj = M(标志);

$obj = M();

D()和M()方法的区别:

前者是tp3.1.3里边对new操作的简化方法;

后者在使用就是实例化Model父类

两者都在函数库文件定义ThinkPHP/Common/functions.php

注意:如果没有对应的model模型文件类,也可以直接实例化model对象进行操作

D()和M()方法都可以实例化操作一个没有具体model模型类文件的数据表。

【数据查询】

select()是数据模型的一个指定方法,可以获得数据表的数据信息

返回一个二维数组信息,当前数据表的全部数据信息

1. 配置smarty

a) 配置变量信息

i. convertion.php

ii. Behavior行为配置变量信息(页面底部日志显示配置、smarty配置)

iii. 系统程序里边有一些零散的配置信息

b) 在config.php里边配置smarty使用设置

模板引擎配置参数位置(不能直接修改,在config.php里边重写):

具体使用(从tp引擎变为smarty引擎)

a) css样式如果有{},需要使用{literal}标签禁止smarty解析

b) 关键字Think变为Think 变为 smarty

c) tp引擎会对关键常量进行替换例如:CONTROLLER MODULE

smarty引擎不给替换,需要设置为:{$smarty.const.CONTROLLER}

【各种查询条件设置】

obj=D();创建对象obj = D(); 创建对象
obj -> select(); 查询数据

select 字段,字段 from 表名 where 条件 group 字段 having 条件 order 排序 limit 限制条数;

SELECT%DISTINCT%%FIELD%FROM %TABLE%%JOIN%%WHERE%%GROUP%%HAVING%%ORDER%%LIMIT% %UNION%%COMMENT%

obj−>field(字段,字段);查询指定字段obj -> field(字段,字段); 查询指定字段
obj -> table(数据表); 设置具体操作数据表

obj−>where(参数);参数就是正常sql语句where后边的条件信息例如:(“goodsprice>100andgoodsnamelike‘三obj -> where(参数); 参数就是正常sql语句where后边的条件信息
例如:( “goods_price >100 and goods_name like ‘三%’”)
obj -> group(字段); 根据字段进行分组查询

obj−>having(参数条件);having条件设置obj -> having(参数条件); having 条件设置
obj -> order(‘price desc/asc’) 排序查询

$obj -> limit([偏移量,]条数) 限制查询的条数

sql语句里边具体的条件设置在tp框架model模型里边体现为具体的方法操作

以上方法理论上是父类Model的对应方法

父类model具体存在方法: field() where() limit()

还有一些方法在__call()自动调用函数里边: table() group() order() having()

在__call()魔术方法里边会判断当前的执行方法是否是一个method属性的元素信息,如果存在就会执行执行

以上多个方法是同时使用多个进行条件显示(并且没有顺序要求)

$obj -> limit(5)->field(‘id,name’)->order(‘price asc’) -> table(‘sw_goods’)->select();

以上许多方法执行没有顺序要求,许多方法执行后都是把具体的参数赋予到model属性options里边,最后根据options拼装sql语句。

select()方法原理追踪

总结:

1. config.php做数据库连接配置convertion.php

2. 制作model模型文件

3. 实例化model模型对象

a) new 命名空间\类名

b) D([模型标志]);

c) M([模型标志]);

4. 数据查询select()

5. 各种查询条件设置方法

6. smarty模板引擎切换(Behavior行为里边的配置变量)

【查询数据信息】

info=info = goods -> where()->field(字段)->select();

select()方法

1. 返回一个二维数组信息

2. 返回全部数据表信息

3. 给该方法传递参数

a) select(30) 查询主键值等于30的记录信息

b) select(“10,12,14”) 查询主键值在10、12、14范围的记录信息

4. find()如果我们查询的结果只有一个信息,使用select()会返回一个二维数组

为了使用方便我们会希望返回一个一维数组,这时候可使用find()方法

having()方法设置查询条件,where()设置查询条件

having 和 where区别

① 使用有先后顺序

② where price>100 having price>100

③ where 设置条件,字段必须是数据表中存在的字段

④ having 设置条件,字段必须是select语句查询出来的字段可以使用

相关聚合函数 count() sum() avg() max() min()

以上聚合函数是最后被调用的方法

以上方法可以结合具体条件方法使用

例如:$goods -> where(‘goods_price >1000’)->count(); 大于1000元的商品的总数目

【实现数据添加add】

select()

add() 该方法返回被添加的新记录的主键id值

save()

delete()

两种方式实现数据添加

1. 数组方式数据添加

goods=D(“Goods”);goods = D(“Goods”);
arr = array(‘goods_name’=>’iphone5s’,’goods_weight’=>’109’);

//注意:goods_name和goods_weight是数据表中字段名称

goods−>add(goods -> add(arr);

AR方式实现数据添加

a) ActiveRecord 活跃记录

b) AR规定了程序与数据库之间的关系

c) 什么是AR:

d) ① 一个数据表对应一个类model

e) ② 一条数据记录对应类的一个对象

f) ③ 每个字段对应该对象的具体属性

g) tp框架的AR是假的

goods=D(“Goods”);goods = D(“Goods”);
goods -> goods_name = “htc_one”;

goods−>goodsprice=3000;goods -> goods_price = 3000;
goods -> add();

以上两种方式:数组、AR,最后add都要把新记录的主键id值返回

【收集表单数据入库操作】

1. 制作一个表单

2. 通过$_POST收集信息

3. 通过create()方法实现数据收集,该方法对于非法的字段会自动进行过滤

在create()收集表单方法内部会自动过滤非法的字段信息

【数据修改操作】

select()

add()

save() 实现数据修改,返回受影响的记录条数

delete()

具体有两种方式实现数据修改,与添加类似(数组、AR方式)

1. 数组方式

a) goods=D(“Goods”);b)goods = D(“Goods”);
b) ar = array(‘goods_id’=>100,‘goods_name’=>’lenovo手机’,’goods_price’=>1200);

c) goods−>where(‘goodsid>50′)−>save(goods ->where(‘goods_id>50’)-> save(ar);

2. AR方式

a) goods=D(“Goods”);b)goods = D(“Goods”);
b) goods -> goods_id = 53;

c) goods−>goodsname=“三星手机”;d)goods -> goods_name = “三星手机”;
d) goods -> goods_price = 2000;

e) $goods -> where(‘goods_price>10000’)->save();

以上两种方式如果可行,即要修改全部数据

以上sql语句从技术上可行,从业务上不可行(事故)

tp框架有智能考虑,以上情况的sql语句不被允许执行。

如何执行:

① 明确告诉系统那条sql语句被update更新

② 可以设置where进行sql语句更新操作

save() 返回方法值

0:之前没有问题,执行前后数据没有变化

自然数:受影响的记录条数

false:执行失败

【数据删除及执行原生sql语句】

select()

add()

save()

delete() 返回受影响的记录条数

goods−>delete(30);删除主键值等于30的记录信息goods -> delete(30); 删除主键值等于30的记录信息
goods -> delete(“10,12,13”); 删除主键值等于10 12 13的三条记录

$goods -> where(“goods_id>60”)->delete() 把符合条件的记录都给删除

执行原生sql语句

1. 查询语句query() 返回一个二维数组信息

2. 添加、修改、删除 execute() 返回受影响的记录条数

goods=D(“Goods”);goods = D(“Goods”);
sql = “select * from sw_goods”;

rst=rst = goods -> query($sql);

sql=“selectgoodscategoryid,avg(goodsprice)fromswgoodsgroupbygoodscategoryidhavingavg(goodsprice)>1000”;sql = “select goods_category_id,avg(goods_price) from sw_goods group by goods_category_id having avg(goods_price)>1000”;
goods -> query($sql);

sql=“updateswgoodssetgoodsname=‘htctwo′wheregoodsid=100”;sql = “update sw_goods set goods_name = ‘htc_two’ where goods_id=100”;
goods -> execute($sql);

【数据修改具体实现】

通过路由给一个操作方法传递参数
http://网址/index.php/模块/控制器/方法upd/变量名1/值/变量名2/值/变量名3/值
以上路由是通过get形式给指定的操作传递了三个参数信息

原则三个参数信息接收的时候通过GET接收即可例如:_GET接收即可
例如:_GET[‘变量名1’]; include()

以上参数信息接收太直白,不安全,需要按照框架规则使用下边的方式接收get参数信息
http://网址/index.php/Admin/Goods/upd/name/tom/age/25/addr/beijing
function upd(name,name,age,addr){addr){
name;

age;age;
addr;

}

以上参数表述,如果在请求的时候没有按照规则传递参数,那么当前方法禁止访问。

(除非参数有默认值)

修改商品信息步骤:

1. 在“修改”按钮处把被修改商品id信息通过get形式传递给upd操作

2. 在upd方法里边制作形式参数$goods_id,接收服务器给传递的get变量goods_id

3. 在修改表单里边制作隐藏域goods_id,避免tp框架禁止修改语句执行

4. 在upd操作方法内部有两个逻辑:展现表单、收集表单

【表单验证】

javascript

jquery

在服务器端通过tp框架实现表单验证

用户名、密码、重复密码、邮箱、qq、手机号码、爱好、学历

具体步骤:

1. 制作表单

2. 表单form数据通过create()方法收集(验证功能要求我们必须通过create()方法收集数据)

3. 自定义数据model模型类实现具体验证规则

验证规则的第4个参数说明(0 1 2):

注意:

1. 模型实例化通过new

2. 调用create()方法才可以触发验证执行

总结:

1. 数据添加add() 两种方式:数组、AR

2. 数据修改

a) 注意:需要设置条件(主键id、where)

3. 删除删除 delete()

4. 执行原生sql语句:query() execute()

5. 给操作方法传递参数 /Admin/User/login/id/100/name/tom

a) function login(id,id,name)

6. 表单验证

作业:

1. 在商城后台实现数据的列表查询、删除、添加、修改
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: