【小(xiǎo)編推薦】ThinkPHP3.2——輸入變量

2014-06-26 &nbs₽₽'☆p; |   →☆λ發布者:梁國(guó)芳   | &↔♣₽  查看(kàn):3320次

Thinkphp

在Web開(kāi)發過程中,我們經常需要(yào)獲取系統變量或者£©↑∏用(yòng)戶提交的(de)數(shù)據,這(zhè)些(xiē)‍←≥變量數(shù)據錯(cuò)綜複雜(zá),而且一(yī)不(b↔δ✔λù)小(xiǎo)心就(jiù)容易引起安全隐患,但(dàn)是(s∏ ♥hì)如(rú)果利用(yòng)好(hǎo↔ ↑)ThinkPHP提供的(de)變量獲取功能(néng),就(jiù)可¶↔(kě)以輕松的(de)獲取和(hé)駕馭變量了λ‌φ(le)。

獲取變量

雖然你(nǐ)仍然可(kě)以在開(kāi)發過程中使用(yòng)傳‍±®>統方式獲取各種系統變量,例如(rú):

  1. $id = $_GET['id']; // 獲取get變量
  2. $name = $_POST['name']; // 獲取post變量
  3. $value = $_SESSION['var']; // 獲取session變量
  4. $name = $_COOKIE['name']; // 獲取cookie變量
  5. $file = $_SERVER['PHP_SELF']; // 獲取server變量

但(dàn)是(shì)我們不(bù)建議(β₹♥yì)直接使用(yòng)傳統方式獲取,因為(wèi)沒有(yǒu)統一(yī≠≈∑♠)的(de)安全處理(lǐ)機(jī)制(zhì),後期如(rú)果調¥✘整的(de)話(huà),改起來(lái)會(hu♥®ì)比較麻煩。所以,更好(hǎo)的(de)方式是(shì)在框架中統一¶✔(yī)使用(yòng)I函數(shù)進行(>β↓xíng)變量獲取和(hé)過濾。

I方法是(shì)ThinkPHP衆多(duō)單字母函數(φ≠&$shù)中的(de)新成員(yuán),其命名來(lái)自★¶(zì)于英文(wén)Input(輸入),主要(yào)用(yòng)于更加∞₽π方便和(hé)安全的(de)獲取系統輸入變量,可(kě)以用(yòng)于任何☆←✘地(dì)方,用(yòng)法格式如(r✘♣∏ú)下(xià):

I('變量類型.變量名',['默認值'],['過濾方法'],['額外(wài)∞φ☆數(shù)據源'])

變量類型是(shì)指請(qǐng)求方式或者♥α®輸入類型,包括:

變量類型 含義
get 獲取GET參數(shù)
post 獲取POST參數(shù)
param 自(zì)動判斷請(qǐng)求類型獲取GET、POSγ"•'T或者PUT參數(shù)
request 獲取REQUEST 參數(shù)
put 獲取PUT 參數(shù)
session 獲取 $_SESSION 參數(shù)
cookie 獲取 $_COOKIE 參數(shù)
server 獲取 $_SERVER 參數(shù)
globals 獲取 $GLOBALS參數(shù)
path 獲取 PATHINFO模式的(de)URL參數(shù)(3.2.2新增)
data 獲取 其他(tā)類型的(de)參數(shù),需要(y✔ ào)配合額外(wài)數(shù)據源參數(shù)(3.2.2新增)

