php框架javascript
1、真實項目開發步驟:php
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輕量級框架,開發速度快,部署靈活
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地址能夠由如下四種
具體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地址模式咱們學習到了如下內容:
【開發、生產模式】
開發調試模式:系統須要加載大概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的三種方式:
a) $goods = D(「Goods」);
b) 該$goods是父類Model的對象,可是操做的數據表仍是sw_goods
c) $obj = D(); 實例化Model對象,沒有具體操做數據表,與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值返回
【收集表單數據入庫操做】
注意:一個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;
}
以上參數表述,若是在請求的時候沒有按照規則傳遞參數,那麼當前方法禁止訪問。
(除非參數有默認值)
修改商品信息步驟:
【數據刪除及執行原生sql語句】
delete()返回受影響的記錄條數
$goods -> delete(30); 刪除主鍵值等於30的記錄信息
$goods -> delete(「10,12,13」); 刪除主鍵值等於10 12 13的三條記錄
$goods -> where(「goods_id>60」)->delete() 把符合條件的記錄都給刪除
$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、手機號碼、愛好、學歷
具體步驟:
【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框架擴展函數庫】
三個位置:
在該文件裏面寫自定義方法便可
【tp框架文件上傳中文亂碼問題】
在windows操做系統下:
在ThinkPHP/Library/Think/Upload/Driver/Local.class.php
第83行將$filename 改成iconv('utf-8','gb2312',$filename)