ThinkPHP框架知識(比較全的知識)

php框架javascript

1、真實項目開發步驟:php

  1. 多人同時開發項目,協做開發項目、分工合理、效率有提升(代碼風格不同、分工很差)
  2. 測試階段
  3. 上線運行
  4. 對項目進行維護、修改、升級(單我的維護項目,十分困難,代碼風格不同)
  5. 項目穩定的運行階段
  6. 項目中止運行(舊項目的人員已經所有離職,新人開發新項目)

 

2、問題:html

1. 多人開發項目,分工不合理,(html   php   mysql)java

2. 代碼風格不同,後期維護十分困難mysql

3. 項目生命週期十分短,項目生命沒有延續性,形成資源浪費、人員浪費jquery

4. 項目不能很好適應客戶需求,牽一髮而動全身。sql

 

3、其餘相關框架thinkphp

1. zendframework   zend php語言公司發佈的官方框架,重量級(功能多)數據庫

2. yii   美國華人開發的框架,xue qiang, qiang,  重量級框架,純OOP框架windows

3. CI  CodeIgniter輕量級框架,開發速度快,部署靈活

  1. cakephp外國框架,重量級,速度慢
  2. symfony外國重量級框架
  3. ThinkPHP輕量級框架,國人框架,入門容易

 

4、什麼框架:

       一堆代碼的集合,裏邊有變量、函數、類、常量,裏邊也有許多設計模式MVC、AR數據庫、單例等等。

       框架能夠節省咱們50-60%的工做量,咱們所有精力都集中在業務層次。

 

5、爲何使用框架

(1)框架能夠幫組咱們快速、穩定、高效搭建程序系統

(2)該系統因爲框架的使用使得自己的維護性、靈活性、適應客戶需求方面獲得最大化的加強。

(3)使用框架的過程當中可使得咱們的注意力所有集中業務層面,而無需關心程序的底層架構。

 

【使用框架】

thinkphp.cn

 

thinkphp 3.2版本

 

【框架項目部署】

部署一個Shop項目,使用tp框架

步驟:

建立入口文件:

  1.在ThinkPHP目錄下建立一個入口文件index.php

       

  2.訪問入口文件的同時系統會自動把對應的應用目錄文件Shop建立出來

   

  3.打開Home文件夾

   

【MVC模式】

M:Model 數據模型層,負責數據操做

V:View 視圖層,負責顯示視圖

C:Controller 控制器,實現業務邏輯

 

 

【控制器訪問及路由解析】

經過url地址get參數找到指定的控制器,並進行對應方法調用請求

http://網址/index.php?m=模塊名稱&c=控制器&a=方法

以上url地址信息代碼不夠優雅、不安全。

 

tp框架url地址能夠由如下四種

  1. http://網址/index.php?m=XX&c=XX&a=XX   基本get模式
  2. http://網址/index.php/模塊/控制器/操做方法路徑模式pathinfo
  3. http://網址/模塊/控制器/操做方法           rewrite重寫模式
  4. http://網址/index.php?s=/模塊/控制器/方法兼容模式

 

具體url地址模式設置(配置文件ThinkPHP/Conf/convertion.php)

URL_MODEL  =  0/1/2/3  分別表明四種url地址模式

 

config.php是咱們當前本身項目的配置文件,咱們能夠經過修改該文件達到配置變量的目錄

這個文件在系統運行過程當中會覆蓋convertion.php的配置變量

include 「convertion.php」;

include 「config.php」;  後引入的文件要把先引入的文件配置變量給覆蓋掉

 

咱們系統有兼容4中url地址模式的使用

系統有的時候會自動建立url地址,它會根據當前模式進行url地址建立使用

快捷函數U();  建立url地址

  

經過url地址模式咱們學習到了如下內容:

  1. 咱們學習到了配置變量(核心配置變量conversion.php、當前應用配置變量config.php)
  2. 快捷函數U(「模塊/控制器/方法」)  根據參數和url模式建立對應的url地址
  3. 把框架的模式調整爲開發調試模式

 

【開發、生產模式】

開發調試模式:系統須要加載大概24個文件  index.php  define(「APP_DEBUG」,true);

生產模式:系統只須要加載不多的大概7個文件在入口文件

index.php中定義: define(「APP_DEBUG」,false);

節省了許多文件的開發、關閉的系統開銷,節省資源

 

 

要在頁面顯示trace信息,須要在本身的配置文件中:

 

【控制器和對應方法建立】

控制器是MVC模式中的核心,tp默認有一個Index控制器:

 

Index控制器裏面有一個操做方法:Index

 

咱們在訪問http://localhost:8080/Thinkphp/index.php入口文件的時候,會默認訪問Index控制器下面的Index方法

 

若是要本身建立一個控制器Login:

  1.在\Shop\Home\Controller文件夾下新建一個控制器文件LoginController.class.php

注意:文件命名規則,按照駝峯法命名

 

  2.打開該文件,在裏面造控制器Login類

 

  3.若是要自定義操做方法,在控制器Login類裏面加一個函數Login():

 

這樣咱們就完成了控制器和操做方法的創建,若是要訪問咱們剛纔的Login控制器下的Login方法:

 

  4.控制器中若是要調用視圖層中的模板:

 

 

這樣再次訪問,會發現報錯:

 

 

緣由:模板文件沒有建立,這時候咱們就要去建立模板文件

 

【視圖模板文件建立】

視圖模板文件存放發位置在:

 

 

裏面沒有模板文件

若是咱們想要訪問Login控制器中的Login方法,首先咱們要建立一個Login控制器對應的模板文件夾,該文件夾就對應着Login控制器:

 

 

而後在Login文件夾下再建立一個login.html的模板文件來對應Login控制器下的Login方法:

 

 

在login.html裏面寫入要顯示的代碼:

 

 

而後再次請求:

 

【url地址大小寫設置】

默認是不敏感的:

在config.php裏邊對url大小寫敏感進行設置

 

 

【空操做和空控制器處理】

空操做:就沒有指定的操做方法

空控制器:沒有指定控制器

http://網址/index.php/Home/User/login

http://網址/index.php/Home/User/hello空操做

http://網址/index.php/Home/beijing/login   空控制器

空操做:

 

 

通常網站處於安全考慮不給用戶提示任何錯誤信息

       「空操做」本質意思:一個對象(控制器)調用自己不存在的方法

       在OOP裏邊,對象調用自己不存在方法,處於用戶體驗比較好的角度考慮,咱們能夠在類裏邊製做一個魔術方法:function __call();

 

在tp裏面控制器的父類:

 

 

父類中有個方法:

 

 

因此空操做有兩種解決方案:

①     在對應的控制器裏邊製做一個方法,名稱爲」_empty」,這個控制器的空操做都會自動執行該方法。(推薦使用)

②     給空操做的名稱制做一個同名的模板出來,系統會自動調用

 

空控制器:

 

 

空控制器:在實例化控制器對象的時候,沒有找到指定的類

何時實例化控制器對象:ThinkPHP/Library/Think/App.class.php

熟記文件:

              index.php  入口文件

              ThinkPHP/ThinkPHP.php  框架核心文件

              ThinkPHP/Library/Think/Think.class.php  框架核心文件

              ThinkPHP/Library/Think/App.class.php  框架應用文件

在App.class.php內部包括控制器對象建立,以及對象調用指定的方法呈現內容:

 

 

空控制器處理方案:能夠再製做一個控制器,名稱EmptyController.class.php

在該控制器內部其實只須要製做一個_empty()方法便可。

 

這樣再次請求:

 

【項目分組】

系統有前臺用戶操做界面

系統還有後臺供公司內部人員使用維護平臺

二者在使用的過程當中就是對「控制器」、「視圖模板」、「model模型」的操做。

爲了系統開發方便,及代碼部署更加合理,咱們的控制器、view視圖等先後臺文件不要混在起,要在物理結構上給分開

 

http://網址/index.php/Home/控制器/操做方法訪問Home控制器及制定操做

http://網址/index.php/Admin/控制器/操做方法訪問Admin分組的控制器和操做方法

 

【系統常量信息】

獲取系統常量信息:

 

若是加參數true,會分組顯示:

 

【跨控制器調用】

一個控制器在執行的時候,能夠實例化另一個控制,並經過對象訪問其指定方法。

跨控制器調用能夠節省咱們代碼的工做量

在Main控制器中有一個Info操做方法

 

 

 

想要在其它控制器,好比Login中調用,咱們能夠實例化控制器對象,調用裏面的方法便可:

 

 

 

造對象有快捷函數供咱們使用:

A(「[模塊/]控制器標誌」) 實例化控制器對象

 

 

R([模塊/]控制器標誌/操做方法)  實例化對象同時調用指定方法

 

【鏈接數據庫配置及Model數據模型層】

convertion.php

config.php

  1.在config.php作數據庫鏈接配置

 

  2.製做model模型

a)         model自己就是一個類文件

b)        數據庫中的每一個數據表都對應一個model模型文件

