ThinkPHP (TP) 提供多種輸入獲取方式,理解其差異能寫出更安全、可維護的程式碼。本文針對 TP 3.1+ 版本詳細說明。
$_POST/$_GEThtmlspecialchars() 或 I()。$this->_post()/$this->_get()// 預設已執行 htmlspecialchars()
$name = $this->_post('name'); // 取單一欄位
$all = $this->_post(); // 取全部 POST 陣列
// 第二參數指定預設值
$page = $this->_get('page', 1);
注意:TP 3.2 起標記為 deprecated,建議改用 I()。
I() (TP 3.1.3+ 推薦)// 語法:I('變數名', '預設值', '過濾方法')
$username = I('username'); // 預設 htmlspecialchars
$age = I('age', 0, 'intval'); // 強制轉整數
$tags = I('tags', [], 'trim'); // 陣列元素去空白
$raw = I('post.raw_data', '', 'strip_tags'); // 移除 HTML 標籤
// 明確指定來源
I('get.id'); // 等同 $_GET['id']
I('post.name'); // 等同 $_POST['name']
I('request.token'); // 自動檢查 $_POST → $_GET → $_COOKIE
內建過濾器:htmlspecialchars (預設)、intval、floatval、trim、strip_tags、addslashes 等,也可傳入自訂函數名。
U()// 基本用法
U('User/profile'); // 當前模組 User 控制器 profile 方法
U('Admin/User/edit', ['id' => 5]); // 帶參數
U('Home/Index/index', '', '.html'); // 偽靜態後綴
U('Api/Index', [], '', true, 'api.example.com'); // 跨域/多域名
// 參數順序:'模組/控制器/方法', 參數陣列, 後綴, 是否跳轉, 域名
優點:自動根據路由配置、URL 模式 (PATHINFO/REWRITE/兼容模式) 產生正確連結,避免硬編碼。
| 場景 | 推薦方式 | 理由 |
|---|---|---|
| 表單提交處理 | I('post.') | 自動過濾、支援預設值、程式碼可讀 |
| API 參數驗證 | I('get.id', 0, 'intval') | 型別轉換+預設值一行搞定 |
| 模板輸出連結 | {:U('User/view', ['id'=>$user['id']])} | 路由變更不需改模板 |
| 極高效能需求 | $_POST + 手動過濾 | 避免函數呼叫開銷 (極少見) |