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);
View Code

 

模糊查詢注冊變量前端顯示

//注冊數組前端顯示
        $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>
View Code

顯示效果:

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()方法不跳轉頁面直接拋出錯誤信息,這是新版本問題,如果想要跳轉,找到

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM