ThinkPHP框架基础3
连接数据库
把convertion.php数据库相关的设置复制到config.php
在config.php做数据库连接配置,设置好数据


- 制作model模型
a) model本身就是一个类文件
b) 数据库中的每个数据表都对应一个model模型文件
c) 最简单的数据model模型类


- $goods = new 命名空间GoodsModel();
- $goods = D(‘模型标志’);
a) $goods = D(“Goods”);
b) 该$goods是父类Model的对象,但是操作的数据表还是sw_goods
c) $obj = D(); 实例化Model对象,没有具体操作数据表,与M()方法效果一致
- $obj = M();
a) 实例化父类Model
b) 可以直接调用父类Model里边的属性,获得数据库相关操作
c) 自定义model就是一个空壳,没有必要实例化自定义model
d) $obj = M(‘数据表标志’); 实例化Model对象,实际操作具体的数据表
$obj = D(标志);
$obj = D();
$obj = M(标志);
$obj = M();
D()和M()方法的区别:
前者是tp3.1.3里边对new操作的简化方法;
后者在使用就是实例化Model父类
两者都在函数库文件定义ThinkPHP/Common/functions.php
MainController.class.php:
function ShowAll()
{
//Model:数据库中每张表对应一个模型
//表名对应类名,类里面的成员变量是列名
//把一张表对应为另一个类,其中一条数据对应一个对象 //如果我们对该表的模型没有特殊操作的话,可以不用建立该模型
//第一种方法:实例化Model类
$info = new \Home\Model\InfoModel();
var_dump($info);
//第二种方法:
$info = D("info");
var_dump($info);
//第三种方法:
$car = M("Car");
var_dump($car);
【数据查询】
select()是数据模型的一个指定方法,可以获得数据表的数据信息
返回一个二维数组信息,当前数据表的全部数据信息
$obj = D(); 创建对象
$obj -> select(); 查询数据
select 字段,字段 from 表名 where 条件 group 字段 having 条件 order 排序 limit 限制条数;
$obj ->field(字段,字段); 查询指定字段
$obj ->table(数据表); 设置具体操作数据表
$obj ->where(参数); 参数就是正常sql语句where后边的条件信息
例如:( “goods_price >100 and goods_name like ‘三%’”)
$obj ->group(字段); 根据字段进行分组查询
$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语句。
//var_dump($car->select());
//通过where方法
$attr = $car->where("brand='b002'")->select();//select返回的不是对象是数组,不能再接 $attr = $car->table("Nation")->select(); $attr = $car->field("Code,Name")->select(); $attr = $car->order('Oil desc')->select();//排序 $attr = $car->limit(2,2)->select();//分页查询,如果一个参数,取前N个 $attr = $car->page('3,2')->select();//取第N页的几条数据 $attr = $car->field("brand,count(*)")->group("Brand")->select();//分组查询 $attr = $car->join("Brand on Car.Brand = Brand.Brand_Code")->select(); //连接查询 $attr = $car->distinct(true)->field('Brand')->select();//去重 $attr = $car->find('c001');//find方法,只能根据主键值查,返回一维数组,取一条数据
$attr = $car->select('c001,c002');//返回二维数组,取多条数据
}
注意:如果没有对应的model模型文件类,也可以直接实例化model对象进行操作
D()和M()方法都可以实例化操作一个没有具体model模型类文件的数据表。
【数据添加】
add()该方法返回被添加的新记录的主键id值
两种方式实现数据添加
- 数组方式数据添加
$goods = D(“Goods”);
$arr = array(‘goods_name’=>’iphone5s’,’goods_weight’=>’109’);
//注意:goods_name和goods_weight是数据表中字段名称
$goods -> add($arr);
- AR方式实现数据添加
a) ActiveRecord 活跃记录
b) AR规定了程序与数据库之间的关系
c) 什么是AR:
d) ①一个数据表对应一个类model
e) ②一条数据记录对应类的一个对象
f) ③每个字段对应该对象的具体属性
g) tp框架的AR是假的
$goods = D(“Goods”);
$goods -> goods_name = “htc_one”;
$goods -> goods_price = 3000;
$goods -> add();
以上两种方式:数组、AR,最后add都要把新记录的主键id值返回
【收集表单数据入库操作】
- 制作一个表单
- 通过$_POST收集信息
- 通过create()方法实现数据收集,该方法对于非法的字段会自动进行过滤
注意:一个add控制器实现两个逻辑,一个是打出添加页面,一个是向数据库添加内容
注意:如果是主键值重复,这种错误会导致error()方法不跳转页面直接抛出错误信息,这是新版本问题,如果想要跳转,找到


