连接数据库配置及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. oracle单行函数 之 转换函数

    to_char(字符串 \ 列, 格式字符串):将日期或者数字变成为字符串显示 注意点:时间字符串或时间类型列  与  格式字符串  必须是一一对应,若是多了少了相关字符会报错(除了使用systemd ...

  2. 《开始使用Linux》单元测验 1

    C语言编写的应用程序,通过printf打印一个换行符\n,但在终端上执行的是回车加换行\r\n,把换行符替换为回车换行是由下面哪个软件模块完成的? Linux内核中的行律模块 下面哪个命令可以获得ma ...

  3. pom.xml中build标签

    1.分类 (1)全局配置(project build) 针对整个项目的所有情况都有效 (2)配置(profile build) 针对不同的profile配置 <project xmlns=&qu ...

  4. TCP/UDP协议、理解三次握手四次挥手、Socket

    一.什么是socket? 中文名叫套接字,是对底层的 TCP IP UDP 等网络协议进行封装,使得上层的应用程序开发者,不用直接接触这对复杂,丑陋的协议. 在程序员的言论,他就是一个封装好的模块,要 ...

  5. memset()函数用法及其作用

    memset()函数原型是: extern void *memset(void *buffer, int c, int count) //buffer:为指针或是数组, //c:是赋给buffer的值 ...

  6. 深究CSS中Position的属性和特性

    一.position的概念 作为布局必不可缺少的元素之一,深究其属性以及一些注意点是非常必要的. 定义:规定元素的定位类型. position属性: 属性 描述 常用性 absolute 生成绝对定位 ...

  7. pl/sql编译存储过程卡住的解决方法

    oracle编译存过卡住处理: 问题描述: 在编译某个存过时,由于没提交或断网或者test没停止又重新编译,导致编译存过一直卡死 问题分析: 存过或某张表被锁 问题处理: 1.查看存过是否锁住,loc ...

  8. oracle 存储过程给另一个用户的权限问题

    grant execute on (包名)存储过程名称 to 用户名; grant debug on  (包名)存储过程名称 to 用户名 grant select on  存储过程名称 to 用户名 ...

  9. linq to sql and linq to object 总结

    Enumable类型是linq to object   是一个很特殊的类型   这个类型的数据源都是在程序的内存中 Queryable类型是 Linq to sql   对数据库进行操作都是这个类型  ...

  10. R语言矩阵栅格显示矩阵颜色显示

    效果如下: