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

时间:2023-03-09 01:50:50
6月16  ThinkPHP连接数据库及Model数据模型层--------查询及数据添加

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

convertion.php

config.php

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

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

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>

显示效果:

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

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>

页面显示效果:

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

添加成功:

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

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

如果添加失败:

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

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

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

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