6月16 ThinkPHP连接数据库及Model数据模型层--------查询及数据添加

连接数据库配置及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()方法不跳转页面直接抛出错误信息,这是新版本问题,如果想要跳转,找到

时间: 2024-12-21 05:13:32

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

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

一.命名空间(主要是为了实现自动加载类) *命名空间(相当于虚拟的目录),为了让类有一个统一的文件夹来管理(可以自动加载'类'),每个文件都要有命名空间*tp如何做命名空间:*TP框架下有一个初始命名空间(相当于根目录)ThinkPHP\Libray*在初始命名空间下又包含很多根命名空间,这些根命名空间主要分两类:1.TP核心类里面的根(系统文件)        在Libray下,有几个文件夹就有几个根(所有的文件夹都是根)2.APP里面的根(自定义文件)        APP里面的根是以模块名

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

[连接数据库配置及Model数据模型层] convertion.php config.php 在config.php做数据库连接配置 制作model模型 a) model本身就是一个类文件 b) 数据库中的每个数据表都对应一个model模型文件 c) 最简单的数据model模型类 .字段缓存设置 tp框架执行过程中会使用到数据表中的字段信息,通过sql语句可以查询”show colums from table”  ,处于性能考虑,可以把字段缓存,避免每次重复执行sql语句. 4.可以根据情况对当

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

数据库配置 在TP框架中要进行连接数据库操作,要进行配置 要在convertion.php中找到“数据库配置”,并复制到项目配置文件config.php中 Model模型层制作 model:数据库中每张表对应一个模型       类名就是表名,类里面的成员变量就是列名       把一张表对应一个类,其中一条数据对应一个对象 如果我们对该表的模型没有特殊操作的话可以不用建立该模型 现在要制作一个最简单的model模型InfoModel.class.php <?php namespace Home

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

1.数据修改操作 save()  实现数据修改,返回受影响的记录条数 具体有两种方式实现数据修改,与添加类似(数组.AR方式) 1.数组方式 a)         $goods = D(“Goods”); b)        $ar = array(‘goods_id’=>100,‘goods_name’=>’lenovo手机’,’goods_price’=>1200); c)         $goods ->where(‘goods_id>50’)-> save($

老男孩教育每日一题-2017年3月16日: linux网络配置中如何给一块网卡添加多个IP地址

linux系统给网卡配置VIP的方法常见有两种:别名IP.以及辅助IP 别名IP(alias ip) ip alias是由linux系统的ifconfig命令来创建和维护的,别名IP就是在网卡设备上绑定的第二个及以上的IP 说明:别名IP的配置方式将在以后的linux系统中被遗弃了,因为在以后的系统中不会再有ifconfig命令了 ①. 手工配置别名的VIP的方法 ifconfig eth0:1 10.0.0.100 netmask 255.255.255.224 up route add -h

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 nam

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 语言的接口设计是非侵入式的,接口编写者无须知道接口被哪些类型实现. 而接口实现者只需知道实现的是什么样子的接口,但无须指明实现哪一个接口. 编译器知道最终编译时使用哪个类型实现哪个接口,或者接口应该由谁来实现. 每个接口类型由数个方法组成.接口的形式代码如下: type 接口类型名 interface{ 方法名1( 参数列表1 ) 返回值列表

最新手机号段归属地数据库(2017年4月16日版)免费下载

2017年4月16日版   360569条记录最新 手机号段数据库 号码归属地数据库  移动号段 联通号段 电信号段 14号段 170号段(虚拟运营商)   权威  全面  准确  规范字段包括 省份 城市 运营商 邮编 区号 等信息,对于数据分析.号码归属地查询等非常有帮助 三种格式:MYSQL,MSSQL,access MDB格式 字段:手机号码前7位,省份,城市,区号,运营商,邮编 末尾如下: 360551 1899981 新疆 乌鲁木齐 中国电信 0991 830000360552 18

信息系统项目3月16日作业

3月16日作业: 一,本章课程重点: 项目整体管理的过程包括如下内容: 项目启动 制定初步的范围说明书 制定项目管理计划 指导和管理项目的执行 监督和控制项目 整体变更控制 项目收尾 启动前加入背景介绍 收尾后加入经验教训就是论文论项目整体管理大纲 项目启动:项目立项以后就要正式启动项目,启动是以书面的.正式的形式肯定项目的成立于存在,同时以书面正式的形式为项目经理进行授权 项目正常的作用和内容 项目章程是正式批准一个项目的文档,或者是批准现行现行项目是否进入下一阶段的文档.项目章程应当由项目组