一、連接數據庫配置及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 namespace Home\Model; use Think\Model; class InfoModel extends Model { }
3. 實例化Model的三種方式:
- $goods = new 命名空間GoodsModel();
- $goods = D(‘模型標志’);
a) $goods = D(“Goods”);
b) 該$goods是父類Model的對象,但是操作的數據表還是sw_goods
c) $obj = D(); 實例化Model對象,沒有具體操作數據表,與M()方法效果一致
- $obj = M();
a) 實例化父類Model
b) 可以直接調用父類Model里邊的屬性,獲得數據庫相關操作
c) 自定義model就是一個空殼,沒有必要實例化自定義model
d) $obj = M(‘數據表標志’); 實例化Model對象,實際操作具體的數據表
$obj = D(標志);
$obj = D();
$obj = M(標志);
$obj = M();
D()和M()方法的區別:
1. 前者是tp3.1.3里邊對new操作的簡化方法;
2. 后者在使用就是實例化Model父類
3. 兩者都在函數庫文件定義ThinkPHP/Common/functions.php
注意:如果沒有對應的model模型文件類,也可以直接實例化model對象進行操作
D()和M()方法都可以實例化操作一個沒有具體model模型類文件的數據表。
function ShowAll() { //Model:數據庫中每張表對應一個模型 //類名是表名,類里面的成員變量是列名 //把一張表對應為一個類,其中一條數據對應一個對象 //如果我們對該表的模型沒有特殊操作的話可以不用建立該模型 //1.實例化model類 $info=new \Home\Model\InfoModel(); //var_dump($info); //2.使用D()方法 $info = D("Info"); //var_dump($info); //3.使用M()方法 $car=M("Car"); //var_dump($car); }
二、數據查詢
select()是數據模型的一個指定方法,可以獲得數據表的數據信息
返回一個二維數組信息,當前數據表的全部數據信息
$obj = D(); 創建對象
查詢常使用的方法:
$obj -> select(); 查詢數據,使用select()會返回一個二維數組
$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元的商品的總數目
//汽車表Car $car=M("Car"); var_dump($info->select());//返回所有數據的二維數組 //使用TP框架時,建表是表名和列名最好都用小寫 $attr=$car->where("brand='b002'")->select();//where方法可以添加查詢條件 $attr=$car->table("Nation")->select();//table方法可以切換操作表 $attr=$car->field("name,code")->select();//指定查詢的字段 $attr=$car->order("oil desc")->select();//排序 $attr=$car->limit(2,2)->select();//分頁查詢,如果是一個參數是取前n個數據,兩個數據是跳過幾個取幾個 $attr=$car->page(3,2)->select();//分頁查詢,可以取第幾頁的n條數據 $attr=$car->field("brand,count(*)")->group("brand")->select();//分組查詢 $attr=$car->join("brand on car.brand=brand.brand_code")->select();//連接查詢 $attr=$car->distinct(true)->field("brand")->select();//distinct(true)去重 $attr=$car->find("c001");//查一條數據,只根據主鍵值查,返回一維數組,不寫主鍵值默認返回第一條 $attr=$car->select();//根據主鍵值查多條數據,返回二位數組, $attr=$car->where("name like '%奧迪%'")->order("powers desc")->select(); //var_dump($attr); //聚合函數:可以放在最后 $attr=$car->count(); $attr = $car->avg("Price"); echo $attr;
自己拿Info表做的練習:

1 //info表 2 $info=M("Info"); 3 var_dump($info); 4 $attr=$info->select(); 5 $attr=$info->where("nation='n001'")->select(); 6 $attr=$info->table("Nation")->select(); 7 $attr=$info->field("sex,birthday")->select(); 8 $attr=$info->order("birthday")->select(); 9 $attr=$info->field("nation,count(*)")->group("nation")->select(); 10 $attr=$info->limit(1,2)->select(); 11 $attr=$info->page(2,3)->select(); 12 $attr=$info->join("nation on Info.Nation=Nation.Code")->select(); 13 $attr=$info->distinct(true)->field("birthday")->select(); 14 $attr=$info->find("p010"); 15 $attr=$info->select("p010,p120"); 16 17 var_dump($attr);
如何在頁面顯示查詢出的表格內容:
1. 在MainController.class.php控制器中寫一個方法,實例化model,查詢info表內容,然后注冊到前端
function ShowAll() { $info=M("Info"); $attr=$info->select(); $this->assign("shuju",$attr); $this->display(); }
2.在View\Main中新建:ShowAll.html

1 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> 2 <html xmlns="http://www.w3.org/1999/xhtml"> 3 <head> 4 <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> 5 <title>無標題文檔</title> 6 </head> 7 8 <body> 9 <h1>信息查詢</h1> 10 <table width="100%" cellpadding="0" cellspacing="0" border="1"> 11 <tr> 12 <td>代號</td> 13 <td>姓名</td> 14 <td>性別</td> 15 <td>民族</td> 16 <td>生日</td> 17 </tr> 18 19 <foreach name="shuju" item="v"> 20 <tr> 21 <td><{$v.code}></td> 22 <td><{$v.name}></td> 23 <td><{$v.sex}></td> 24 <td><{$v.nation}></td> 25 <td><{$v.birthday}></td> 26 </tr> 27 </foreach> 28 </table> 29 </body> 30 </html>
3.運行結果:
三、數據添加
add() 該方法返回被添加的新記錄的主鍵id值
三種方式實現數據添加
1. 數組方式數據添加
$goods = D(“Goods”);
$arr = array(‘goods_name’=>’iphone5s’,’goods_weight’=>’109’);
//注意:goods_name和goods_weight是數據表中字段名稱
$goods -> add($arr);
function Add() { //1.數組添加數據 //要添加的數組,必須是關聯數組,key必須為字段名稱 //方式一: $model=D("Info"); $attr=array( "Code"=>"p100", "Name"=>"ww", "Sex"=>true, "Nation"=>"n001", "Birthday"=>"1999-01-01" ); //方式二: $attr["Code"]="p111"; $attr["Name"]="小豪"; $attr["Sex"]=false; $attr["Nation"]="n003"; $attr["Birthday"]="1993-08-20"; $model->add($attr);//添加數據的方法。需要參數,該參數是關聯數組
}
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值返回
function Add() { //2.AR方式實現數據添加(對象方式) //1.連接類 2.實體類 3.數據訪問類 $model=D("Info"); $model->Code="p120"; $model->Name="yuyu"; $model->Sex=true; $model->Nation="n004"; $model->Birthday="1999-9-9"; $model->add(); }
3. 收集表單數據入庫操作
- 制作一個表單
- 通過$_POST收集信息
- 通過create()方法實現數據收集,該方法對於非法的字段會自動進行過濾
注意:一個add控制器實現兩個邏輯,一個是打出添加頁面,一個是向數據庫添加內容
通過一個例子來說明:
1. 在MainController.class.php控制器中寫一個方法來接收並向數據庫添加數據
function All() { if(empty($_POST)) { $nation=M("nation"); $attr=$nation->select(); $this->assign("shuju",$attr); $this->display(); } else { $model=D("Info"); $model->create();//自動收集表單數據入庫 $model->Sex=$_POST["Sex"]=="1"?true:false; $r=$model->add(); if($r) { //添加成功跳轉頁面 $this->success("添加數據成功!","Add",5);//5代表跳轉時間,默認是3秒 } else { //添加失敗跳轉頁面 $this->error("添加數據失敗!","Add",5); } }
2.在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> <!--自動收集表單數據入庫操作 --> <!--注意大小寫和數據庫中的列名一致 --> <h2>添加數據</h2> <form action="__ACTION__" method="post"> <div>代號:<input type="text" name="Code" /></div> <div>姓名:<input type="text" name="Name" /></div> <div>性別:<input type="radio" name="Sex" value="1" />男 <input type="radio" name="Sex" value="0" />女 </div> <div>民族: <select name="Nation"> <foreach name="shuju" item="v"> <option value="<{$v.code}>"><{$v.name}></option> </foreach> </select> </div> <div>生日:<input type="text" name="Birthday" /></div> <input type="submit" value="提交" /> </form> </body> </html>
3.運行結果:
若添加成功:
==>
==>
若添加不成功:
==>
注意:如果是主鍵值重復,這種錯誤會導致error()方法不跳轉頁面直接拋出錯誤信息,這是新版本問題,如果想要跳轉,找到