在web開發過程中,我們經常需要獲取系統變數或者使用者提交的資料,這些變數資料錯綜複雜,而且一不小心就容易引起安全隱患,但是如果利用好thinkphp提供的變數獲取功能,就可以輕鬆的獲取和駕馭變數了。
雖然你仍然可以在開發過程中使用傳統方式獲取各種系統變數,例如:
$id = $_get['id']; // 獲取get變數
$name = $_post['name']; // 獲取post變數
$value = $_session['var']; // 獲取session變數
$name = $_cookie['name']; // 獲取cookie變數
$file = $_server['php_self']; // 獲取server變數
但是我們不建議直接使用傳統方式獲取,因為沒有統一的安全處理機制,後期如果調整的話,改起來會比較麻煩。所以,更好的方式是在框架中統一使用i函式進行變數獲取和過濾。
i方法是thinkphp用於更加方便和安全的獲取系統輸入變數,可以用於任何地方,用法格式如下:
i('變數型別.變數名/修飾符',['預設值'],['過濾方法或正則'],['額外資料來源'])
變數型別是指請求方式或者輸入型別,包括:
變數型別
含義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變數型別為例,說明下i方法的使用:預設值和過濾方法均屬於可選引數。
echo i('get.id'); // 相當於 $_get['id']
echo i('get.name'); // 相當於 $_get['name']
支援預設值:
echo i('get.id',0); // 如果不存在$_get['id'] 則返回0
echo i('get.name',''); // 如果不存在$_get['name'] 則返回空字串
採用方法過濾:
// 採用htmlspecialchars方法對$_get['name'] 進行過濾,如果不存在則返回空字串
echo i('get.name','','htmlspecialchars');
支援直接獲取整個變數型別,例如:
// 獲取整個$_get 陣列
i('get.');
用同樣的方式,我們可以獲取post或者其他輸入型別的變數,例如:
i('post.name','','htmlspecialchars'); // 採用htmlspecialchars方法對$_post['name'] 進行過濾,如果不存在則返回空字串
i('session.user_id',0); // 獲取$_session['user_id'] 如果不存在則預設為0
i('cookie.'); // 獲取整個 $_cookie 陣列
i('server.request_method'); // 獲取 $_server['request_method']
param變數型別是框架特有的支援自動判斷當前請求型別的變數獲取方式,例如:
echo i('param.id');
如果當前請求型別是get,那麼等效於 $_get['id'],如果當前請求型別是post或者put,那麼相當於獲取 $_post['id'] 或者 put引數id。
由於param型別是i函式預設獲取的變數型別,因此事實上param變數型別的寫法可以簡化為:
i('id'); // 等同於 i('param.id')
i('name'); // 等同於 i('param.name')
path型別變數可以用於獲取url引數(必須是pathinfo模式引數有效,無論是get還是post方式都有效),例如: 當前訪問url位址是http://servername/index.php/new/2013/06/01
那麼我們可以通過
echo i('path.1'); // 輸出2013
echo i('path.2'); // 輸出06
echo i('path.3'); // 輸出01
data型別變數可以用於獲取不支援的變數型別的讀取,例如:
i('data.file1','','',$_files);
如果你沒有在呼叫i函式的時候指定過濾方法的話,系統會採用預設的過濾機制(由default_filter配置),事實上,該引數的預設設定是:
// 系統預設的變數過濾機制
'default_filter' => 'htmlspecialchars'
也就說,i方法的所有獲取變數如果沒有設定過濾方法的話都會進行htmlspecialchars過濾,那麼:
// 等同於 htmlspecialchars($_get['name'])
i('get.name');
同樣,該引數也可以設定支援多個過濾,例如:
'default_filter' => 'strip_tags,htmlspecialchars'
設定後,我們在使用:
// 等同於 htmlspecialchars(strip_tags($_get['name']))
i('get.name');
如果我們在使用i方法的時候 指定了過濾方法,那麼就會忽略default_filter的設定,例如:
// 等同於 strip_tags($_get['name'])
echo i('get.name','','strip_tags');
i方法的第三個引數如果傳入函式名,則表示呼叫該函式對變數進行過濾並返回(在變數是陣列的情況下自動使用array_map
進行過濾處理),否則會呼叫php內建的filter_var
方法進行過濾處理,例如:
i('post.email','',filter_validate_email);
表示 會對$_post['email']
進行 格式驗證,如果不符合要求的話,返回空字串。 (關於更多的驗證格式,可以參考 官方手冊的filter_var
用法。) 或者可以用下面的字元標識方式:
i('post.email','','email');
可以支援的過濾名稱必須是filter_list
方法中的有效值(不同的伺服器環境可能有所不同),可能支援的包括:
int
boolean
float
validate_regexp
validate_url
validate_email
validate_ip
string
stripped
encoded
special_chars
unsafe_raw
email
urlnumber_int
number_float
magic_quotes
callback
還可以支援進行正則匹配過濾,例如:
// 採用正規表示式進行變數過濾
i('get.name','','/^[a-za-z]+$/');
i('get.id',0,'/^\d+$/');
如果正則匹配不通過的話,則返回預設值。
在有些特殊的情況下,我們不希望進行任何過濾,即使default_filter已經有所設定,可以使用:
// 下面兩種方式都不採用任何過濾方法
i('get.name','','');
i('get.id','',false);
一旦過濾引數設定為空字串或者false,即表示不再進行任何的過濾。
最新版本的i函式支援對變數使用修飾符功能,可以更方便的通過型別過濾變數。
用法如下:
i('變數型別.變數名/修飾符')
例如:
i('get.id/d'); // 強制變數轉換為整型
i('post.name/s'); // 強制轉換變數為字串型別
i('post.ids/a'); // 強制變數轉換為陣列型別
可以使用的修飾符包括:
修飾符作用
s強制轉換為字串型別
d強制轉換為整型型別
b強制轉換為布林型別
a強制轉換為陣列型別
f強制轉換為浮點型別
ThinkPHP控制器分級
注 請不要修改thinkphp慣例配置檔案,如果要覆蓋慣例配置的值,可在應用配置檔案中設定和慣例不符的配置項 慣例配置檔案路徑 thinkphp conf convention.php 在應用配置檔案config.php中修改一下內容即可實現控制器分級 例 在 home controller下建立資...
ThinkPHP 控制器(三)
id get id name post name value session var name cookie name file server php self ps 沒有統一的安全處理機制,後期調整會比較麻煩 i 變數型別.變數名 預設值 過濾方法 獲取 get id echo i get.id ...
ThinkPHP 控制器(四)
thinkphp 提供了一組常量來判斷當前請求是否是 get post 等。通過判斷請求處理不同的業務邏輯。常量 含義 is get 判斷是否 get 提交請求 is post 判斷是否 post 提交請求 is put 判斷是否 put 提交請求 is delte 判斷是否 delete 提交請求...