文章出處

php框架

一、真實項目開發步驟:

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

 

二、問題:

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

2. 代碼風格不一樣,后期維護十分困難

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

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

 

三、其他相關框架

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

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

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

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

 

四、什么框架:

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

       框架可以節省我們50-60%的工作量,我們全部精力都集中在業務層次。

 

五、為什么使用框架

(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”)  查詢主鍵值在10、12、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)


文章列表


不含病毒。www.avast.com
arrow
arrow
    全站熱搜

    大師兄 發表在 痞客邦 留言(0) 人氣()