注意:變量類型不(bù)區(qū)分(fēn)大(dà)小(₽"xiǎo)寫。
變量名則嚴格區(qū)分(fēn)大(dà)小( ÷₹xiǎo)寫。
默認值和(hé)過濾方法均屬于可(kě)選參數(shù)。

我們以GET變量類型為(wèi)例,說(shγ©βuō)明(míng)下(xià)I方法的(de)₩↕$使用(yòng):

  1. echo I('get.id'); // 相(xiàng)當于 $_GET['id']
  2. echo I('get.name'); // 相(xiàng)當于 $_GET['name']

支持默認值:

  1. echo I('get.id',0); // 如(rú)果不(bù)存在$_GET['id∞¥'] 則返回0
  2. echo I('get.name',''); // 如(rú)果不(bù)存在$_GET['name'] 則返$✔ β回空(kōng)字符串

采用(yòng)方法過濾:

  1. // 采用(yòng)htmlspecialcharsλ★方法對(duì)$_GET['name'] 進行(xíng)✔£過濾,如(rú)果不(bù)存在則返回空(kōng)字符串
  2. echo I('get.name','','htmlspecialchars');

支持直接獲取整個(gè)變量類型,例如(rú):

  1. // 獲取整個(gè)$_GET 數(shù)組
  2. I('get.');

用(yòng)同樣的(de)方式,我們可(kě)以獲取pos←↓'®t或者其他(tā)輸入類型的(de)變量,例如(rú):

  1. I('post.name','','htmlspecialchars'); // 采用(yòng)htmlspeci×'alchars方法對(duì)$_POST['name'] 進行(xíng)過$β∞濾,如(rú)果不(bù)存在則返回空(kōng)字符串
  2. I('session.user_id',0); // 獲取$_SESSION['user_id'] φ​♣如(rú)果不(bù)存在則默認為(wèi)0
  3. I('cookie.'); // 獲取整個(gè) $_COOKIE 數(s±£×'hù)組
  4. I('server.REQUEST_METHOD'); // 獲取 $_SERVER['REQUE↑  >ST_METHOD']

param變量類型是(shì)框架特有(yǒu)的(de)支持自(zì)動判£≤£γ斷當前請(qǐng)求類型的(de)變量獲取δ 方式,例如(rú):

echo I('param.id');

如(rú)果當前請(qǐng)求類型是(shì)GET,那(nà)麽等效σ"₩于 $_GET['id'],如(rú)果當前請(qǐng)求類 <型是(shì)POST或者PUT,那(nà♥γ®)麽相(xiàng)當于獲取 $_POST[≥ 'id'] 或者 PUT參數(shù)i✔​✔£d。

由于param類型是(shì)I函數(shù)默認獲取的(de)變量α​ 類型,因此事(shì)實上(shàng)param變©←φ量類型的(de)寫法可(kě)以簡化(huà)為(wèi):

  1. I('id'); // 等同于 I('param.id')
  2. I('name'); // 等同于 I('param.name')

3.2.2新增了(le)path和(hé)data兩個(gè)變量類型,用(yòng)法如(rú)下(xià):

path類型變量可(kě)以用(yòng)于獲取URL參數(shù)(必∞ ≥​須是(shì)PATHINFO模式參數(shù)有(yǒu)效×≈↕ ,無論是(shì)GET還(hái)是(shì)POST方式都σγ•✘(dōu)有(yǒu)效),例如(rú): ₩<當前訪問(wèn)URL地(dì)址是(shì) http://serverName/index.php/New/2013/06λ<™/01

那(nà)麽我們可(kě)以通(tōng)☆™過

  1. echo I('path.1'); // 輸出2013
  2. echo I('path.2'); // 輸出06
  3. echo I('path.3'); // 輸出01

data類型變量可(kě)以用(yòng)于≤↓獲取不(bù)支持的(de)變量類型的(de)讀(dú)取,例如(rú):

  1. I('data.file1','','',$_FILES);

變量過濾

如(rú)果你(nǐ)沒有(yǒu)在調用(yòng)I函數(shù)≈≤的(de)時(shí)候指定過濾方法的(de)話(h♥€λ<uà),系統會(huì)采用(yòng)默認的(de)過濾‍₽機(jī)制(zhì)(由DEFAULT_FILTER配置),事(shì)實上™πΩ(shàng),該參數(shù)的(de)默認設置是(shì):

  1. // 系統默認的(de)變量過濾機(jī)制(zhì)
  2. 'DEFAULT_FILTER' => 'htmlspecialchars'

也(yě)就(jiù)說(shuō),I方法的(de)所有(yǒ•±σu)獲取變量如(rú)果沒有(yǒu)設置過®₩&λ濾方法的(de)話(huà)都(dōu)會(huì)₩♦•§進行(xíng)htmlspecialchar♣γ∏εs過濾,那(nà)麽:

  1. // 等同于 htmlspecialchars($_GET['name®↓'])
  2. I('get.name');

同樣,該參數(shù)也(yě)可(kě)以設置支持多(duō)✔λ∞≈個(gè)過濾,例如(rú):

  1. 'DEFAULT_FILTER' => 'strip_tags,htmlspecialchars'

設置後,我們在使用(yòng):

  1. // 等同于 htmlspecialchars(strip_ta∞βσgs($_GET['name']))
  2. I('get.name');

如(rú)果我們在使用(yòng)I方法的(↕♦de)時(shí)候 指定了(le)過濾方法,那(nà)麽就(j<¶•iù)會(huì)忽略DEFAULT_FILTER的(de)設置,例如(rú‌₩):

  1. // 等同于 strip_tags($_GET['name₹←'])
  2. echo I('get.name','','strip_tags');

I方法的(de)第三個(gè)參數(shù)如(rú)​α‌"果傳入函數(shù)名,則表示調用(yòng)該函數(shù)對(d✘ πuì)變量進行(xíng)過濾并返回(在變量是(shì)數(shù)組的(d↓'e)情況下(xià)自(zì)動使用(yòng)&€​€array_map進行(xíng)過濾處理(lǐ)),否則會(huì)調用(yòng)•δPHP內(nèi)置的(de)filter_var方法進行(xíng)過濾處理(lǐ),例如(rú):

  1. I('post.email','',FILTER_VALIDATE_EMAIL);

表示 會(huì)對(duì)$_POST['email'] 進行(xíng) 格式驗證,如(rú)果不(bùα∏☆)符合要(yào)求的(de)話(huà),返回空(kōng)↔∞↓§字符串。 (關于更多(duō)的(de)驗證格式,可(kě)以參考 官方手 Ω×冊的(de)filter_var用(yòng)法。) 或者可(kě)以用(yòng)下(xià)面的(de)字∞Ω​符标識方式:

  1. I('post.email','','email');

可(kě)以支持的(de)過濾名稱必須是(shì)filter_list方法中的(de)有(yǒu)效值(不(bù→↔λ)同的(de)服務器(qì)環境可(kě)能(néng)有(yǒu'↔π)所不(bù)同),可(kě)能(néng)支持的(de)包括:β ↑

  1. int
  2. boolean
  3. float
  4. validate_regexp
  5. validate_url
  6. validate_email
  7. validate_ip
  8. string
  9. stripped
  10. encoded
  11. special_chars
  12. unsafe_raw
  13. email
  14. url
  15. number_int
  16. number_float
  17. magic_quotes
  18. callback

在有(yǒu)些(xiē)特殊的(de)情況下(xià), σ我們不(bù)希望進行(xíng)任何過濾,即使DEFAULT_FILTER已經有(yǒu)所設置,可(kě)以使用(yòng÷•):

  1. // 下(xià)面兩種方式都(dōu)不(‍•bù)采用(yòng)任何過濾方法
  2. I('get.name','','');
  3. I('get.id','',false);

一(yī)旦過濾參數(shù)設置為(wèi)空(kōng)字符串或者​"false,即表示不(bù)再進行(xíng)任何的(>✘↔de)過濾。