連接數據庫配置及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 收集表單數據入庫操作
- 制作一個表單
- 通過$_POST收集信息
- 通過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()方法不跳轉頁面直接拋出錯誤信息,這是新版本問題,如果想要跳轉,找到


