连接数据库配置及Model数据模型层

convertion.php

config.php

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

2.修改配置

 /* 数据库设置 */
'DB_TYPE' => 'mysql', // 数据库类型
'DB_HOST' => 'localhost', // 服务器地址
'DB_NAME' => 'mydb', // 数据库名
'DB_USER' => 'root', // 用户名
'DB_PWD' => '', // 密码
'DB_PORT' => '', // 端口
'DB_PREFIX' => '', // 数据库表前缀
'DB_PARAMS' => array(), // 数据库连接参数
'DB_DEBUG' => TRUE, // 数据库调试模式 开启后可以记录SQL日志
'DB_FIELDS_CACHE' => true, // 启用字段缓存
'DB_CHARSET' => 'utf8', // 数据库编码默认采用utf8
'DB_DEPLOY_TYPE' => 0, // 数据库部署方式:0 集中式(单一服务器),1 分布式(主从服务器)
'DB_RW_SEPARATE' => false, // 数据库读写是否分离 主从式有效
'DB_MASTER_NUM' => 1, // 读写分离后 主服务器数量
'DB_SLAVE_NO' => '', // 指定从服务器序号

Model:数据库中每张表对应一个模型,Model是一个类,类名是表名,类里面的成员变量是列名,把一张表对应为一个类,其中一条数据对应一个对象

如果我们对该表的模型没有特殊操作的话可以不用建立该模型(换句话说就是不需要再Model里面新建形如InfoModel.class.php的模型)

1.实例化Model的三种方式:(以car表为例)

 1.1 采用new的方式,需要新建模型    $car =  new  命名空间CarModel(); 

CarModel.class.php

<?php
namespace Admin\Model;
use Think\Model;
class CarModel extends Model
{ }

实例化MODEL类

$car = new \Admin\Model\CarModel();//根命名空间Admin

var_dump($car);//要求创建模型文件(子类对象里面的)

1.2  $car = D(‘模型标志’);  

a)         $car= D("car");

b)        该$goods是父类Model的对象,但是操作的数据表还是sw_goods

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

快捷的D方法

$car = D("car");

var_dump($car);

1.3  $car = 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

快捷的M方法

$car = M("car");

var_dump($car);

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

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

public function ShowAll()
{
//Model:数据库中每张表对应一个模型,模型其实就是一个类
//模型是类
//类名是表名,类里面的成员变量是列名
//把一张表对应为一个类,其中一条数据对应一个对象
//如果我们对该表的模型没有特殊操作的话可以不用建立该模型 //查询car表(模型没有建立),,new时必须要建立模型 //实例化MODEL类
//$car = new \Admin\Model\CarModel();//根命名空间Admin
//var_dump($car);//要求创建模型文件(子类对象里面的) //快捷的D方法
//$car = D("car");
//var_dump($car); //快捷的M方法
//$car = M("car");
//var_dump($car); }

2. 数据查询

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([偏移量,]条数)  限制查询的条数

$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元的商品的总数目

连贯操作返回是对象,而select是不可以的要写在最后面

老师讲课内容:

public function ShowAll()
{
$info = M("Info");
//返回所有数据二维数组
var_dump($info->select());//把数据库里面的都变成小写的,以后都要小写这样会好 //根据某些条件的查询
//$attr = $info->where("nation='n002'")->select();//where方法可以添加查询条件 //$attr = $info->table("car")->select();//table操作可以切换操作表 //$attr = $info->field("name,nation")->select();//field可以指定查询的字段,指定查询 //$attr = $info->order("birthday desc,sex asc")->select();//排序 //分页查询,如果1个参数时是取前n条数据,2个时是跳过多少取多少
//$attr = $info->limit(2,3)->select();//需要计算 //取第n页的m条数据
//$attr = $info->page(1,2)->select(); //分组查询
//$attr = $info->field("nation,count(*)")->group("nation")->select(); //select * from Info join Nation on 条件 select * from info join nation on info.Nation = nation.Code //连接查询没有记下
//$attr = $info->join("nation on info.Nation = nation.Code")->select(); //$attr = $car->join("Brand on Car.Brand = Brand.Brand_Code")->select();//连接查询 //$attr = $info->distinct(true)->field('nation')->select(); //$attr = $info->find('p001');//可以查一条数据,根据主键值,不写主键值时默认返回第一条
//$attr = $info->select('p001,p002');//根据主键值查询,返回二维数组,可以查询多条
//var_dump($attr); //聚合函数(求和,平均,最大,最小,总数)
//$attr = $info->count();
//$attr = $info->min("birthday"); //$car = M("car");//快捷方法不需要建立模型
//var_dump($car);
//$attr = $car->where("Name like '%奥迪%'")->order("Powers desc")->select(); //var_dump($attr);
}

自己在Admin模块下的练习:以car表为例

        $car = M("car");
//$attr = $car->select();//返回关联的二维数组,把数据库里面的都变成小写的,以后都要小写这样会好,但是添加数据要求完全一致 //根据某些条件的查询(where连贯操作返回是对象,而select是不可以的要写在最后面)
//$attr = $car->where("brand='b002'")->select();//where方法可以添加查询条件 //table操作可以切换操作表
//$attr = $car->table("Nation")->select(); //field可以指定查询的字段,指定查询
//$attr = $car->field("name,code")->select(); //order排序
//$attr = $car->order("oil desc, powers asc")->select(); //分页查询,如果1个参数时是取前n条数据,2个时是跳过多少取多少
//$attr = $car->limit(2,2)->select(); //取第n页的m条数据
//$attr = $car->page(3,5)->select(); //group分组查询
//$attr = $car->field("brand,count(*)")->group("brand")->select(); //select * from Info join Nation on 条件
//select * from info join nation on info.Nation = nation.Code
//join连接查询
//$attr = $car->join("brand on car.brand = brand.brand_code")->select(); //distinct去重
//$attr = $car->distinct(true)->field("brand")->select(); //find方法,根据主键可以取一条数据
//$attr = $car->find("c001");//一维数组
//$attr = $car->select("c001,c002");//二维数组 //模糊查询
//$attr = $car->where("name like '%奥迪%'")->order("powers desc")->select(); //聚合函数
//$attr = $car->count();//查询总条数
$attr = $car->max("price");
$attr = $car->min("price");
$attr = $car->sum("price");
$attr = $car->avg("price"); var_dump($attr);

模糊查询注册变量前端显示

//注册数组前端显示
$car = M("car");
$attr = $car->where("name like '%奥迪%'")->order("powers desc")->select();
//$attr = $car->select();
$this->assign("shuzu",$attr);
$this->display();

前端代码:Admin\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%" border="1" cellpadding="0" cellspacing="0">
<tr>
<td>代号</td>
<td>名称</td>
<td>系列</td>
<td>油耗</td>
<td>功率</td>
</tr>
<foreach name="shuzu" item="v">
<tr>
<td><{$v.code}></td>
<td><{$v.name}></td>
<td><{$v.brand}></td>
<td><{$v.oil}></td>
<td><{$v.powers}></td>
</tr>
</foreach>
</table>
</body>
</html>

显示效果:

3. 数据添加

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

两种方式实现数据添加

  3.1 数组方式数据添加

$goods = D(“Goods”);

$arr = array(‘goods_name’=>’iphone5s’,’goods_weight’=>’109’);

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

$goods -> add($arr);

function Add()
{ //$model = D("Info"); //要添加的数组,必须是关联数组,要求严格按照数据库的大小写写入,key必须为字段名称
$attr = array(
'Code'=>'a001',
'Name'=>'不知道',
'Sex'=>true,
'Nation'=>'n002',
'Birthday'=>'1998-2-3'
); //赋值方法添加
$attr["Code"]="a002";
$attr["Name"]="不是";
$attr["Sex"]=false;
$attr["Nation"]="n003";
$attr["Birthday"]="2003-4-2";
//$model->add($attr);//添加数据的方法需要参数(该参数是一个关联数组)
}

  3.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值返回

//二:AR方法
//1.连接类 2实体类 3数据访问类 $model->Code = "a003";
$model->Name = "获奖";
$model->Sex = true;
$model->Nation = "n002";
$model->Birthday = "1992-3-4";
$model->add();

  3.3 收集表单数据入库操作

  1. 制作一个表单
  2. 通过$_POST收集信息
  3. 通过create()方法实现数据收集,该方法对于非法的字段会自动进行过滤

注意:一个add控制器实现两个逻辑,一个是打出添加页面,一个是向数据库添加内容

例子:Home\MainController\ShowAll

        //三 自动收集表单

        $nation = M("nation");
$attr = $nation->select();
//var_dump($attr);
$this->assign("shuzu",$attr);
//$this->display(); if(empty($_POST))
{
$this->display();
}
else
{
$model = D("Info");
$model->create();//自动收集表单并且创建数据
$model->Sex = $_POST["Sex"]=="男"?true:false;
//$model->add();
$z = $model->add();
//var_dump($z);//输出结果是int 1
if($z)
{
$this->success("添加成功!","Add",5);
}
else
{
$this->error("添加失败","Add",5);
}
}

view\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>info表</h1>
<table width="100%" cellpadding="0" cellspacing="0" border="1">
<tr>
<td>代号</td>
<td>姓名</td>
<td>性别</td>
<td>民族</td>
<td>生日</td>
</tr>
<foreach name="xinxi" 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>

页面显示效果:

添加成功:

如果添加失败:

注意:如果是主键值重复,这种错误会导致error()方法不跳转页面直接抛出错误信息,这是新版本问题,如果想要跳转,找到

6月16 ThinkPHP连接数据库及Model数据模型层--------查询及数据添加的更多相关文章

  1. 2016/05/10 thinkphp 3.2.2 ①系统常量信息 ②跨控制器调用 ③连接数据库配置及Model数据模型层 ④数据查询

    [系统常量信息] 获取系统常量信息: 如果加参数true,会分组显示: 显示如下: [跨控制器调用] 一个控制器在执行的时候,可以实例化另外一个控制,并通过对象访问其指定方法. 跨控制器调用可以节省我 ...

  2. ThinPHP命名空间,连接数据库是要修改的配置文件,Model数据模型层,跨控制器调用,如何获取系统常量信息,

    一.命名空间(主要是为了实现自动加载类) *命名空间(相当于虚拟的目录),为了让类有一个统一的文件夹来管理(可以自动加载'类'),每个文件都要有命名空间*tp如何做命名空间:*TP框架下有一个初始命名 ...

  3. TP【连接数据库配置及Model数据模型层】

    [连接数据库配置及Model数据模型层] convertion.php config.php 在config.php做数据库连接配置 制作model模型 a) model本身就是一个类文件 b) 数据 ...

  4. ThinkPHP讲解(五)——数据库配置及Model数据模型层、查询

    数据库配置 在TP框架中要进行连接数据库操作,要进行配置 要在convertion.php中找到“数据库配置”,并复制到项目配置文件config.php中 Model模型层制作 model:数据库中每 ...

  5. tp框架连接数据库配置及Model数据模型层

    在config.php做数据库连接配置 <?php return array( //'配置项'=>'配置值' 'SHOW_PAGE_TRACE'=>true, /* 数据库设置 */ ...

  6. 6月17 ThinkPHP连接数据库------数据的修改及删除

    1.数据修改操作 save()  实现数据修改,返回受影响的记录条数 具体有两种方式实现数据修改,与添加类似(数组.AR方式) 1.数组方式 a)         $goods = D(“Goods” ...

  7. Thinkphp 连接数据库、查询、添加

    一.连接数据库配置及Model数据模型层 1. Thinkphp\conf\convertion.php中找到数据库设置部分,复制到自己的配置文件中,并添加好有关数据库的内容 JiaoWu\Home\ ...

  8. tp5 model 中的查询范围(scope)

    查询范围scope在model中定义,在controller中使用 namespace app\index\model; use think\Model; class User extends Mod ...

  9. 19.go语言基础学习(下)——2019年12月16日

    2019年12月16日16:57:04 5.接口 2019年11月01日15:56:09 5.1 duck typing 1. 2. 接口 3.介绍 Go 语言的接口设计是非侵入式的,接口编写者无须知 ...

随机推荐

  1. Java程序运行机制及开发环境

    Java既是编译型语言,又是解释型语言 java源文件首先需要通过javac编译生成后缀名为.class的字节码文件(与平台无关,只面向JVM),然后使用Java虚拟机将字节码解释成特定平台上的机器码 ...

  2. (转)Autonomous_Vehicle_Paper_Reading_List

    Autonomous_Vehicle_Paper_Reading_List 2018-07-19 10:40:08 Reference:https://github.com/ZRZheng/Auton ...

  3. HTML+CSS+JS 传智 详细笔记

    HTML(1)- -毕向东老师对Html的简介 CSS- -毕老师对CSS的简介 Javascript- -毕老师对JS的简介 html&css等等练习表(W3Cscholl) js练习表回顾 ...

  4. Linux命令之du命令

    du命令 显示文件或目录所占用的磁盘空间. 命令格式: du [option] 文件/目录 -h 输出文件系统分区使用的情况,例如:10KB,10MB,10GB等 -s 显示文件或整个目录的大小,默认 ...

  5. python 安装插件 requests、BeautifulSoup

    安装第三方插件库 1. requests  , 下载地址 https://github.com/requests/requests 安装: 利用 pip 安装 pip3 install request ...

  6. 测试服务器上多个tomcat配置Nginx访问

    user nginx; worker_processes 4; error_log /var/log/nginx/error.log warn; pid /var/run/nginx.pid; wor ...

  7. NoSQL(not only struts query language)的简单介绍

    为什么需要NoSQL? 互联网自扩大规模来一直面临3个问题 1.High performance高并发 一个网站开发实时生成动态页面可能会存在高并发请求的需求,硬盘IO已经无法接受 2.Huge St ...

  8. “ORA-06550: 第 1 行, 第 7 列”解决方法

    将本机能正常运行的维修生产日志代码发布到公司内测环境里无法正常运行,报错如下: execute() - pls–QuartzJob.java–quartzjob 开始执行! java.sql.SQLE ...

  9. [转][JSBSim]JSBSim的使用--飞行控制组件及其配置

    http://www.jianshu.com/p/b5e9f1f5df95 飞行控制率.稳定增强系统.自动驾驶仪和其他飞控系统(航电.电气等)都能够在 JSBSim 中以独立的控制组件进行建模.JSB ...

  10. Java 层序创建和遍历二叉树

    直接上代码 package te.com; import java.util.LinkedList; import java.util.Queue; import java.util.logging. ...