ThinkPHP框架php
1、框架介紹css
PHP框架真正的發展是從php5開始的,在php5中對對象模型的修改對框架的發展起了很大的做用。PHP框架就是經過提供一個開發web程序的基本架構,把基於web開發的PHP程序擺到流水線上。換句話說,php開發框架有助於促進快速軟件開發,節約了開發時間,減小了代碼的重複編寫。html
1.一、什麼是框架前端
框架(framework)其實就是開發一個系統的半成品,是在一個給定的問題領域內,實現一個應用程序的一部分設計,簡單的說就是項目骨架已經搭好並提供了豐富的組建庫,只增長了一些內容或者調用一些提供好的組件就能夠完成本身的系統。mysql
咱們能夠把框架的項目部署理解爲一個建築的地基以及環境的搭建,組建庫理解爲各類建築材料,咱們只須要「裝修」一番,就能夠將其變成辦公樓,住宅樓,商業街....(我的主頁、OA系統、電子商城....)程序員
1.二、爲何要用框架web
框架最大的好處就是重用。由於web發展到今天已經很複雜了,特別是服務器軟件,涉及到的知識、內容和問題已經不少了,在項目開發過程當中若是若是使用一個成熟的框架,就至關於讓別人幫你完成了一些基礎工做(50%以上),咱們只須要集中精力完成系統的業務邏輯設計。並且框架通常都是成熟穩健的,能夠處理系統的不少細節問題,好比事物處理,安全性,數據流控制等問題。還有框架通常都通過不少人使用,因此結構、擴展都很好,並且是不斷升級的,你能夠直接享受別人升級代碼帶來的好處。框架也將問題劃分開了各個解決,易於控制,易於延展,易於分配資源。應用框架強調的是軟件的設計重用性和系統的可擴展性,以縮短大型軟件應用系統的開發週期,提升開發質量。ajax
1.三、框架和MVCsql
框架是軟件,而設計模式是軟件的知識,一個框架每每含有一個或者多個設計模式,如今幾乎全部流行的PHP框架都能實現MVC設計模式,將開發程序強制拆分紅視圖、控制器和模型三層,因此,使用框架後,就不用糾結去如何實現MVC了。若是不用框架去實現MVC,不只MVC不易於理解,分離的難度也比較高。thinkphp
M - Model 模型 負責數據操做
V - View 視圖、模版 負責前臺頁面顯示
C - Controller 模塊 描述功能,調度M和V
一個框架不只要具有MVC。還要具有如下一些功能
1.3.一、目錄組織結構
能夠自動部署項目所需的所有目錄結構,或按框架的規則要求,建立項目的目錄結構
1.3.二、類加載
框架中全部開發中用到的功能類,均可以自動加載。包括系統中提供的強大的基類庫,以及用戶自定義的功能類
1.3.三、基礎類
每一個成熟的框架都爲用戶提供了很是豐富的基類,讓程序員在自定義方法中直接就能夠從基類中繼承來大量的功能
1.3.四、URL處理
框架中幾乎都須要URL處理方式。對URL的管理包括兩個方面。首先當用戶請求約定的URL時,應用程序須要解析它變成能夠理解的參數。第二,應用程序須要提供一種創造URL的方法,以便建立的URL應用程序是能夠理解的。
1.3.五、輸入處理
用戶的一些輸入一般都在URL參數中,或者經過表單提交。爲了防止一些不合理的數據和輸入攻擊,框架中能夠完成對輸入內容進行過濾以及自動完成一些數據驗證工做。
1.3.六、錯誤異常處理
在使用框架開發系統時,框架會提供一些配套的錯誤處理方式和程序調試模式,方便程序員快速解決開發中遇到的問題
1.3.七、擴展類
在框架中除了提供一些豐富的基類,還會提供一些經常使用的功能擴展類,包括web項目中一些常見功能,像分頁程序,上傳類等,也會提供用戶自定義擴展類的接口。
2、ThinkPHP
1.好處
一、免費的,代碼開源
二、單入口+模板引擎(thinktemplatexml)+MVC的一種的開發模式;
三、智能url路由 (0-3)
index.php?m=User&a=show&id=100
index.php/m/User/a/show/id/100
index.php/User/show/id/100
四、目錄是自動建立
五、ajax+數據操做、表單驗證等等都很智能
自動驗證 自動完成 自動映射
ThinkPHP\CI\YII
2.框架下載
下載地址: www.thinkphp.cn
3.項目目錄
3.一、index.php 項目入口文件
一、//檢測PHP環境
if(version_compare(PHP_VERSION,'5.3.0','<')) die('require PHP > 5.3.0 !');
二、 //定義項目路徑
define('APP_PATH', './Application/');
//注意此處後面必須加斜線
三、//加載框架入口文件 //注意 必定要嚴格區分大小寫,防止項目遷移
require("./ThinkPHP/ThinkPHP.php");
//注意是requeire而不適用include 由於這個核心文件若是引入出錯,那麼整個項目就不必運行了
3.二、MVC對應的項目文件夾
M ---- ./Application/Home/Model
V ---- ./Application/Home/View
C ---- ./Home/Action/Home/Controller
4 ThinkPHP運用
4.1 URL四種訪問方式URL_MODEL
1. 普通模式(URL_MODEL=0)
http://域名/項目文件夾名/入口文件?m=控制名&a=方法名&id=100
m:表明的是模塊名(控制器名)
a:表明的模塊的操做名(方法名)
/2015112/tp/index.php?m=Home&c=User&a=hello&name=tom&age=20
2. Pathinfo方式
http://域名/項目名/入口/模塊名/方法名/鍵1/值1/鍵2/值2
http://localhost/2015110/middle/thinkphp/index.php/Index/index/test/zzz/name/tom.shtml
三、rewrite模式
http://localhost/2015110/middle/thinkphp/index.php/Index/index/test/zzz/name/tom.shtml
有時候要把地址欄中的index.php去掉 localhost/.../hinkshop/Index/index
四、兼容模式
當默認服務器沒法兼容pathinfo模式的時候
http://localhost/2015110/middle/thinkphp/index.php?s=/Index/index/test/zzz/name/tom.shtml
注意:URL模式的更改在配置文件中的Home/Conf/config.php中更改URL_MODEL的值來實現的
4.二、TP:跳轉方法
一、提示性信息頁面模版 ThinkPHP/tpl/dispatch_jump.tpl
$this->success(提示性信息,U(Action/Method));
$this->error(提示性信息);
也能夠自定義跳轉模板,在config.Php文件中添加以下配置項:
'TMPL_ACTION_ERROR' => 'Public/error';
'TMPL_ACTION_SUCCESS' => 'Public/success';
就可使用本身定義的配置模版啦
二、頁面重定向
當程序在一個方法裏面想跳轉另外一個方法時候,須要傳遞數據過去!
Eg: 傳值形式相似於U
//重定向到New模塊的Category操做
$this->redirect('New/category', array('cate_id' => 2), 5, '頁面跳轉中...');
·單純的URL跳轉
redirect('http://www.baidu.com', 5, '頁面跳轉中...');
函數的redirect(「url地址」,5,'頁面跳轉中...')只能跳轉本控制器
注意兩種用法的區別:
第一種是類的成員方法$this->redirect(),第二種是普通函數,直接使用
4.3 調用模版:
一個控制器對應一個模版目錄
IndexController.class.php------>項目目錄/view/Index/XXXX.html
$this->display(只有文件名沒有後綴)若是控制裏面方法不想調用與之名稱一致的模版文件用此方法
$this->display();
注意:當display方法的值爲空的時候表明調用與此控方法名相同模版名
// 主題 在./Application/Home/conf/config.php
'DEFAULT_THEME' => 'default', //默認模板主題名稱
注意:若是設置了主題(default),爲了防止模版路徑過深
配置:TMPL_FILE_DEPR =>"_"
全部模版文件:./Application/Home/view/default/控制器名_XXXX.html
控制器名_模版名.html
4.4 debug調試模式
1.index.php------------>define('APP_DEBUG', true);
開啓trace追蹤頁面
2./App/conf/config.php------------->"SHOW_PAGE_TRACE" => true,
3.'SHOW_ERROR_MSG' => false,
//顯示配置項「ERROR_MESSAGE」,3.2中設置爲false,true反而不顯示錯誤信息
//app_debug開啓的話,強制忽略此時show_error_msg
"ERROR_MESSAGE"=>"據說醜的人都會犯這個錯",
4.'URL_HTML_SUFFIX' =>'html|shtml|htm', // URL僞靜態後綴設置
5. 配置文件
慣例配置文件
/ThinkPHP/conf/convention.php 項目默認配置,不要在此文件裏面修改配置項的值
項目配置文件
/Application/Home/conf/config.php 配置項目裏一些信息,能夠自定義配置,
優先級 C()>當前模塊config.php>Application/Common/conf/config.php> convention.php
return array(
"配置項" =>值,
....
)
在代碼中可使用系統提供的C函數
1. 讀取 $變量 = C("配置項名稱");
2. 修改 C("配置項的名稱","值")
3. 動態配置 C("動態的配置項名稱",值)
6.函數庫
系統函數庫
ThinkPHP/common/
-common.php(<3.1) 是全局必須加載的基礎函數庫,在任什麼時候候均可以直接調用
-functions.php是框架標準模式的公共函數庫,其餘模式能夠替換加載本身的公共函數庫或者對公共函數庫中的函數進行從新定義
-runtime.php(<3.1)是框架運行時文件,僅在調試模式或者編譯過程纔會被加載,所以其中的方法在項目中不能直接調用
3.2版本common.php和~runtime.php已經不存在,合併爲functions.php
項目函數庫
Application/Home/common/
項目函數庫一般位於項目的Common目錄下面,文件名爲function.php,不能寫錯
函數使用:
引入函數所在命名空間
Namespacename\funcname();
7. 控制器的使用
7.1控制器之間的調用
一、本控制器調用其的控制器
$obj = A("控制器名");
eg: $Good = A("Good") //不是goodController
二、調用須要的方法
對象->方法名();
eg:
$Good->getHotGood();
做用:數據[代碼]重用!
注意:在被調用的控制器裏面那個方法 不能在調用模版了!數據以返回值的形式返回。
7.2 thinktemplate 模版引擎
一、調用模版:
$this->display();調用與此方法名一致的模版文件
$this->display(只有文件名沒有後綴)
若是控制裏面方法不想調用與之名稱一致的模版文件用此方法
二、在展現模版以前,TP給我提供了兩種往模版進行賦值的方法:
· $name = 「張三」;
$this->name = $name;
$this->assign("模版變量名",php中的數據|變量)->assign(‘sex’,’xx’)->assign(‘age’,20)->display(「index」)
thinkPHP模版邊界符默認 { }
前臺使用:{$username}
'TMPL_L_DELIM'=>"{",
'TMPL_R_DELIM'=>"}"
注意:數組在模版中取值,能夠是$arr[‘name’],也能夠是$arr.name。
可是在模版中的數組元素值須要取值並運算的時候 只能使用 []的取值形式
模版變量也能夠註釋掉 {//$name}
模板引擎:
tp模版中的魔術變量
__ROOT__:會替換成當前TP項目的根目錄(不含域名)
__APP__:會替換成入口文件地址(不含域名)
__MODULE__:會替換成當前模塊的URL地址(不含域名)
__CONTROLLER__(__或者__URL__兼容考慮):會替換成當前控制器的URL地址(不含域名)
__ACTION__:會替換成當前操做的URL地址(不含域名)
__SELF__:會替換成當前的頁面URL(入口文件)
__PUBLIC__:會被替換成當前網站的公共目錄一般是 /Public/
注意:魔術方法無疑是提供了很大的方便性,可是當咱們的跳轉或者傳值很複雜的時候,能夠考慮模版中的{:U()}函數
8.模版中的控制結構
8.1: if結構
<if condition="$條件">
代碼塊
<elseif condition="條件"/>
代碼塊
<else />
代碼塊
</if>
eg:
<if condition="$username=='admin'">
管理員
<else />
非管理員
</if>
eq或者 equal: 等於 ==
neq 或者notequal:不等於 !=
gt: 大於 >
egt: 大於等於 >=
lt: 小於 <
elt: 小於等於 <=
heq: 恆等於 ===
nheq: 不恆等於 !==
8.2 switch結構:
<switch name="uname" >
<casevalue="admin">管理員</case>
<casevalue="admin1">註冊用戶</case>
<default/>
普通會員
</switch>
注意:
1.switch的name值,不能帶$符號,不然就編譯成變量的變量
2. value的值 無論什麼類型都得帶上引號
3.<switch></switch>中間不能聽任何註釋
8.3 TP模版標籤
一、模版中的臨時變量
<assignname="varname" value="123"/>
注意: value的值必須帶上引號
二、判斷變量是否等於某個值
<eq name="var_name(無$)" value="value(值)">(內容1)<else/>內容2</eq>
<neqname="var_name(無$)" value="value(值)">(內容1)<else/>內容2</neq>
三、判斷變量是否爲空
<emptyname="變量">1<else />2</empty>
<notemptyname="變量">1<else/>2</notempty>
四、判斷變量是否被賦值
<present name="qe">1<else/>2</present>
<notpresentname="">1<else/>2</notpresent>
// empty和present的區別在於空字符串的識別,$a = 「」. empty認爲值爲空,可是present認爲已經被賦值。其餘狀況就同樣了
五、判斷某個變量是否等於多個值中的一個
<in name="變量名" value="值1,值2,值3">1<else/>2</in>
等同於:
if(in_array($varname,array(值1,值2,值3))){
echo1;
}else{
echo2;
}
<notin name="變量名" value="值1,值2,值3">1<else/>2</notin>
六、區間判斷
<between name=’var’ value=’start,end’></between>
七、常量的定義:
<define name="DB_HOST"value="localhost"/>
<definedname="DB_HOST">1<else/>2</defined>
<ifcondition="defined('DB_HOST')">
1
<else />
2
</if>
if(defined("DB_HOST")){
echo1;
}else{
echo2;
}
注意:模版中的常量輸出 {$Think.const.HHH}或者{:HHH}
8.4 標籤中的代碼直接輸出 模版代碼不解析
<literal>
{$tag}
</literal>
8.5 在模版中直接寫PHP代碼
<php>
echo 1;
</php>
||
<?php echo 1;?>
8.六、模版中的三元運算符
{ $var>10?」yes」:」no」 }
模版中的三元運算符等同於PHP中的三元運算符,而且寫法規則也是同樣的
8.七、循環結構:
for循環
<for start=’100’ end=’0’ comparison=」elt」 step=-1 name=’i’>
</for>
Start : $i=100;
Comparison: elt 表示小於等於,固然也能夠切換其餘比較符號
End: $i=0; $i<=$end
Name: $i
在for標籤中 能夠省略comparison,默認就是start<end
foreach
<foreach name="變量名" item="vo"key="k">
{$vo}
</foreach>
name:被遍歷的數組----->從php頁面傳過來的模版變量,無$符號
item:數組的元素 value的變量名
{$vo.鍵名} === {$vo["鍵名"]}
Volist
標籤主要用於在模板中循環輸出數據集或者多維數組
<volist name="list"id="vo" offset="5" length='10' mod=’2’ empty=」對不起,數組不存在」 >
{$mod} {$vo.name}
</volist>
Name:遍歷的數組的名稱
Id:每一個數組元素值的表示符號,等同於foreach中的 $key=>$vo中的$vo
Offset:數組元素起始下標
Length:循環的數組元素個數
Empty:當遍歷的數組不存在的時候,執行該句輸出
Mod:做爲取模的參數使用的
在遍歷內部用$mod來接收當前記錄索引值對mod取餘的結果
Key: 當不定義時,可使用{$key}表示標識符,使用{$i}標識當前是第幾回循環
而定義key屬性的時候,屬性值不爲key時,都表示爲第幾回循環。
8.8 函數的使用在模版中使用的是PHP的函數
{$webTitle|md5|strtoupper|substr=###,0,3|。。。}
編譯後的PHP代碼就是:
<?phpecho (substr(strtoupper(md5($webTitle)),0,3)); ?>
###表示傳遞實參數是當前的那個標量
{$add_time|date="Y-m-d H:i:s",###}
注意:在使用模版函數的時候,何時會用到###???
在模版中使用函數時,若是該變量不是函數的第一個參數的時候,在後續的參數設置過程當中須要用###來代替本變量,可是若是本變量原本就是做爲第一個形參傳遞到函數中的時候,就能夠把###省略掉了
8.九、系統變量
模板引擎還支持系統變量和系統常量、以及系統特殊變量的輸出。它們的輸出不須要事先賦值給某個模板變量。系統變量的輸出必須以$Think.打頭,而且仍然能夠支持使用函數
Eg: {$Think.now} 以默認格式獲取當前的日期時間(非時間戳格式)
默認常量,當前時間戳
{$Think.const.NOW_TIME|date='Y-m-d H:i:s',###} 把當前時間戳轉換成指定日期時間格式
{:NOW_TIME|date='Y-m-d H:i:s',###}這種有編譯錯誤
8.10模版中文件的引入
<include file="路徑+文件" />
用法1: <includefile="./App/Tpl/default/head.html" />
這種寫法中,必須從index.php項目入口文件開始寫,並且模版文件也必須帶上後綴
用法2:
<include file="Pub/header" /> 或者 <include file=」Pub:header」>
這種寫法是指 引入某個控制器的某個方法,
而該方法會自動調用與方法名相同的模版名,因此此時是不須要加上後綴的。
css|js|images|文件的引入:
<importtype='js' file="Js. user" /> //引入js文件的名稱爲user.js
<import type='css' file="Css.style,Css.index"/> //引入的css文件名爲style.css和index.css
上面的方式默認的import的起始路徑是網站根目錄下Public目錄,而且默認的type就是js
也能夠以下引入:
<jsfile="__PUBLIC__/Js/Common.js"/>
<cssfile="__PUBLIC__/Css/common.css"/>
注意:外部的JS和外部的CSS中使用到的圖片所有都是用相對路徑。
Css的相對路徑是相對於CSS文件自己,因此是../images/xxx.jpg
可是JS的圖片是相對於模版目錄,並且忽略主題設置,因此是 ../../Public/images/xxx.jpg(3.1)
在3.2裏面則直接以入口文件爲相對路徑「./Public/img/xxx.jpg」
能夠以服務器根目錄/來設置
九、數據庫鏈接
在配置文件中做以下設置:
'DB_NAME' =>'thinshop', //數據庫名
'DB_USER' => 'root', //用戶名
'DB_PWD' => '', //密碼
'DB_PREFIX' => '', //數據庫表前綴
'DB_CHARSET' => 'utf8', //數據庫編碼默認採用utf8
ThinkPHP中不須要用戶本身去建立數據庫鏈接或者實例化數據庫對象,只有當你去實例化模型層的時候,基類Model纔會自動幫你鏈接數據庫
十、實例化模型層
一、實例化標準模型(基礎模型基類model)
a) $obj =new Model(‘user’);
b) $obj =M(‘user’);
注意:
在TP的要求中,實例化基礎模型層的時候後,M的參數必須是一張存在的表
二、實例化自定義模型層
a) $obj =new UserModel()
b) $obj =D(‘User’);
注意:D方法和M方法的區別
D和M均可以實現對錶對象的實例化,對錶的CRUD操做也都是同樣的,不一樣的地方在於,D方法實例化一個表對象的同時也表明着實例化了一個模型層的類文件,因此D方法既能夠像M同樣操做數據庫,也能夠用本身的模型層文件中的自定義的方法,天然在功能上就比M強大了一些,固然,運行速度也就降了下來。
還有,當模型層文件不存在的時候,D===M。由於在編譯過程當中,發現須要實例化的模型層文件不存在,那麼,對D的編譯就會變成對M的編譯。
三、實例化公共模型層 extends
a) 當咱們須要每個模型都須要額外的方法時候,爲了不每一個模型都要作一樣的處理,那麼咱們選擇設置一個公共的模型層。
b) 實現方法是 讓這個CommonModel類繼承 Model類,而後其餘的類所有都繼承CommonModel類
四、實例化空模型層
$obj = M();
a) 爲了讓不熟悉TP框架的ORM的人能快速上手TP的數據庫操做,ThinkPHP提供了空模型層的概念
或者 有某種數據庫操做很是很是複雜,複雜到ORM處理起來很是困難的地步,這個時候推薦你們使用空模型層的概念直接進行底層數據庫操做
b) 這個空模型層只有兩種方法
一、$obj->query();
Query對查詢操做的返回是數組,對增刪改的返回是空數組
二、$obj->execute();
Execute對查詢操做的返回是查詢的記錄數,對增刪改的返回是影響行數
因此:增刪改使用execute方法,而查詢則使用query方法。
Dump函數:TP系統提供的輸出數組的方法
$obj->getLastSql():能夠輸出最後一個sql語句,能夠用他來排除咱們後期ORM語句組裝產生錯誤 別名 _sql();
或者經過打開‘SHOE_PAGE_TRACE’=>TRUE的trace調試模式中的SQL選項卡來監視數據庫操做
十一、數據庫操做
11.一、增
insertinto表 (字段列表) values(對應的數據列表),(),(),()
insertinto表 set字段1=值1,字段2=值2.......
一、模型對象->add($data)
$data:一個一維關聯數組,以鍵名做爲表字段,以數組元素值
做爲字段內容
返回值:lastInsertId
二、模型對象->addAll($data)
$data:一個二維關聯數組,以表字段做爲鍵名,以字段內容做爲數組元素值
返回值:lastInsertId
注意add和addAll獲取的lastInsertId的區別。
三、模型對象->data($data);
使用data方法來準備將要被插入表的數據
$data:一維關聯數組,與前兩條結構相同
$user->data($data)->add(); //連貫操做
吐槽聲一片,不如直接$user->add($data)這種方法。
四、模型對象->create()
幫助用戶快速過濾表單提交的數據。
Eg: $_POST = array(
‘name’=>’張三’,
‘pwd’=>」123456」
‘sub’=>註冊
)
如上述表單提交的數組中,name、pwd都是user表的字段,也是本次操做所須要操做的內容,可是sub就明顯不是數據庫字段,在操做的時候就須要排除$_POST中的sub
$data = $user->create($_POST);
若是通過create操做以後,$data = array(‘name’=>’張三’,’pwd’=>」123456」),就可 以直接做爲諸如add等方法的參數而使用了
注意:就像咱們建立的Model文件的名稱必須和代表相同同樣,
咱們建立的form的name的屬性值也應該和表的字段名相同,這樣才更符合tp的規則
11.二、 刪除
delete from表名條件
$user->where("條件")->delete(); 返回影響的記錄條數
$M->delete(主鍵值); //AR的模式操做
11.三、更新 save
update表名 set字段名=value,字段名=value,........ where條件
點擊修改----->控制器方法(經過傳值的數據的標識,獲取數據,傳入模版)----->編輯頁面(把數據填入到表單對應的位置)----->更新(標識傳入過去)------->控制方法裏面(獲取更新的數據的標識)---->更新
$user= M(‘user’);
$where = 「id=3」;
$data[‘name’] =’新名稱’//注意此時的data須要以數組形式存儲須要修改的值 區別於where
$user->where($where)->save($data);
11.四、查詢
基礎查詢
一、模型對象->find() 一條記錄轉化成一維的數據 字段名=>value
select* from表 limit 1
二、模型對象->select() 查詢全部的記錄 轉化爲一個二維的數組
條件查詢
三、單條件
模型對象->where($where)->select()
Eg: $where =」name=’張三’」;
四、多條件查詢時
模型對象->where($where)->select()
①、依舊是字符串:$where =」name=’張三’ and age=20 or.....」;
②、更傾向於使用數組
$where = array("字段1"=>值1,"字段2"=>值2)
注意:此時數組的多個條件之間是默認使用 AND來鏈接的!!而且數組條件會自動和表字段映射,過濾掉表中不存在的字段。
若是想要條件之間是OR,則須要在$where這個數組中添加一個這樣的鍵值對 「_logic」=>」or」
eg: $where = array('id'=>6,'subject'=>"測試新聞",'_logic'=>"or");
表達式查詢
五、若是條件中須要 > < != in not in between and 等查詢條件時
格式: $where[‘字段名’] = array(‘表達式’,’條件’)
Eg:查詢uid>3的信息
$where = array(‘uid’=>array(‘gt’,3));
$where = array('id'=>array('between','3,5'));
$where = array('id'=>array('notbetween','3,5'));
$where =array('id'=>array('in','1,3,5'));
$where =array('id'=>array('not in','1,3,5'));
$where =array('subject'=>array('like','%測試%'));
$where =array('subject'=>array('like',array('%測試%','%中%')));
//注意這裏like的兩個條件是用or來鏈接
$where =array('id'=>array(array('lt',2),array('gt',5),'or'));
$user->where($where)->select();
六、聚合函數的應用
Count $user->count(); 計算表中的數據條數
Sum $user->sum(‘mark’);
Max $user->max(‘mark’);
Min $user->min(‘mark’);
Avg $user->avg(‘mark’);
七、排序 order
$user->order("id desc")->select();
$user->order("id desc,name asc")->select();
$user->order(array("id"=>"desc","name"=>"asc"))->select();
八、字段篩選 field
field(「字段1,字段2」)選擇須要查詢的字段
$user->field("id,name")->select();
參2:true->取反 , false:默認
連貫操做:
$user->field("id,name")->select();
九、限制 limit()
limit(start,length);
$user->field("id,name")->order(‘idasc’)->limit(0,5)->select();
十、分頁方法
TP內置了分頁方法,用法和limit相似
Page(頁碼,每頁條數) 每頁條數默認是20條
$user->field("id,name")->order(‘idasc’)->page(1,5)->select();
可是咱們實際上用不到分頁方法,由於TP還提供了分頁類,完爆這種分頁方法
十一、分組group
Group("addr");
與group相對應的方法 還有一個having
having(); 附加的條件
$user->filed(’addr,count(addr) as num’)->having(「score>90」)->group(‘score’)->select();
十二、多表查詢 table
Table(array(‘a代表’=>’別名’,‘前綴_代表’=>’別名’))
前綴_tableName",能夠經過任何一個模型層對象去調用數據庫中任何一個表的數據內容
注意:是帶有表前綴和後綴的表名,由於在table函數中沒有增長前綴和後綴的功能
$data=M()->table(array(‘stu’=>’s’,’mark’=>m))->where(‘s.sid=m.sid’)->select();
1三、alias() :給表取別名
$M->alias(‘m’)->
1四、join方法
join()多表鏈接查詢 默認:inner join
有表前綴的表須要帶上表前綴
$M->join("表2 on表1.字段=表2.字段")......->select();
$data = M('user u')->join('messagem onu.uid=m.uid')->field("u.uname,u.addr,m.mcontent")->select();
一、默認是內鏈接,怎麼改爲左連接或者右鏈接??
二、如何進行3表或多表查詢?
$data = M('user u')->join('inner join message m onu.uid=m.uid')->join('inner join response re onu.uid=re.reuid')->field('u.uname,u.addr,m.mcontent,re.recontent')->select();
內鏈接: $m->join("inner join表2 on表1.字段 =表2.字段")->join("innerjoin表3表2.字段 =表3.字段").......->select();
右鏈接: $m->join("rightjoin表2 on表1.字段 =表2.字段")->join("right join表3 on表2.字段 =表3.字段").......->select();
11.五、TP的ORM中事務的使用
事物:
$M->startTrans():開啓事務; mysql_query("begin")
$M->commit():提交事務;
$M->rollback():回滾事務;
$M->startTrans();
$row=$M->where("id=".$id)->delete()
if($row){
$id2=$M->where("uid=".$id)->delete();
if($id2){
$M->commit();
}else{
$M->rollback();
}
}else{
$M->rollback();
}
11.六、經常使用的獲取表信息、數據庫操做信息的方法
模型對象->getDbError();//獲得程序中,數據庫操做中的錯誤 mysql_error();
模型對象->getLastSql();獲取最後一條執行的sql語句 _sql()
模型對象->getDbFields():獲得模型層中模型的數據庫某個表中 字段信息
模型對象->getModelName():獲得當前模型層中模型層名字
模型對象->getTableName():獲得當前模型層中對應的表名
模型對象->getPk();獲取當前操做數據表的主鍵名
11.七、動態查詢
getBy字段(數據):查詢某個表中有該字段值的記錄;
該查詢方式針對數據表的字段進行查詢。例如,User對象擁有id,name,email,address等屬性,那麼咱們就可使用下面的查詢方法來直接根據某個屬性來查詢符合條件的記錄。
$User= M("user");
一、$data = $User->getById(100);== $data =M("user")->where("id=100")->find();
二、$data =$User->getByName("admin");==$data= $M->where("name='admin'")->find();
十二、數據庫切換:
若是須要切換到另一個數據庫(包括在相同和不一樣的數據庫類型之間切換)或者須要鏈接多個數據庫進行操做不一樣的數據,就須要使用ThinkPHP提供的數據庫切換方法(M、db)
1. 直接連接
$m = M("表名","表前綴","數據庫類型://用戶名:密碼@服務器名:端口號/庫名");
$M =M("news","","mysql://root:@localhost/mid112");
2. 讀取配置文件切換連接
$m = M('weibo','tk_','DB_CONFIG2');
DB_CONFIG2----->config.php
"DB_CONFIG2" => array(
'db_type' => 'mysql',
'db_user' => 'root',
'db_pwd' => 'admin',
'db_host' => 'localhost',
'db_port' => '3306',
'db_name' => 'tk89'
注意:在使用切
換數據庫時,不能讓兩個庫中的表名相同,不然在查詢的時候,優先查詢本身的表,只有當默認鏈接的庫中表不存在的時候纔會查詢第二個鏈接(3.1是這樣 3.2已經優化)
1三、控制器中用獲得的常量:
echo MODULE_NAME;
echo APP_NAME; (3.1)
echo ACTION_NAME;
echo THINK_VERSION;
1四、TP的會話控制
session: 系統提供了Session管理和操做的完善支持,所有操做能夠經過一個內置的session函數完成。
默認狀況下,初始化以後系統會自動啓動session,若是不但願系統自動啓動session的話,能夠設置SESSION_AUTO_START爲false,例如:
'SESSION_AUTO_START' =>false
session賦值:Session賦值比較簡單,直接使用: session('name','value');
若是須要存儲多個值的時候,只能一個一個賦值,數組形式的賦值是對session作配置,不是存儲session信息:
session取值: $value= session('name');
session刪除 : session('name',null);//刪除name ;要刪除全部的session,可使用session(null);
session判斷: 要判斷一個session值是否已經設置,可使用 session('?name');// true|false用於判斷名稱爲name的session值是否已經設置
COOKIE: cookie()
Cookie設置 :setcookie("name",value,time,path,domain);cookie('name','value'); //設置cookie永不過時cookie('name','value',3600);//指定cookie保存時間
Cookie獲取:$value= cookie('name'); 獲取全部cookie信息$cookies = cookie();
Cookie刪除:刪除某個cookie的值,使用:cookie('name',null);要刪除全部的Cookie值,可使用cookie(null);//清空當前設定前綴的全部cookie值
1五、TP模型擴展
ThinkPHP自己提供了豐富的模型擴展,目前提供的的擴展模型包括:高級模型(AdvModel)、視圖模型(ViewModel)、關聯模型(RelationModel)和Mongo模型都是繼承Model類而且都經過了擴展完成了不少其餘的功能。
Eg:高級模型 AdvModel
ThinkPHP\Library\Think\Model
擴展高級模型的使用:
在3.2以上版本,使用擴展模型須要帶上命名空間use Think\Model\AdvModel;
①、自定義模型層的時候選擇繼承高級模型,而不是繼承基礎模型
Class UserModel extends AdvModel{}
②、讓公共模型層 CommonModel.class.php繼承高級模型
Class CommonModel extends AdvModel{}
③、經過switchModel()函數切換模型層
$User->switchModel("Adv")->top10();
④、直接經過M函數
M("AdvModel:User")->top10();
1六、幾個須要用到模型文件的功能
一、字段映射:ThinkPHP的字段映射功能可讓你在表單中隱藏真正的數據表字段,而不用擔憂放棄自動建立表單對象的功能
Class UserModel extends Model{
protected $_map = array(
// "表單控件名"=>"數據庫字段名",
"biaoti" => "title",
"neirong" => "content",
);
}
這樣,在Action中使用create方法去過濾表單數據的時候就會根據$_map去作過濾了
二、自動完成
在Model類定義 $_auto屬性,能夠完成數據自動處理功能,用來處理默認值、數據過濾以及其餘系統寫入字段。
Eg:正常的表單處理過程須要對密碼進行md5加密,在TP中,咱們就能夠完成它的自動加密。具體作法是在對應的model類中定義$_auto變量,書寫自動完成規則,這樣,在使用create()完成表單過濾的同時,就已經完成了對password字段的md5加密了。
$auto = array (
array('password','md5',1,'function') // 對password字段在新增的時候使md5函數處理
);
三、自動驗證
TP內置了數據對象的自動驗證功能來完成模型的業務規則驗證,而大多數狀況下面,數據對象是由表單提交的$_POST數據建立。須要使用系統的自動驗證功能,只須要在Model類裏面定義$_validate屬性,
protected $_validate = array(
array('verify','require','驗證碼必須!'), //默認狀況下用正則進行驗證
array('name','','賬號名稱已經存在!',0,'unique',1), // 在新增的時候驗證name字段是否惟一
array('value',array(1,2,3),'值的範圍不正確!',2,'in'), // 當值不爲空的時候判斷是否在一個範圍內
array('repassword','password','確認密碼不正確',0,'confirm'), // 驗證確認密碼是否和密碼一致
array('password','checkPwd','密碼格式不正確',0,'function'), // 自定義函數驗證密碼格式
);
定義好了$_validate以後,在進行create操做的時候,就會對錶單的數據進行自動驗證。若是驗證失敗,則create()返回false,能夠經過模型對象->getError()的方法捕獲驗證失敗的反饋信息
Eg:
$article = D("Article");
$data =$article->create();
if (!data){
//若是建立失敗表示驗證沒有經過輸出錯誤提示信息
exit($article->getError());
}else{
dump($data);
//驗證經過能夠進行其餘數據操做
}
1七、thinkphp中ajax操做:
_param()
1) IS_AJAX,IS_POST,IS_GET:判斷標籤或者數據提交方式,
IS_AJAX:若是數據提交方式,是按照ajax提交方式提交的,那麼他會返回正確,不然,返回錯誤.
2) ajax返回,返回的都是json數據:
ajaxReturn($data):返回ajax提交的結果
$data指返回的數據。
該數據能夠是字符串,數值,或者數組
都會被ajaxreturn轉換成JSON對象,方便前端jq,js操做。
3) ajax返回中也可使用: success()和error().
Eg: $this->seccess(「yes」,」Index/index」);
AJAX獲取的返回信息:{"info":"yes","status":1,"url":"Index\/index"}
若是是error()的話,獲取到的status則爲0
4)設置ajax返回的數據樣式配置:
'DEFAULT_AJAX_RETURN' =>'JSON', //默認AJAX數據返回格式,可選JSON XML ...
1八、數據分頁:第三方的分頁類 page類
F:\wamp\www\2015112\tp\ThinkPHP\Library\Think\page.class.php (第三方類庫的使用)
1、利用Page類和limit方法
$page = new \Think\Page(總記錄數,每頁顯示條數);
$User = M('User');//實例化User對象
$count = $User->where('status=1')->count();//查詢知足要求的總記錄數
$Page =new \Think\Page($count,25);//實例化分頁類 傳入總記錄數和每頁顯示的記錄數(25)
$show = $Page->show();//分頁顯示輸出
// 進行分頁數據查詢 注意limit方法的參數要使用Page類的屬性
$list =$User->where('status=1')->order('create_time')->limit($Page->firstRow.','.$Page->listRows)->select();
$this->assign('list',$list);//賦值數據集
$this->assign('page',$show);//賦值分頁輸出
$this->display();//輸出模板
2、分頁樣式定製
private $config =array(
'header' =>'<span class="rows">共 %TOTAL_ROW%條記錄</span>',
'prev' => '<<',
'next' => '>>',
'first' => '1...',
'last' => '...%TOTAL_PAGE%',
'theme' =>'%FIRST%%UP_PAGE%%LINK_PAGE%%DOWN_PAGE%%END%',
);
3、實例
注意:使用limit方法的時候,參數必須是page類的成員變量
1九、驗證碼:
一、生成驗證碼
$Verify = new \Think\Verify();
$Verify->entry();
二、驗證碼的顯示:
Img標籤的src屬性值直接設置爲生成驗證碼的方法便可
Eg: <img src="{:U('Home/User/verify')}" id="yzm">
注意:驗證碼生成以後 是直接加密以後存儲在session中的,且默認設置包含驗證碼有效時間1800S和驗證成功以後,session存儲的驗證碼信息直接清空
四、驗證碼配置
$config=array{
'useImgBg' => false, //使用背景圖片
'fontSize' => 25, //驗證碼字體大小(px)
'useCurve' => true, //是否畫混淆曲線
'useNoise' => true, //是否添加雜點
'imageH' => 0, //驗證碼圖片高度
'imageW' => 0, //驗證碼圖片寬度
'length' => 5, //驗證碼位數
'fontttf' => '', //驗證碼字體,不設置隨機獲取
'bg' => array(243, 251, 254), //背景顏色
'reset' => true, //驗證成功後是否重置
);
注意:
一、若是圖片出不來,試試將ob_end_clean()添加到實例化對象以前
二、不要使用其中的imageH和imageW,如需改變大小直接經過CSS操做<img>
三、中文驗證碼須要字體文件,若是中文不顯示,請檢查ThinkPHP\Library\Think\Verify\zhttfs中是否包含了中文字體文件
三、驗證驗證碼:
使用ajax調用Verify類的Check方法便可!
<script>
functioncheck(){
var val= $(".verify").val();
var data ="verify="+val;
$.post("{:U('Home/User/check_verify')}",data,function(re){
if(re==true){
$(".verify").css("border","1px solidgreen");
}else{
$(".verify").css("border","1px solidred");
}
})
}
$(".verify").blur(check);
$("#yzm").click(function(){
var num =Math.random();
var url ="{:U('Home/User/verify/asd/"+num+"')}";
$(this).attr("src",url);
check();
})
</script>
</div>
注意:驗證碼刷新功能須要帶上一個隨機數,以保證不會讀取ajax緩存致使沒法刷新
20、文件上傳: Library/ORG/Net/UploadFile.class.php 文件上傳類
一、引入並使用
$upload = new\Think\Upload($config);
$info=$upload->uploadOne($_FILES['photo']);單文件上傳
$info=$upload->upload(); //多文件上傳
注意:
一、使用upload方法不須要任何參數,可是使用uploadOne方法,須要帶上上傳文件的信息
二、上傳以後將會返回上傳的文件的存儲信息
Dump($info)查看文件信息
二、上傳配置:
$config = array(
'mimes' => array(), //容許上傳的文件MiMe類型
'maxSize' => 0, //上傳的文件大小限制 (0-不作限制)
'exts' => array(), //容許上傳的文件後綴
'autoSub' => true, //自動子目錄保存文件
'subName' => array('date', 'Y-m-d'), //子目錄建立方式,[0]-函數名,[1]-參數,多個參數使用數組
'rootPath' => './Uploads/', //保存根路徑
'savePath' => '', //保存路徑
'saveName' => array('uniqid', ''), //上傳文件命名規則,[0]-函數名,[1]-參數,多個參數使用數組
'saveExt' => '', //文件保存後綴,空則使用原後綴
'replace' => false, //存在同名是否覆蓋
'hash' => true, //是否生成hash編碼
'callback' => false, //檢測文件是否存在回調,若是存在返回文件信息數組
'driver' => '', //文件上傳驅動
'driverConfig' => array(), //上傳驅動配置
);
2一、獲取ip:
系統提供了直接獲取IP的函數
$ip = get_client_ip();
若是想要獲取ip地址所在區域,
$Ip = new\Org\Net\IpLocation('UTFWry.dat');//實例化ipLocation類參數表示IP地址庫文件
$area = $Ip->getlocation($ip); //獲取某個IP地址所在的位置
print_r($area);
UTFWry.dat下載地址:http://www.thinkphp.cn/extend/270.html
解壓以後放在和IpLocation類同級目錄
2二、項目分組:
對模塊的訪問是自動判斷的,因此一般狀況下無需配置模塊列表便可訪問,在部署模塊的時候,默認狀況下都是基於相似於子目錄的URL方式來訪問模塊的,例如:
http://serverName/Home/New/index//訪問Home模塊http://serverName/Admin/Config/index //訪問Admin模塊http://serverName/User/Member/index//訪問User模塊
一、設置項目中容許的模塊
若是咱們須要設置分組的話,須要手動更改tp\Application\Common\Conf\congfig.php,添加以下配置:
'MODULE_ALLOW_LIST'array'Home''Admin''User' => (,,),
'DEFAULT_MODULE''Home'// 默認模塊 => ,
二、拒絕訪問模塊
若是你的應用有不少的模塊,你只是想禁止訪問個別模塊的話,能夠配置禁止訪問的模塊列表(用於被其餘模塊調用或者不開放訪問),默認配置中是禁止訪問Common模塊和Runtime模塊(Runtime目錄是默認的運行時目錄),咱們能夠增長其餘的禁止訪問模塊列表:
// 設置禁止訪問的模塊列表
'MODULE_DENY_LIST'array'Common''Runtime''User' => (,,),
三、模塊映射
若是不但願用戶直接訪問某個模塊,能夠設置模塊映射(對後臺的保護會比較實用)。
'URL_MODULE_MAP'array'test''admin' => (=>),
注意:這裏的映射指的是,隱藏admin模塊,訪問admin模塊表面上體現的是訪問test模塊,設置了模塊映射後,原來的Admin模塊將不能訪問,只能訪問test模塊。
咱們訪問 http://serverName/Admin將會報模塊不存在的錯誤,而 http://serverName/test 則能夠正常訪問Admin模塊。
若是你同時還設置了MODULE_ALLOW_LIST參數的話,必須將容許模塊列表中的原來的模塊改爲映射後的模塊名,例如:
'MODULE_ALLOW_LIST'array'Home''Test''User' => (,,),
'DEFAULT_MODULE''Home' => ,
'URL_MODULE_MAP'array'test''admin' => (=>),
問題:
Q:加入作了模塊映射,那麼超連接跳轉地址寫映射前仍是映射後?
A:依然是映射前,會自動映射。好比,把Admin影射成Test,可是實際寫的U用的依然是Admin
函數:
A函數 控制器之間的調用
D函數 D函數用於實例化Model對象(模型文件必須存在)
M函數 M函數用於實例化一個沒有模型文件的Model
C函數 配置文件操做
U函數 Url生成
S函數 數據緩存
F函數 文件緩存
I函數
$uname =I("get.password","","trim,md5"); //能夠設置多個過濾規則
session函數
cookie函數