在項目開發中,一些架構和代碼都是重複的,爲了不重複勞動,因而各類各樣的框架誕生了。javascript
在PHP開發中,選擇合適的框架有助於加快軟件開發,節約寶貴的項目時間,讓開發者專一於功能的實現上。因爲流行的框架通過了大量項目的檢驗,因此使用框架還有助於建立更加穩定和安全的應用程序。php
1.經過路由給一個操做方法傳遞參數css
http://網址/index.php/模塊/控制器/方法upd/變量名1/值/變量名2/值/變量名3/值 html
以上路由是經過get形式給指定的操做傳遞了三個參數信息java
原則三個參數信息接收的時候經過$_GET接收便可mysql
例如:$_GET[‘變量名1’]; include()jquery
以上參數信息接收太直白,不安全,須要按照框架規則使用下邊的方式接收get參數信息sql
http://網址/index.php/Admin/Goods/upd/name/tom/age/25/addr/beijing數據庫
function upd($name,$age,$addr){編程
$name;
$age;
$addr;
}
以上參數表述,若是在請求的時候沒有按照規則傳遞參數,那麼當前方法禁止訪問。
(除非參數有默認值)
2.修改商品信息步驟:
1. 在「修改」按鈕處把被修改商品id信息經過get形式傳遞給upd操做
2. 在upd方法裏邊製做形式參數$goods_id,接收服務器給傳遞的get變量goods_id
3. 在修改表單裏邊製做隱藏域goods_id,避免tp框架禁止修改語句執行
4. 在upd操做方法內部有兩個邏輯:展示表單、收集表單
2.要驗證的表單:用戶名、密碼、重複密碼、郵箱、qq、手機號碼、愛好、學歷
3.具體步驟:
1. 製做表單
2. 表單form數據經過create()方法收集(驗證功能要求咱們必須經過create()方法收集數據)
3. 自定義數據model模型類實現具體驗證規則
注意:
1.一次性得到所有驗證錯誤
2.爲同一個項目設置多個驗證。
3.若是出錯,顯示提示:
如:郵箱:格式不正確。
qq:都是數字的,長度5-10位,首位不爲0。---正則:/^[1-9]\d{4,9}$/。qq格式不正確
手機:
性別不用驗證,默認有一個選項
學歷必須選擇一個(下拉框):
愛好:複選框(至少選擇一項)
4.數組--元素的個數
5.這些基礎知識到任什麼時候候都用獲得。
【內容回顧】
1. 3種實例化model模型方法
a) new 命名空間GoodsModel();
b) D([「模型標誌Goods」]) (以前版本會實例化自定義model對象,目前都實例化Model基類對象)
i. 沒有參數實例化一個Model對象、有參數也實例化一個Model對象操做goods數據表
c) M([「模型標誌Goods」])
i. 沒有參數實例化一個Model對象、有參數也實例化一個Model對象操做goods數據表
2. 數據庫查詢及連貫操做查詢
a) select()
b) select(10) 主鍵值等於10的記錄
c) select(「20,21,22」) 主鍵值 in 20,21,22 的三條記錄
d) find(4) 主鍵值等於4的記錄
e) select()方法返回二維數組,find方法返回一維數組
f) 連貫操做查詢方法:
g) field() where() limit() 父類Model已經定義好的方法
h) table() group() order() group() having() 統一在魔術方法__call()裏邊聲明
i) 以上方法能夠連續操做執行,使用沒有順序要求
j) $obj -> limit(5)->where(‘price>100’)->order(‘id desc’)->select();
3. 聚合函數使用
a) count() sum() max() min() avg()
b) 以上方法也是在Model的魔術方法__call()裏邊定義
4. 添加數據記錄add()
a) 兩種方式:數組、AR操做
5. 修改數據信息save
a) 兩種方式:數組、AR操做
b) 注意:爲了修改爲功必須有兩個條件之一被設置
i. 信息裏邊有主鍵值id值被修改
ii. 能夠經過where設置具體哪些記錄被修改
6. 刪除數據delete
a) $goods -> delete(10) 主鍵值等於10的記錄信息
b) $goods -> delete(「10,12,13」) 刪除三條記錄主鍵值 in 10,12,13 -------------字符串
c) $goods -> where(‘id>100’)->delete() id>100的記錄都被刪除-------------where條件
7. 原生sql語句執行
a) query() 執行查詢語句,返回二維數組信息
b) execute() 執行增長、修改、刪除,返回受影響的記錄數目,返回false表示sql語句有錯誤,返回0表示sql語句 執行先後對數據沒有改變
8. 表單驗證
a) 在自定義模型裏邊重寫$_validate
b) $_validate屬性定義時一個數組信息,內部每一個小的單元仍是一個數組
c) array(字段,驗證規則,錯誤提示,驗證條件,附加規則,驗證時間)
d) 驗證規則:require、email
e) 驗證條件:
i. 0 字段在$_POST裏邊存在就驗證
ii. 1 必須驗證
iii. 2 值不爲空才驗證
f) 附加規則:regex in callback
第三天**********************************************************************************************************
implode()把數組元素用逗號給合併起來
代碼部分:
頁面跳轉:成功呈現笑臉。
1.在php裏邊,同一個應用請求裏邊若是存在兩個方法(類名),他們的名字同樣(例如都是getName()),因爲php本
身語法規則的限制,系統是要報錯的
解決方法:
① 把他們的名字改成不同的 例如 agetName() bgetName()
② 經過命名空間解決(只有學習tp框架才用命名空間,其餘語言都不用命名空間)
Yii 框架 爲了不名字重複引發問題,同步的類前邊都有 C 字樣
1. 簡單應用
a) 命名空間是虛擬的定義空間,不是真實存在目錄(能夠寫一些假的)
b) 命名空間的分隔符都是反斜槓 \
c) 非限定名稱:getName() 得到與其最近的命名空間的getName()
d) 限定名稱:beijing\getName() 相對方式 經過最近的命名空間定位beijing\getName()
e) 徹底限定名稱: \beijing\getName() 直接在指定的命名空間得到具體元素
f) 命名空間針對:函數、類名、常量三者其做用,在命名空間裏邊把這三種統稱爲元素
定義常量的時候,都定義爲大寫的。
2.子空間應用
3. 別名和導入
a) 導入/引入 use
b) 使用一個元素,使用非限定名稱,在當前最接近的空間裏邊得到元素
c) 若是當前空間裏邊沒有指定元素,也能夠在導入的空間裏邊尋找
d) 別名應用:
e) 若是在引入空間的時候也把元素給引入了,在當前的空間裏邊也有同名字的元素,那麼這個外來的元素和內部元素要有衝突,這時能夠經過別名定義來從新給外來的元素起名字並使用
4. 公共空間
a) 第一種狀況
b) 沒有使用namespace定義空間,當前空間就是一個公共空間
c) 例如一個有namespace的文件引入了一個沒有namespace的文件程序
d) 沒有namespace的文件空間就是公共空間
e) 在namespace文件裏邊能夠經過\斜槓直接訪問公共空間元素
f) function getName(){} ------公共空間的元素
g) namespace beijing;
h) function getName(){} -----beijing空間的元素
i) 第二種狀況
j) 當前文件沒有namespace、可是引入的文件有namespace
k) 當前文件就是公共空間,引入文件有本身空間
公共空間有兩種狀況:
1. 當前有空間,引入沒有空間(公共空間)
a) 默認使用當前空間的元素.
b) 統一用"\"斜槓引入公共空間元素.
2. 當前沒有空間(公共空間),引入有空間
a) 默認調用當前公共空間的元素(非限定名稱)
b) 使用有公共空間的元素 (限定名稱、徹底限定名稱)
同一個頁面裏邊有許多空間,在頁面最下邊使用上邊空間的元素,名稱須要使用徹底限定名稱,還能夠把上邊空間的元素給use引入過來也可經過非限定名稱或限定名稱使用
命名空間使用注意:
1. 針對類名、函數名、常量const其做用
① define()定義的常量不受命名空間限制
2. 聲明namespace的當前腳本的第一個命名空間前面不能有任何代碼(header頭代碼也要寫在下邊)
3. 命名空間是虛擬抽象的空間,不是真實存在的目錄
4. 當前文件能夠include具備命名空間的文件,默認空間是當前文件的公共空間
5. 元素調用分:非限定名稱、限定名稱、徹底限定名稱
簡單使用:同一個頁面定義了許多單級命名空間
子空間:經過\斜槓定義多級命名空間
公共空間:爲了程序比較嚴謹,公共空間的元素都使用\斜槓訪問
空間引入和別名:use as
多語言設置就是經過get參數告訴當前的請求使用何種語言
第一次使用get變量傳遞語言,以後語言還會保存在cookie裏邊,供下次使用
若是get沒有傳遞語言,瀏覽器會根據當前地區選中對應的語言,咱們程序也能夠讀取瀏覽
器的對應的語言變量選擇對應的語言
設置步驟:
1. 多語言經過行爲Behavior支持:ThinkPHP/Library/Behavior/CheckLangBehavior.class.php
2. 語言包一共有4種,後定義的要覆蓋先定義的(相似配置文件config.php覆蓋convertion.php)
3. 在config.php裏邊開啓多語言支持
4. 確保行爲Behavior代碼執行
a) 手動啓動該CheckLangBehavior行爲
b) shop/Common/Conf/tags.php
5. 語言包4個等級
6. 得到語言變量信息
a) L()快捷函數,能夠得到所有或指定語言變量
b) 使用語言,得到所有語言,assign()傳遞語言變量到模板進行具體使用(assign:賦值,分配)。
c) {$Think.language.名稱}
7. 每一個語言本身對應具體的一個文件
總結:
1. 命名空間
i. namespace use
ii. 非限定名稱(當前空間元素) 限定名稱(相對空間的元素) 徹底限定名稱(絕對定位元素)
iii. 簡單使用(同一個文件定義許多命名空間)
iv. 子空間(多級命名空間)
v. 引入空間:空間和元素都引入、只引入空間
vi. 別名使用:
vii. 公共空間
2. 多語言
ThinkPHP/Library/Think/Verify.class.php
$verify = new 命名空間Verify();
$verify -> entry(); 生成一個驗證碼
一個單獨的方法生成驗證碼
驗證碼須要在模板中使用
<img src=」路由地址Manager/verifyImg」 alt=」」 />
驗證輸入的驗證碼是否正確
自己驗證碼信息存儲在session裏邊
session存儲的驗證碼是加密後的數據
Verify類給咱們提供了一個方法進行驗證碼的有效性驗證
$verify -> check(用戶輸入驗證碼); 返回真,表示驗證碼正確
Manager
判斷用戶名、密碼是不是正確的,若是是正確的,再把信息存入session裏邊表示是登陸狀態
舊的解決方案:
select * from sw_manager where name=$name and pwd = $pwd;
同時查詢用戶名和密碼的信息記錄,若是存在就是正確的,不然用戶名或密碼錯誤
該方式不安全,會增長sql語句注入的風險
如今流行的解決方案:
select * from sw_manager where name=$name;
首先,查詢指定名字的記錄信息
其次,若是記錄存在,再把記錄裏邊的密碼拿出來 與 用戶輸入的密碼進行比較
若是比較一致,就說明用戶名和密碼正確
用戶名和密碼在model模型裏邊的判斷:
tp框架關於session操做(cookie)
//session(name,value, 有效時間) 設置session
//session(name) 獲取session
//session(name,null) 刪除指定session
//session(null) 清空所有session
用戶退出系統
1. tp框架使用自定義功能類
2. 具體分頁效果實現
smarty裏邊也有緩存,是頁面靜態化的緩存, 頁面緩存
數據緩存
數據緩存介質:file文件、memory內存、數據庫
能夠把一些不常用的mysql數據臨時放入緩存裏邊,每次用戶得到信息就從緩存裏邊得到,大大的提高的mysql的性能,較少服務器開銷
文件緩存:fopen fwrite() fread()
memory內存緩存:安裝內存緩存軟件,啓動軟件服務,set() get()方法對內存數據進行讀入讀出操做
數據庫緩存:創建數據表,啓動mysql數據 insert() select() update()
不一樣介質的緩存操做的手段也不同
tp框架已經把各類緩存設置好了,咱們能夠經過統一的行爲操做不一樣類型的緩存
使得緩存使用很是容易入門。
S(name,value) 設置緩存
緩存操做:
S(name,value,有效期(秒)); 設置緩存變量
S(name) 讀取緩存變量信息
S(name,null) 刪除指定的緩存變量
S(null)刪除所有的緩存變量
緩存案例原理:
緩存裏邊有數據直接返回使用
不然去數據庫查詢信息,再緩存,再供使用
下次就會跑到緩存裏邊得到指定的信息,過了有效期還要重啓跑到數據庫得到數據
生成的具體緩存文件:
80%的緩存是內存緩存。
<form enctype="multipart/form-data">
$_FILES
move_uploaded_file(臨時路徑名,真實路徑名);
附件上傳邏輯代碼:
原理:利用已有圖片建立一個畫板
把畫板給縮小一點imagecopyresampled
imagepng($im,路徑名); 保存到系統一個指定目錄
ThinkPHP/Library/Think/Image.class.php
open() 打開一個圖像資源
thumb()製做縮略圖,設置圖像的寬度、高度、達到製做縮略圖效果:自動地按比例進行縮放
save() 保存圖像,
爲上傳的圖片生成縮略圖:
1.面向切面:是一種設置模式
把一個大塊的功能給分解爲小塊的功能
這樣小塊的功能利於開發、維護、升級、部署
2.tp框架的面向切面編程設計體如今Behavior行爲裏邊,在ThinkPHP/Library/Behavior
3.行爲:
4.tp框架的行爲Behavior如何執行:
1. 框架執行流程分析:index.php ThinkPHP.php Think.class.php App.class.php。這是主要的文件,而行爲 與Think.class.php聯繫最緊密
2. Think::start();
3. ThinkPHP/Conf/Mode/common.php tags標籤內容是行爲的內容
4. 自定義shop/Common/conf/tags.php文件
5. 自定義tags.php內容會覆蓋指定的common.php的配置內容
App.class.php
1. function run();
2. Hook::listen('app_begin');
3. ThinkPHP/Library/Think/Hook.class.php
4. function listen()
5. tags標籤的內容解析出來: CheckLang
6. self::exec(‘CheckLang’);
7. function exec()
8. CheckLangBehavior
9. new CheckBehavior;
10. obj -> run(); 運行具體行爲
總結:
1. 1. 驗證碼Verify entry()
i. 獨立路由進行驗證生成
ii. check(用戶輸入驗證)
2. 數據分頁
3. 緩存使用S();
4. 附件上傳Upload.class.php uploadOne()
i. 注意:rootPath 根目錄路徑須要設置正確
ii. 日期路徑也會自動被建立
iii. 生成縮略圖Image.class.php
iv. open()
v. thumb()
vi. save()
5. Behavior行爲分析
做業:
1. 後臺用戶登陸邏輯實現(用戶登陸信息存入session表示登陸狀態)
2. 驗證碼生成、及具體應用判斷
3. 後天添加商品上傳圖片(生成縮略圖)
登陸系統、驗證碼、分頁、上傳、縮略圖