c)         最簡單的數據model模型類

 

  3.字段緩存設置

tp框架執行過程當中會使用到數據表中的字段信息,經過sql語句能夠查詢」show colums from table」,處於性能考慮,能夠把字段緩存,避免每次重複執行sql語句。

  4.能夠根據狀況對當前的model模型進行個性化設置

 

 

實例化Model的三種方式:

  1. $goods =  new  命名空間GoodsModel(); 
  2. $goods = D(‘模型標誌’);   

a)         $goods = D(「Goods」);

b)        該$goods是父類Model的對象,可是操做的數據表仍是sw_goods

c)         $obj = D();  實例化Model對象,沒有具體操做數據表,與M()方法效果一致

  1. $obj = 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

 

注意:若是沒有對應的model模型文件類,也能夠直接實例化model對象進行操做

D()和M()方法均可以實例化操做一個沒有具體model模型類文件的數據表。

【數據查詢】

select()是數據模型的一個指定方法,能夠得到數據表的數據信息

       返回一個二維數組信息,當前數據表的所有數據信息

$obj = D();  建立對象

$obj -> select();  查詢數據

select  字段,字段  from  表名  where 條件  group 字段 having  條件   order 排序  limit 限制條數;

SELECT%DISTINCT%%FIELD%FROM %TABLE%%JOIN%%WHERE%%GROUP%%HAVING%%ORDER%%LIMIT% %UNION%%COMMENT%

 

$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([偏移量,]條數)  限制查詢的條數

 

sql語句裏邊具體的條件設置在tp框架model模型裏邊體現爲具體的方法操做

 

以上方法理論上是父類Model的對應方法

父類model具體存在方法:field()  where()   limit()

還有一些方法在__call()自動調用函數裏邊: table()  group()  order()  having()

       在__call()魔術方法裏邊會判斷當前的執行方法是不是一個method屬性的元素信息,若是存在就會執行執行。

 

以上多個方法是同時使用多個進行條件顯示(而且沒有順序要求)

$obj -> limit(5)->field(‘id,name’)->order(‘price asc’) -> table(‘sw_goods’)->select();

以上許多方法執行沒有順序要求,許多方法執行後都是把具體的參數賦予到model屬性options裏邊,最後根據options拼裝sql語句。

 

 

$info = $goods -> where()->field(字段)->select();

select()方法

1.    返回一個二維數組信息

2.    返回所有數據表信息

3.    給該方法傳遞參數

a)         select(30)  查詢主鍵值等於30的記錄信息

b)        select(「10,12,14」)  查詢主鍵值在十、十二、14範圍的記錄信息

4.find()若是咱們查詢的結果只有一個信息,使用select()會返回一個二維數組

爲了使用方便咱們會但願返回一個一維數組,這時候可以使用find()方法

 

5.having()方法設置查詢條件,where()設置查詢條件

6. 相關聚合函數 count()  sum()   avg()   max()   min()

       以上聚合函數是最後被調用的方法

       以上方法能夠結合具體條件方法使用

       例如:$goods -> where(‘goods_price >1000’)->count(); 大於1000元的商品的總數目

 

【數據添加】

add()該方法返回被添加的新記錄的主鍵id值

兩種方式實現數據添加

1.數組方式數據添加

$goods = D(「Goods」);

$arr = array(‘goods_name’=>’iphone5s’,’goods_weight’=>’109’);

//注意:goods_name和goods_weight是數據表中字段名稱

$goods -> add($arr);

 

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值返回

 

【收集表單數據入庫操做】

  1. 製做一個表單
  2. 經過$_POST收集信息
  3. 經過create()方法實現數據收集,該方法對於非法的字段會自動進行過濾

注意:一個add控制器實現兩個邏輯,一個是打出添加頁面,一個是向數據庫添加內容

 

 

注意:若是是主鍵值重複,這種錯誤會致使error()方法不跳轉頁面直接拋出錯誤信息,這是新版本問題,若是想要跳轉,找到

 

 

【數據修改操做】

save()  實現數據修改,返回受影響的記錄條數

具體有兩種方式實現數據修改,與添加相似(數組、AR方式)

  1.數組方式

a)         $goods = D(「Goods」);

b)        $ar = array(‘goods_id’=>100,‘goods_name’=>’lenovo手機’,’goods_price’=>1200);

c)         $goods ->where(‘goods_id>50’)-> save($ar);

  2.AR方式

a)         $goods = D(「Goods」);

b)        $goods -> goods_id = 53;

c)         $goods -> goods_name = 「三星手機」;

d)        $goods -> goods_price = 2000;

