Thinkphp 连接数据库、查询、添加
一、连接数据库配置及Model数据模型层
1. Thinkphp\conf\convertion.php中找到数据库设置部分,复制到自己的配置文件中,并添加好有关数据库的内容
JiaoWu\Home\conf\config.php:
2. 制作model模型
a) model本身就是一个类文件
b) 数据库中的每个数据表都对应一个model模型文件
c) 最简单的数据model模型类
在Home\Model文件夹中新建一个模型文件:InfoModel.class.php
- <?php
- namespace Home\Model;
- use Think\Model;
- class InfoModel extends Model
- {
- }
3. 实例化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()方法的区别:
1. 前者是tp3.1.3里边对new操作的简化方法;
2. 后者在使用就是实例化Model父类
3. 两者都在函数库文件定义ThinkPHP/Common/functions.php
注意:如果没有对应的model模型文件类,也可以直接实例化model对象进行操作
D()和M()方法都可以实例化操作一个没有具体model模型类文件的数据表。
- function ShowAll()
- {
- //Model:数据库中每张表对应一个模型
- //类名是表名,类里面的成员变量是列名
- //把一张表对应为一个类,其中一条数据对应一个对象
- //如果我们对该表的模型没有特殊操作的话可以不用建立该模型
- //1.实例化model类
- $info=new \Home\Model\InfoModel();
- //var_dump($info);
- //2.使用D()方法
- $info = D("Info");
- //var_dump($info);
- //3.使用M()方法
- $car=M("Car");
- //var_dump($car);
- }
二、数据查询
select()是数据模型的一个指定方法,可以获得数据表的数据信息
返回一个二维数组信息,当前数据表的全部数据信息
$obj = D(); 创建对象
查询常使用的方法:
$obj -> select(); 查询数据,使用select()会返回一个二维数组
$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([偏移量,]条数) 限制查询的条数
$obj -> page() 分页类Page可以自动计算出每个分页的limit参数
例如:$obj->page("1,10")->select(); // 查询第一页数据
$obj->page("2,10")->select(); // 查询第二页数据
$obj ->find():如果我们查询的结果只有一个信息,为了使用方便我们会希望返回一个一维数组,这时候可使用find()方法
相关聚合函数: count() sum() avg() max() min()
以上聚合函数是最后被调用的方法
以上方法可以结合具体条件方法使用
例如:$goods -> where(‘goods_price >1000’)->count(); 大于1000元的商品的总数目
- //汽车表Car
- $car=M("Car");
- var_dump($info->select());//返回所有数据的二维数组 //使用TP框架时,建表是表名和列名最好都用小写
- $attr=$car->where("brand='b002'")->select();//where方法可以添加查询条件
- $attr=$car->table("Nation")->select();//table方法可以切换操作表
- $attr=$car->field("name,code")->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();//distinct(true)去重
- $attr=$car->find("c001");//查一条数据,只根据主键值查,返回一维数组,不写主键值默认返回第一条
- $attr=$car->select();//根据主键值查多条数据,返回二位数组,
- $attr=$car->where("name like '%奥迪%'")->order("powers desc")->select();
- //var_dump($attr);
- //聚合函数:可以放在最后
- $attr=$car->count();
- $attr = $car->avg("Price");
- echo $attr;
自己拿Info表做的练习:
- //info表
- $info=M("Info");
- var_dump($info);
- $attr=$info->select();
- $attr=$info->where("nation='n001'")->select();
- $attr=$info->table("Nation")->select();
- $attr=$info->field("sex,birthday")->select();
- $attr=$info->order("birthday")->select();
- $attr=$info->field("nation,count(*)")->group("nation")->select();
- $attr=$info->limit(1,2)->select();
- $attr=$info->page(2,3)->select();
- $attr=$info->join("nation on Info.Nation=Nation.Code")->select();
- $attr=$info->distinct(true)->field("birthday")->select();
- $attr=$info->find("p010");
- $attr=$info->select("p010,p120");
- var_dump($attr);
如何在页面显示查询出的表格内容:
1. 在MainController.class.php控制器中写一个方法,实例化model,查询info表内容,然后注册到前端
- function ShowAll()
- {
- $info=M("Info");
- $attr=$info->select();
- $this->assign("shuju",$attr);
- $this->display();
- }
2.在View\Main中新建:ShowAll.html
- <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
- <html xmlns="http://www.w3.org/1999/xhtml">
- <head>
- <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
- <title>无标题文档</title>
- </head>
- <body>
- <h1>信息查询</h1>
- <table width="100%" cellpadding="0" cellspacing="0" border="1">
- <tr>
- <td>代号</td>
- <td>姓名</td>
- <td>性别</td>
- <td>民族</td>
- <td>生日</td>
- </tr>
- <foreach name="shuju" item="v">
- <tr>
- <td><{$v.code}></td>
- <td><{$v.name}></td>
- <td><{$v.sex}></td>
- <td><{$v.nation}></td>
- <td><{$v.birthday}></td>
- </tr>
- </foreach>
- </table>
- </body>
- </html>
3.运行结果:
三、数据添加
add() 该方法返回被添加的新记录的主键id值
三种方式实现数据添加
1. 数组方式数据添加
$goods = D(“Goods”);
$arr = array(‘goods_name’=>’iphone5s’,’goods_weight’=>’109’);
//注意:goods_name和goods_weight是数据表中字段名称
$goods -> add($arr);
- function Add()
- {
- //1.数组添加数据
- //要添加的数组,必须是关联数组,key必须为字段名称
- //方式一:
- $model=D("Info");
- $attr=array(
- "Code"=>"p100",
- "Name"=>"ww",
- "Sex"=>true,
- "Nation"=>"n001",
- "Birthday"=>"1999-01-01"
- );
- //方式二:
- $attr["Code"]="p111";
- $attr["Name"]="小豪";
- $attr["Sex"]=false;
- $attr["Nation"]="n003";
- $attr["Birthday"]="1993-08-20";
- $model->add($attr);//添加数据的方法。需要参数,该参数是关联数组
}
2. 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值返回
- function Add()
- {
- //2.AR方式实现数据添加(对象方式)
- //1.连接类 2.实体类 3.数据访问类
- $model=D("Info");
- $model->Code="p120";
- $model->Name="yuyu";
- $model->Sex=true;
- $model->Nation="n004";
- $model->Birthday="1999-9-9";
- $model->add();
- }
3. 收集表单数据入库操作
- 制作一个表单
- 通过$_POST收集信息
- 通过create()方法实现数据收集,该方法对于非法的字段会自动进行过滤
注意:一个add控制器实现两个逻辑,一个是打出添加页面,一个是向数据库添加内容
通过一个例子来说明:
1. 在MainController.class.php控制器中写一个方法来接收并向数据库添加数据
- function All()
- {
- if(empty($_POST))
- {
- $nation=M("nation");
- $attr=$nation->select();
- $this->assign("shuju",$attr);
- $this->display();
- }
- else
- {
- $model=D("Info");
- $model->create();//自动收集表单数据入库
- $model->Sex=$_POST["Sex"]=="1"?true:false;
- $r=$model->add();
- if($r)
- {
- //添加成功跳转页面
- $this->success("添加数据成功!","Add",5);//5代表跳转时间,默认是3秒
- }
- else
- {
- //添加失败跳转页面
- $this->error("添加数据失败!","Add",5);
- }
- }
2.在View\Main中新建:ShowAll.html
- <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
- <html xmlns="http://www.w3.org/1999/xhtml">
- <head>
- <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
- <title>无标题文档</title>
- </head>
- <body>
- <!--自动收集表单数据入库操作 -->
- <!--注意大小写和数据库中的列名一致 -->
- <h2>添加数据</h2>
- <form action="__ACTION__" method="post">
- <div>代号:<input type="text" name="Code" /></div>
- <div>姓名:<input type="text" name="Name" /></div>
- <div>性别:<input type="radio" name="Sex" value="1" />男
- <input type="radio" name="Sex" value="0" />女
- </div>
- <div>民族:
- <select name="Nation">
- <foreach name="shuju" item="v">
- <option value="<{$v.code}>"><{$v.name}></option>
- </foreach>
- </select>
- </div>
- <div>生日:<input type="text" name="Birthday" /></div>
- <input type="submit" value="提交" />
- </form>
- </body>
- </html>
3.运行结果:
若添加成功:
==>
==>
若添加不成功:
==>
注意:如果是主键值重复,这种错误会导致error()方法不跳转页面直接抛出错误信息,这是新版本问题,如果想要跳转,找到
Thinkphp 连接数据库、查询、添加的更多相关文章
- ThinkPHP视图查询详解
ThinkPHP视图查询详解 参考http://www.jb51.net/article/51674.htm 这篇文章主要介绍了ThinkPHP视图查询,需要的朋友可以参考下 ThinkP ...
- Thinkphp中查询复杂sql查询表达式,如何表达MYSQL中的某字段不为空is not null?
Thinkphp中查询复杂sql查询表达式,如何表达MYSQL中的某字段不为空is not null?先上两种实现方式的实例:$querys["house_type_image"] ...
- thinkphp 定位查询 Model:last您所请求的方法不存在!
thinkphp 定位查询 Model:last您所请求的方法不存在! 用thinkphp3.1做项目的时候为了获取记录表中最后一个id用到了last()方法,出现了这个错误:Model:last ...
- ElasticSearch 学习记录之ES查询添加排序字段和使用missing或existing字段查询
ES添加排序 在默认的情况下,ES 是根据文档的得分score来进行文档额排序的.但是自己可以根据自己的针对一些字段进行排序.就像下面的查询脚本一样.下面的这个查询是根据productid这个值进行排 ...
- ThinkPHP视图查询
ThinkPHP视图查询 一.总结 1.这里的视图查询和多表查询很像,当然多表查询的话肯定要支持左右链接查询 2.view:视图的使用,关键字是view 3.sql视图功能支持:thinkphp支持视 ...
- thinkphp 组合查询
组合查询的主体还是采用数组方式查询,只是加入了一些特殊的查询支持,包括字符串模式查询(_string).复合查询(_complex).请求字符串查询(_query),混合查询中的特殊查询每次查询只能定 ...
- thinkphp 快捷查询
快捷查询方式是一种多字段查询的简化写法,可以进一步简化查询条件的写法,在多个字段之间用|分割表示OR查询,用&分割表示AND查询,可以实现下面的查询,例如: 大理石平台价格 一.不同字段相同的 ...
- 连接数据库查询 将查询结果写入exce文件中
package com.cn.peitest.connectDatabase; import java.io.File; import java.lang.reflect.Field; import ...
- 6月16 ThinkPHP连接数据库及Model数据模型层--------查询及数据添加
连接数据库配置及Model数据模型层 convertion.php config.php 1.在config.php做数据库连接配置 2.修改配置 /* 数据库设置 */ 'DB_TYPE' => ...
随机推荐
- WIN32程序挂钩SetLastError,输出错误描述到控制台
WIN32程序挂钩SetLastError,输出错误描述到控制台 作者:徐灵甫 一.窗口模式应用程序(GUI)启用控制台的方法为: 步骤 方法 1 启动/关闭控制台 AllocConsole()Fre ...
- org/springframework/core/MethodClassKey
解决下面报错的办法: 把pom.xml中下面两个dependency的version去掉. <dependency> <groupId>org.springframework& ...
- LaTeX排版工具使用
专业的论文,都是用Latex.CTex等相关的工具.那么,用word写论文,缺点在哪? latex 写的东西,最终要编译成pdf格式的.里面的格式,尤其是数学类符号等,比较漂亮.这是word不能比的. ...
- PHP 错误提示
HTTP/1.1 200 OKServer: nginxDate: Thu, 20 Jun 2013 03:06:10 GMTContent-Type: text/html; charset=utf- ...
- shell中$0,$?,$!等的特殊用法【转载】
本文转载自:http://blog.sina.com.cn/s/blog_464f6dba0100psy9.html ----------------------------------------- ...
- fstream的用法
本文转载自 http://www.newxing.com/Tech/Program/Cpp/577.html C++文件流:fstream // 文件流ifstream // 输入文件流ofst ...
- js的简单模板解析
在编程中总是会遇见很多动态生成的东西,一般我们都是通过简单的html拼接起来的 function createHtml(name, phone, addr, email, imageSrc){ var ...
- 使用MyEclipse搭建java Web项目开发
转自:http://blog.csdn.net/jiuqiyuliang/article/details/36875217 首先,在开始搭建MyEclipse的开发环境之前,还有三步工具的安装需要完成 ...
- 数据库 —— 使用JDBC操作数据库
[Link] http://www.developer.com/java/data/manipulating-a-database-with-jdbc.html Manipulating a Data ...
- SKEffectNode类
继承自 SKNode:UIResponder:NSObject 符合 NSCoding(SKNode)NSCopying(SKNode)NSObject(NSObject) 框架 /System/L ...