Thinkphp中的 I 函數(Thinkphp3.2.3版本)

I 函數的做用是獲取系統變量,必要時還能夠對變量值進行過濾及強制轉化,I 函數的語法格式:php

I('變量類型.變量名/修飾符',['默認值'],['過濾方法或正則'],['額外數據源'])

 

1、獲取變量html

在PHP中獲取變量值的方法有不少,好比:$_GET['變量名'],$_POST['變量名'],$_SESSION['變量名'],$_COOKIE['變量名'],$_SERVER['變量名'] 均可以獲取相應的變量值,但在thinkphp中爲了安全的緣由建議統一使用 I 函數來獲取變量值。例如:獲取 URL 地址欄中參數 id 的值,在php中咱們用 $_GET['id'] 來獲取,在thinkphp中咱們能夠用 I('get.id') 來獲取。一樣的, $_POST['id'] 就用 I('post.id') 取代,I 函數的語法格式中的變量類型就是指的像 get 和 post 之類的請求方式,相似的變量類型還包括:正則表達式

變量類型 含義
get 獲取GET參數
post 獲取POST參數
param 自動判斷請求類型獲取GET、POST或者PUT參數
request 獲取REQUEST 參數
put 獲取PUT 參數
session 獲取 $_SESSION 參數
cookie 獲取 $_COOKIE 參數
server 獲取 $_SERVER 參數
globals 獲取 $GLOBALS參數
path 獲取 PATHINFO模式的URL參數
data 獲取 其餘類型的參數,須要配合額外數據源參數

若是要獲取的變量類型是get、post 或 put,能夠統一用 param 變量類型,param 變量類型是框架特有的支持自動判斷當前請求類型的變量獲取方式,例如:I('param.id') ,若是當前請求類型是GET,那麼等效於 $_GET['id'],若是當前請求類型是POST或者PUT,那麼至關於獲取 $_POST['id'] 或者 PUT參數id。而事實上當 I 函數獲取的變量類型是param時變量類型能夠省略直接寫爲:I('變量名') ,那麼 $_GET['id']、$_POST['id'] 均可以簡寫爲:I('id') 。但當變量類型爲其餘類型時就不能這麼簡寫,好比 I('cookie.id')、I('session.id')就不能簡寫。thinkphp

注意:I 函數的變量類型不區分大小寫,但變量名嚴格區分大小寫,好比 I('get.id') 能夠寫成 I('GET.id'),但不能寫成 I('get.ID')數組

 

2、變量過濾安全

I 函數自己默認的過濾機制是 htmlspecialchars,由於在配置文件中配置了:服務器

// 系統默認的變量過濾機制
'DEFAULT_FILTER'        => 'htmlspecialchars'

因此 I('post.變量名') 就等同於 htmlspecialchars($_POST('變量名')),若是 I 函數自身帶了過濾方法,則用自身帶的過濾機制過濾變量,好比:cookie

I('post.email','請輸入正確的email地址',FILTER_VALIDATE_EMAIL);

表示會對$_POST['email'] 進行格式驗證判斷是否符合 email 的格式要求,若是不符合的話,返回提示信息。上面的代碼也能夠簡化:session

I('post.email','請輸入正確的email地址','email')

請注意,上面的 FILTER_VALIDATE_EMAIL 是不帶引號的,下面的 email 是帶引號的。框架

像上面 email 那樣簡寫的過濾方法名必須是 filter_list方法中的有效值(不一樣的服務器環境可能有所不一樣),可能支持的包括:

int
boolean
float
validate_regexp
validate_url
validate_email
validate_ip
string
stripped
encoded
special_chars
unsafe_raw
email
url
number_int
number_float
magic_quotes
callback

但我發現用簡寫的過濾名有時也會出現問題,我在個人筆記本上測試 print_r(filter_list()) 是包含 email 的,但 I('email','請輸入正確的email地址','email') 卻不能正確判斷,改爲 I('email','請輸入正確的email地址',FILTER_VALIDATE_EMAIL) 就沒問題。 

I 函數的過濾方法也能支持正則表達式,若是要過濾的方法比較複製的話能夠考慮使用正則表達式。在有些特殊的狀況下,咱們不但願進行任何過濾,即便DEFAULT_FILTER已經有所設置,可使用:

// 下面兩種方式都不採用任何過濾方法
I('get.name','','');
I('get.id','',false);

 

3、變量修飾符

變量修飾符和變量名稱之間用「/」分割開來,變量修飾符的做用是強制轉化變量的字符類型,好比:

I('get.id/d'); // 強制變量轉換爲整型
I('post.name/s'); // 強制轉換變量爲字符串類型
I('post.ids/a'); // 強制變量轉換爲數組類型

可使用的修飾符包括:

修飾符 做用
s 強制轉換爲字符串類型
d 強制轉換爲整型類型
b 強制轉換爲布爾類型
a 強制轉換爲數組類型
f 強制轉換爲浮點類型
相關文章
相關標籤/搜索