e)         $goods ->where(‘goods_price>10000’)->save();

以上兩種方式若是可行,即要修改所有數據

以上sql語句從技術上可行,從業務上不可行(事故)

tp框架有智能考慮,以上狀況的sql語句不被容許執行。

如何執行:

①     明確告訴系統那條sql語句被update更新

②     能夠設置where進行sql語句更新操做

 

save()  方法返回值

0:以前沒有問題,執行先後數據沒有變化

天然數:受影響的記錄條數

false:執行失敗

 

數據修改具體實現:

經過路由給一個操做方法傳遞參數

http://網址/index.php/模塊/控制器/方法upd/變量名1/值/變量名2/值/變量名3/值

以上路由是經過get形式給指定的操做傳遞了三個參數信息

$_POST方式也能夠

原則三個參數信息接收的時候經過$_GET接收便可

例如:$_GET[‘變量名1’];

 

以上參數信息接收太直白,不安全,須要按照框架規則使用下邊的方式接收get參數信息

http://網址/index.php/Admin/Goods/upd/name/tom/age/25/addr/beijing

function upd($name,$age,$addr){

       $name;

       $age;

       $addr;

}

以上參數表述,若是在請求的時候沒有按照規則傳遞參數,那麼當前方法禁止訪問。

(除非參數有默認值)

 

修改商品信息步驟:

  1. 在「修改」按鈕處把被修改商品id信息經過get形式傳遞給upd操做
  2. 在upd方法裏邊製做形式參數$goods_id,接收服務器給傳遞的get變量goods_id
  3. 在修改表單裏邊製做隱藏域goods_id,避免tp框架禁止修改語句執行
  4. 在upd操做方法內部有兩個邏輯:展示表單、收集表單

 

 

【數據刪除及執行原生sql語句】

delete()返回受影響的記錄條數

$goods -> delete(30);   刪除主鍵值等於30的記錄信息

$goods -> delete(「10,12,13」);   刪除主鍵值等於10 12 13的三條記錄

$goods -> where(「goods_id>60」)->delete()   把符合條件的記錄都給刪除

 

 

執行原生sql語句

  1. 查詢語句query()  返回一個二維數組信息
  2. 添加、修改、刪除 execute()  返回受影響的記錄條數

$goods = D(「Goods」);

$sql = 「select * from sw_goods」;

$rst = $goods ->query($sql);

 

$sql = 「select goods_category_id,avg(goods_price) from sw_goods group by goods_category_id having  avg(goods_price)>1000」;

$goods ->query($sql);

 

$sql = 「update sw_goods set goods_name = ‘htc_two’ where goods_id=100」;

$goods ->execute($sql);

 

【表單驗證】

javascript

jquery 

在服務器端經過tp框架實現表單驗證

用戶名、密碼、重複密碼、郵箱、qq、手機號碼、愛好、學歷

具體步驟:

  1. 製做表單
  2. 表單form數據經過create()方法收集(驗證功能要求咱們必須經過create()方法收集數據)
  3. 自定義數據model模型類實現具體驗證規則

 

 

 

【tp框架驗證碼支持使用】

ThinkPHP/Library/Think/Verify.class.php

$verify = new 命名空間Verify();

$verify -> entry();  生成一個驗證碼

 

一個單獨的方法生成驗證碼

 

 

在模板使用:

 

 

驗證是否成功:

 

 

【Session和Cookie】

tp框架關於session操做(cookie)

//session(name,value, 有效時間)  設置session

//session(name)  獲取session

//session(name,null)  刪除指定session

//session(null)  清空所有session

 

【tp框架實現數據分頁】

  1.咱們第三方類庫放的位置:

當前模塊(Home)目錄下,模塊中的類庫命名空間的根都是以模塊名命名

ThinkPHP/Library/目錄下,根命名空間爲ThinkPHP/Library

  2.ThinkPHP/Library/Think/下面有不少類庫供咱們使用

  3.類的命名規則:要有命名空間,類文件名 Page.class.php

 

  4.在控制器中實例化分頁類使用:

 

模板頁面:

 

 

【tp框架擴展函數庫】

三個位置:

  1. ThinkPHP/Common/functions.php
  2. 應用/Common/Common/function.php
  3. 模塊/Common/function.php

在該文件裏面寫自定義方法便可

 

【tp框架文件上傳中文亂碼問題】

在windows操做系統下:

在ThinkPHP/Library/Think/Upload/Driver/Local.class.php

第83行將$filename 改成iconv('utf-8','gb2312',$filename)

相關文章
相關標籤/搜索