## 概述
可以通過`Request`對象完成全局輸入變量的檢測、獲取和安全過濾,支持包括`$_GET`、`$_POST`、`$_REQUEST`、`$_SERVER`、`$_SESSION`、`$_COOKIE`、`$_ENV`等系統變量,以及文件上傳信息。
## 檢測變量是否設置
可以使用`has`方法來檢測一個變量參數是否設置,如下:
~~~
Request::instance()->has('id','get');
Request::instance()->has('name','post');
~~~
或者使用助手函數
~~~
input('?get.id');
input('?post.name');
~~~
變量檢測可以支持所有支持的系統變量。
## 變量獲取
變量獲取使用`\think\Request`類的如下方法及參數:
>[info] ### 變量類型方法('變量名/變量修飾符','默認值','過濾方法')
變量類型方法包括:
|方法|描述|
|---|---|
|param|獲取當前請求的變量|
|get|獲取 $_GET 變量|
|post|獲取 $_POST 變量|
|put|獲取 PUT 變量|
|delete|獲取 DELETE 變量|
|session|獲取 $_SESSION 變量|
|cookie|獲取 $_COOKIE 變量|
|request|獲取 $_REQUEST 變量|
|server|獲取 $_SERVER 變量|
|env|獲取 $_ENV 變量|
|route|獲取 路由(包括PATHINFO) 變量|
|file|獲取 $_FILES 變量|
### 獲取`PARAM`變量
PARAM變量是框架提供的用于自動識別`GET`、`POST`或者`PUT`請求的一種變量獲取方式,是系統推薦的獲取請求參數的方法,用法如下:
~~~
// 獲取當前請求的name變量
Request::instance()->param('name');
// 獲取當前請求的所有變量(經過過濾)
Request::instance()->param();
// 獲取當前請求的所有變量(原始數據)
Request::instance()->param(false);
// 獲取當前請求的所有變量(包含上傳文件)
Request::instance()->param(true);
~~~
> param方法會把當前請求類型的參數和PATH_INFO變量以及GET請求合并。
使用助手函數實現:
~~~
input('param.name');
input('param.');
或者
input('name');
input('');
~~~
因為`input`函數默認就采用PARAM變量讀取方式。
### 獲取`GET`變量
~~~
Request::instance()->get('id'); // 獲取某個get變量
Request::instance()->get('name'); // 獲取get變量
Request::instance()->get(); // 獲取所有的get變量(經過過濾的數組)
Request::instance()->get(false); // 獲取所有的get變量(原始數組)
~~~
或者使用內置的助手函數`input`方法實現相同的功能:
~~~
input('get.id');
input('get.name');
input('get.');
~~~
> 注:pathinfo地址參數不能通過get方法獲取,查看“獲取PARAM變量”
### 獲取`POST`變量
~~~
Request::instance()->post('name'); // 獲取某個post變量
Request::instance()->post(); // 獲取經過過濾的全部post變量
Request::instance()->post(false); // 獲取全部的post原始變量
~~~
使用助手函數實現:
~~~
input('post.name');
input('post.');
~~~
### 獲取`PUT`變量
~~~
Request::instance()->put('name'); // 獲取某個put變量
Request::instance()->put(); // 獲取全部的put變量(經過過濾)
Request::instance()->put(false); // 獲取全部的put原始變量
~~~
使用助手函數實現:
~~~
input('put.name');
input('put.');
~~~
### 獲取`REQUEST`變量
~~~
Request::instance()->request('id'); // 獲取某個request變量
Request::instance()->request(); // 獲取全部的request變量(經過過濾)
Request::instance()->request(false); // 獲取全部的request原始變量數據
~~~
使用助手函數實現:
~~~
input('request.id');
input('request.');
~~~
### 獲取`SERVER`變量
~~~
Request::instance()->server('PHP_SELF'); // 獲取某個server變量
Request::instance()->server(); // 獲取全部的server變量
~~~
使用助手函數實現:
~~~
input('server.PHP_SELF');
input('server.');
~~~
### 獲取`SESSION`變量
~~~
Request::instance()->session('user_id'); // 獲取某個session變量
Request::instance()->session(); // 獲取全部的session變量
~~~
使用助手函數實現:
~~~
input('session.user_id');
input('session.');
~~~
### 獲取`Cookie`變量
~~~
Request::instance()->cookie('user_id'); // 獲取某個cookie變量
Request::instance()->cookie(); // 獲取全部的cookie變量
~~~
使用助手函數實現:
~~~
input('cookie.user_id');
input('cookie.');
~~~
## 變量過濾
>[danger] 框架默認沒有設置任何過濾規則,你可以是配置文件中設置全局的過濾規則:
~~~
// 默認全局過濾方法 用逗號分隔多個
'default_filter' => 'htmlspecialchars',
~~~
也支持使用`Request`對象進行全局變量的獲取過濾,過濾方式包括函數、方法過濾,以及PHP內置的Types of filters,我們可以設置全局變量過濾方法,例如:
~~~
Request::instance()->filter('htmlspecialchars');
~~~
支持設置多個過濾方法,例如:
~~~
Request::instance()->filter(['strip_tags','htmlspecialchars']),
~~~
也可以在獲取變量的時候添加過濾方法,例如:
~~~
Request::instance()->get('name','','htmlspecialchars'); // 獲取get變量 并用htmlspecialchars函數過濾
Request::instance()->param('username','','strip_tags'); // 獲取param變量 并用strip_tags函數過濾
Request::instance()->post('name','','org\Filter::safeHtml'); // 獲取post變量 并用org\Filter類的safeHtml方法過濾
~~~
可以支持傳入多個過濾規則,例如:
~~~
Request::instance()->param('username','','strip_tags,strtolower'); // 獲取param變量 并依次調用strip_tags、strtolower函數過濾
~~~
Request對象還支持PHP內置提供的Filter ID過濾,例如:
~~~
Request::instance()->post('email','',FILTER_VALIDATE_EMAIL);
~~~
框架對FilterID做了轉換支持,因此也可以使用字符串的方式,例如:
~~~
Request::instance()->post('email','','email');
~~~
采用字符串方式定義`FilterID`的時候,系統會自動進行一次`filter_id`調用轉換成`Filter`常量。
具體的字符串根據`filter_list`函數的返回值來定義。
> 需要注意的是,采用Filter ID 進行過濾的話,如果不符合過濾要求的話 會返回false,因此你需要配合默認值來確保最終的值符合你的規范。
例如,
~~~
Request::instance()->post('email','',FILTER_VALIDATE_EMAIL);
~~~
就表示,如果不是規范的email地址的話 返回空字符串。
如果當前不需要進行任何過濾的話,可以使用(`V5.0.3+`版本)
~~~
// 獲取get變量 并且不進行任何過濾 即使設置了全局過濾
Request::instance()->get('name','',null);
~~~
## 獲取部分變量
如果你只需要獲取當前請求的部分參數,可以使用:
~~~
// 只獲取當前請求的id和name變量
Request::instance()->only('id,name');
~~~
或者使用數組方式
~~~
// 只獲取當前請求的id和name變量
Request::instance()->only(['id','name']);
~~~
默認獲取的是當前請求參數,如果需要獲取其它類型的參數,可以使用第二個參數,例如:
~~~
// 只獲取GET請求的id和name變量
Request::instance()->only(['id','name'],'get');
// 只獲取POST請求的id和name變量
Request::instance()->only(['id','name'],'post');
~~~
## 排除部分變量
也支持排除某些變量獲取,例如
~~~
// 排除id和name變量
Request::instance()->except('id,name');
~~~
或者使用數組方式
~~~
// 排除id和name變量
Request::instance()->except(['id','name']);
~~~
同樣支持指定變量類型獲取:
~~~
// 排除GET請求的id和name變量
Request::instance()->except(['id','name'],'get');
// 排除POST請求的id和name變量
Request::instance()->except(['id','name'],'post');
~~~
## 變量修飾符
`input`函數支持對變量使用修飾符功能,可以更好的過濾變量。
用法如下:?
>[info] ### input('變量類型.變量名/修飾符');
或者
>[info] ### Request::instance()->變量類型('變量名/修飾符');
例如:
~~~
input('get.id/d');
input('post.name/s');
input('post.ids/a');
Request::instance()->get('id/d');
~~~
ThinkPHP5.0版本默認的變量修飾符是`/s`,如果需要傳入字符串之外的變量可以使用下面的修飾符,包括:
| 修飾符 | 作用 |
| --- | --- |
| s | 強制轉換為字符串類型 |
| d | 強制轉換為整型類型 |
| b | 強制轉換為布爾類型 |
| a | 強制轉換為數組類型 |
| f | 強制轉換為浮點類型 |
>[danger] 如果你要獲取的數據為數組,請一定注意要加上 `/a` 修飾符才能正確獲取到。
- 序言
- 基礎
- 安裝ThinkPHP
- 開發規范
- 目錄結構
- 架構
- 架構總覽
- 生命周期
- 入口文件
- URL訪問
- 模塊設計
- 命名空間
- 自動加載
- Traits引入
- API友好
- 配置
- 配置目錄
- 配置格式
- 配置加載
- 讀取配置
- 動態配置
- 獨立配置
- 配置作用域
- 環境變量配置
- 路由
- 路由模式
- 路由定義
- 批量注冊
- 變量規則
- 組合變量
- 路由參數
- 路由地址
- 資源路由
- 快捷路由
- 路由別名
- 路由分組
- MISS路由
- 閉包支持
- 路由綁定
- 綁定模型
- 域名路由
- URL生成
- 控制器
- 控制器定義
- 控制器初始化
- 前置操作
- 跳轉和重定向
- 空操作
- 空控制器
- 多級控制器
- 分層控制器
- Rest控制器
- 自動定位控制器
- 資源控制器
- 請求
- 請求信息
- 輸入變量
- 更改變量
- 請求類型
- 請求偽裝
- HTTP頭信息
- 偽靜態
- 方法注入
- 屬性注入
- 參數綁定
- 依賴注入
- 請求緩存
- 數據庫
- 連接數據庫
- 基本使用
- 查詢構造器
- 查詢數據
- 添加數據
- 更新數據
- 刪除數據
- 查詢方法
- 查詢語法
- 鏈式操作
- where
- table
- alias
- field
- order
- limit
- page
- group
- having
- join
- union
- distinct
- lock
- cache
- comment
- fetchSql
- force
- bind
- partition
- strict
- failException
- sequence
- 聚合查詢
- 時間查詢
- 高級查詢
- 視圖查詢
- 子查詢
- 原生查詢
- 查詢事件
- 事務操作
- 監聽SQL
- 存儲過程
- 數據集
- 分布式數據庫
- 模型
- 定義
- 模型初始化
- 新增
- 更新
- 刪除
- 查詢
- 聚合
- 獲取器
- 修改器
- 時間戳
- 只讀字段
- 軟刪除
- 類型轉換
- 數據完成
- 查詢范圍
- 模型分層
- 數組訪問和轉換
- JSON序列化
- 事件
- 關聯
- 一對一關聯
- 一對多關聯
- 遠程一對多
- 多對多關聯
- 多態關聯
- 動態屬性
- 關聯預載入
- 關聯統計
- 聚合模型
- 視圖
- 視圖實例化
- 模板引擎
- 模板賦值
- 模板渲染
- 輸出替換
- 模板
- 模板定位
- 模板標簽
- 變量輸出
- 系統變量
- 請求參數
- 使用函數
- 使用默認值
- 使用運算符
- 三元運算
- 原樣輸出
- 模板注釋
- 模板布局
- 模板繼承
- 包含文件
- 標簽庫
- 內置標簽
- 循環輸出標簽
- 比較標簽
- 條件判斷
- 資源文件加載
- 標簽嵌套
- 原生PHP
- 定義標簽
- 日志
- 介紹
- 日志驅動
- 日志寫入
- 獨立日志
- 日志清空
- 寫入授權
- 錯誤和調試
- 調試模式
- 異常處理
- 拋出異常
- Trace調試
- 變量調試
- 性能調試
- SQL調試
- 遠程調試
- 404頁面
- 驗證
- 驗證器
- 驗證規則
- 錯誤信息
- 驗證場景
- 控制器驗證
- 模型驗證
- 內置規則
- 靜態調用
- 表單令牌
- 安全
- 輸入安全
- 數據庫安全
- 上傳安全
- 其它安全建議
- 雜項
- 緩存
- Session
- Cookie
- 多語言
- 分頁
- 上傳
- 驗證碼
- 圖像處理
- 文件處理
- 單元測試
- 擴展
- 函數
- 類庫
- 行為
- 驅動
- Composer包
- Time
- 數據庫遷移工具
- Workerman
- MongoDb
- SAE
- 標簽擴展
- 命令行
- 自動生成目錄結構
- 創建類庫文件
- 生成類庫映射文件
- 生成路由緩存
- 清除緩存文件
- 生成配置緩存文件
- 生成數據表字段緩存
- 自定義命令行
- 部署
- 虛擬主機環境
- Linux 主機環境
- URL重寫
- 附錄
- 配置參考
- 常量參考
- 助手函數
- 升級指導
- 更新日志