php框架javascript
真實項目開發步驟:php
問題:html
1. 多人開發項目,分工不合理,(html php mysql)java
2. 代碼風格不同,後期維護十分困難mysql
3. 項目生命週期十分短,項目生命沒有延續性,形成資源浪費、人員浪費jquery
4. 項目不能很好適應客戶需求,牽一髮而動全身。sql
其餘相關框架thinkphp
1. zendframework zend php語言公司發佈的官方框架,重量級(功能多)數據庫
2. yii 美國華人開發的框架,xue qiang, qiang, 重量級框架,純OOP框架設計模式
3. CI CodeIgniter 輕量級框架,開發速度快,部署靈活
什麼框架:
一堆代碼的集合,裏邊有變量、函數、類、常量,裏邊也有許多設計模式MVC、AR數據庫、單例等等。
框架能夠節省咱們50-60%的工做量,咱們所有精力都集中在業務層次。
爲何使用框架
l 框架能夠幫組咱們快速、穩定、高效搭建程序系統
l 該系統因爲框架的使用使得自己的維護性、靈活性、適應客戶需求方面獲得最大化的加強。
l 使用框架的過程當中可使得咱們的注意力所有集中業務層面,而無需關心程序的底層架構。
thinkphp.cn
thinkphp 3.2版本
部署一個Shop項目,使用tp框架
步驟:
建立入口文件:
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:
注意:文件命名規則,按照駝峯法命名
這樣咱們就完成了控制器和操做方法的創建,若是要訪問咱們剛纔的Login控制器下的Login方法:
這樣再次訪問,會發現報錯:
緣由:模板文件沒有建立,這時候咱們就要去建立模板文件
視圖模板文件存放發位置在:
裏面沒有模板文件
若是咱們想要訪問Login控制器中的Login方法,首先咱們要建立一個Login控制器對應的模板文件夾,該文件夾就對應着Login控制器:
而後在Login文件夾下再建立一個login.html的模板文件來對應Login控制器下的Login方法:
在login.html裏面寫入要顯示的代碼:
而後再次請求:
默認是不敏感的:
在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([模塊/]控制器標誌/操做方法) 實例化對象同時調用指定方法
convertion.php
config.php
a) model自己就是一個類文件
b) 數據庫中的每一個數據表都對應一個model模型文件
c) 最簡單的數據model模型類
tp框架執行過程當中會使用到數據表中的字段信息,經過sql語句能夠查詢」show colums from table」 ,處於性能考慮,能夠把字段緩存,避免每次重複執行sql語句。
實例化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範圍的記錄信息
爲了使用方便咱們會但願返回一個一維數組,這時候可以使用find()方法
6. 相關聚合函數 count() sum() avg() max() min()
以上聚合函數是最後被調用的方法
以上方法能夠結合具體條件方法使用
例如:$goods -> where(‘goods_price >1000’)->count(); 大於1000元的商品的總數目
add() 該方法返回被添加的新記錄的主鍵id值
兩種方式實現數據添加
$goods = D(「Goods」);
$arr = array(‘goods_name’=>’iphone5s’,’goods_weight’=>’109’);
//注意:goods_name和goods_weight是數據表中字段名稱
$goods -> add($arr);
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方式)
a) $goods = D(「Goods」);
b) $ar = array(‘goods_id’=>100,‘goods_name’=>’lenovo手機’,’goods_price’=>1200);
c) $goods ->where(‘goods_id>50’)-> save($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;
}
以上參數表述,若是在請求的時候沒有按照規則傳遞參數,那麼當前方法禁止訪問。
(除非參數有默認值)
修改商品信息步驟:
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、手機號碼、愛好、學歷
具體步驟:
ThinkPHP/Library/Think/Verify.class.php
$verify = new 命名空間Verify();
$verify -> entry(); 生成一個驗證碼
一個單獨的方法生成驗證碼
在模板使用:
驗證是否成功:
tp框架關於session操做(cookie)
//session(name,value, 有效時間) 設置session
//session(name) 獲取session
//session(name,null) 刪除指定session
//session(null) 清空所有session
當前模塊(Home)目錄下,模塊中的類庫命名空間的根都是以模塊名命名
ThinkPHP/Library/目錄下,根命名空間爲ThinkPHP/Library
2.
在ThinkPHP/Library/Think/
下面有很+多類庫供咱們使用
模板頁面: