Thinkphp 控制器 輸入變數

2021-08-21 17:08:13 字數 4851 閱讀 3865

在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 提交請求...