【数据修改操作】
save() 实现数据修改,返回受影响的记录条数
具体有两种方式实现数据修改,与添加类似(数组、AR方式)
- 数组方式
a) $goods = D(“Goods”);
b) $ar = array(‘goods_id’=>100,‘goods_name’=>’lenovo手机’,’goods_price’=>1200);
c) $goods ->where(‘goods_id>50’)-> save($ar);
- AR方式
a) $goods = D(“Goods”);
b) $goods -> goods_id = 53;
c) $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:执行失败

数据修改具体实现:
通过路由给一个操作方法传递参数
http://网址/index.php/模块/控制器/方法upd/变量名1/值/变量名2/值/变量名3/值
以上路由是通过get形式给指定的操作传递了三个参数信息
$_POST方式也可以
原则三个参数信息接收的时候通过$_GET接收即可
例如:$_GET[‘变量名1’];
以上参数信息接收太直白,不安全,需要按照框架规则使用下边的方式接收get参数信息
http://网址/index.php/Admin/Goods/upd/name/tom/age/25/addr/beijing
function upd($name,$age,$addr){
$name;
$age;
$addr;
}
以上参数表述,如果在请求的时候没有按照规则传递参数,那么当前方法禁止访问。
(除非参数有默认值)
修改商品信息步骤:
- 在“修改”按钮处把被修改商品id信息通过get形式传递给upd操作
- 在upd方法里边制作形式参数$goods_id,接收服务器给传递的get变量goods_id
- 在修改表单里边制作隐藏域goods_id,避免tp框架禁止修改语句执行
- 在upd操作方法内部有两个逻辑:展现表单、收集表单


【数据删除及执行原生sql语句】
delete()返回受影响的记录条数
$goods -> delete(30); 删除主键值等于30的记录信息
$goods -> delete(“10,12,13”); 删除主键值等于10 12 13的三条记录
$goods -> where(“goods_id>60”)->delete() 把符合条件的记录都给删除

执行原生sql语句
- 查询语句query() 返回一个二维数组信息
- 添加、修改、删除 execute() 返回受影响的记录条数
$goods = D(“Goods”);
$sql = “select * from sw_goods”;
$rst = $goods ->query($sql);
$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 = “update sw_goods set goods_name = ‘htc_two’ where goods_id=100”;
$goods ->execute($sql);
ThinkPHP框架基础3的更多相关文章
- ThinkPHP框架基础
ThinkPHP 一.php框架基础介绍 真实项目开发步骤: 多人同时开发项目,协作开发项目.分工合理.效率有提高(代码风格不一样.分工不好) 测试阶段 上线运行 对项目进行维护.修改.升级(单个人维 ...
- 6月13 ThinkPHP框架基础
ThinkPHP 一.php框架基础介绍 真实项目开发步骤: 多人同时开发项目,协作开发项目.分工合理.效率有提高(代码风格不一样.分工不好) 测试阶段 上线运行 对项目进行维护.修改.升级(单个人维 ...
- ThinkPHP框架基础知识一
ThinkPHP是一个快速.兼容而且简单的轻量级国产PHP开发框架,诞生于2006年初,原名FCS,2007年元旦正式更名为ThinkPHP,遵循Apache2开源协议发布,从Struts结构移植过来 ...
- ThinkPHP框架基础知识二
一.空操作和空控制器处理 空操作:没有指定的操作方法:空控制器:没有指定控制器,例如: http://网址/index.php/Home/Main/login 正常 http://网址/index. ...
- Thinkphp 框架基础
ThinkPHP 一.php框架介绍 真实项目开发步骤: 多人同时开发项目,协作开发项目.分工合理.效率有提高(代码风格不一样.分工不好) 测试阶段 上线运行 对项目进行维护.修改.升级(单个人维护项 ...
- ThinkPHP框架基础知识三
一.JS文件与Css文件存放位置 其实JS与Css文件放在任意位置都可以找到,只要路径正确就行. 在TP框架中我们访问的所有文件都要走入口文件index.php,相当于访问的是index.php页面. ...
- ThinkPHP框架 基础 链接数据库
在第一次成功访问应用入口文件的时候,会显示出一个系统默认的欢迎页面并自动在APPLication文件夹里生成三个文件夹,如下,第一次访问应用文件路径:localhost/tr/index.php ...
- ThinkPHP框架的一些基础应用
这是俺滴师傅给俺传授了的知识,特在此分享. TP框架,做PHP开发的都应该有所耳闻.下面,我们就来说说入口文件的生成: 创建新项目时,首先,在目录文件下创建一个新的文件夹.然后将Thinkphp框架文 ...
- ThinkPHP讲解(一)框架基础
ThinkPHP框架知识点过于杂乱,接下来将以问题的形势讲解tp(ThinkPHP的简写) 1.tp框架是什么,为什么使用是它? 一堆代码的集合,里边有变量.函数.类.常量,里边也有许多设计模式MVC ...
随机推荐
- SSH初体验系列--Hibernate--1--环境配置及demo
最近在学hibernate,常见的教程都是搭配mysql,因为公司本地电脑用的是pg,所以就尝试着做个pg的小demo. 自己也是边学边写,只当是加深印象.话不多说,直接开始; 一) 准备工作; 1) ...
- ASP.NET中常用的26个优化性能方法
1. 数据库访问性能优化 数据库的连接和关闭 访问数据库资源需要创建连接.打开连接和关闭连接几个操作.这些过程需要多 次与数据库交换信息以通过身份验证,比较耗费服务器资源.ASP.NET 中提供了 连 ...
- C++ 类的多态四(虚析构函数的重要性)
//虚析构函数的重要性 #include<iostream> using namespace std; /* 虚析构函数 主要用在多态中,用来释放子类对象内存空间,如果不使用虚析构函数, ...
- 我的第十个java程序--(其实是修改别人的web代码{springmvc+mybatis},知道了原理后其实一切都变的很简单)
先是效果图,提高学习的兴趣 springmvc+mybatis+easyui 这几个东西让我一点一点的啃,刚开始的时候真的跑不起几个程序 1.下载tomcat 2.导入程序 3.项目报错,但不指出具体 ...
- AWT从概念产生到完成实现只用了一个月
这种糟糕的设计选择使得那些拥护Java“一次编写,到处运行 (write once, run anywhere)”信条的程序员们过得并不舒畅,因为AWT并不能保证他们的应用在各种平台上表现得有多相似. ...
- Android中TextView和EditView经常使用属性设置
Android开发中最经常使用的几乎相同就是TextView和EditView了,在使用它时.我们也会设置它的一些属性,为了让我们设计的更好看,设置的更合理.这里记下它的经常使用属性,方便后期查阅. ...
- [转]NBehave行为驱动测试关于story和scenarios
原文: Behavior-Driven Development with NBehave 这里模拟了一个"银行账户"的类 一个余额属性,一个存款方法,一个撤销账户的方法,一个转账的 ...
- 化学绘图软件ChemDraw真的什么都能干!
今天要介绍的就是一款无所不能的化学绘图软件——ChemDraw,绘制平面化学结构.生成立体化学模型.查询化学信息.编写化学脚本.计算化学数据等等,堪称化学界的必备神器. 化学软件ChemDraw免费获 ...
- map实现
/*PLSQL实现Map*/ --建立序列create sequence seq_map_param_id ;--建立参数表create table map_param(id number prima ...
- js 跳转的几种方法收藏
history.go(-n) 返回上一页(n 为返回前几页) window.location.reload(); 刷新当前页面 history.go(-1);window.locatoin.reloa ...