ThinkPHP - I 函数
ThinkPHP函数详解:I方法
ThinkPHP的I方法是3.1.3版本新增的,如果你是之前的3.*版本的话,可以直接参考使用3.1快速入门教程系列的变量部分。
概述
正如你所见到的一样,I方法是ThinkPHP众多单字母函数中的新成员,其命名来自于英文Input(输入),主要用于更加方便和安全的获取系统输入变量,可以用于任何地方,用法格式如下:
I('变量类型.变量名',['默认值'],['过滤方法'])
变量类型是指请求方式或者输入类型,包括:
| 变量类型 | 含义 |
|---|---|
| get | 获取GET参数 |
| post | 获取POST参数 |
| param | 自动判断请求类型获取GET、POST或者PUT参数 |
| request | 获取REQUEST 参数 |
| put | 获取PUT 参数 |
| session | 获取 $_SESSION 参数 |
| cookie | 获取 $_COOKIE 参数 |
| server | 获取 $_SERVER 参数 |
| globals | 获取 $GLOBALS参数 |
注意:变量类型不区分大小写。
变量名则严格区分大小写。
默认值和过滤方法均属于可选参数。
用法
我们以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'] 则返回空字符串
采用方法过滤:
- echo I('get.name','','htmlspecialchars'); // 采用htmlspecialchars方法对$_GET['name'] 进行过滤,如果不存在则返回空字符串
支持直接获取整个变量类型,例如:
- I('get.'); // 获取整个$_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类型变量还可以用数字索引的方式获取URL参数(必须是PATHINFO模式参数有效,无论是GET还是POST方式都有效),例如:
当前访问URL地址是
- http://serverName/index.php/New/2013/06/01
那么我们可以通过
- echo I('param.1'); // 输出2013
- echo I('param.2'); // 输出06
- echo I('param.3'); // 输出01
事实上,param变量类型的写法可以简化为:
- I('id'); // 等同于 I('param.id')
- I('name'); // 等同于 I('param.name')
变量过滤
使
用I方法的时候
变量其实经过了两道过滤,首先是全局的过滤,全局过滤是通过配置VAR_FILTERS参数,这里一定要注意,3.1版本之后,VAR_FILTERS参
数的过滤机制已经更改为采用array_walk_recursive方法递归过滤了,主要对过滤方法的要求是必须引用返回,所以这里设置
htmlspecialchars是无效的,你可以自定义一个方法,例如:
- function filter_default(&$value){
- $value = htmlspecialchars($value);
- }
然后配置:
- 'VAR_FILTERS'=>'filter_default'
如果需要进行多次过滤,可以用:
- 'VAR_FILTERS'=>'filter_default,filter_exp'
filter_exp方法是框架内置的安全过滤方法,用于防止利用模型的EXP功能进行注入攻击。
因为VAR_FILTERS参数设置的是全局过滤机制,而且采用的是递归过滤,对效率有所影响,所以,我们更建议直接对获取变量过滤的方式,除了在I方法
的第三个参数设置过滤方法外,还可以采用配置DEFAULT_FILTER参数的方式设置过滤,事实上,该参数的默认设置是:
- 'DEFAULT_FILTER' => 'htmlspecialchars'
也就说,I方法的所有获取变量都会进行htmlspecialchars过滤,那么:
- I('get.name'); // 等同于 htmlspecialchars($_GET['name'])
同样,该参数也可以支持多个过滤,例如:
- 'DEFAULT_FILTER' => 'strip_tags,htmlspecialchars'
- I('get.name'); // 等同于 htmlspecialchars(strip_tags($_GET['name']))
如果我们在使用I方法的时候 指定了过滤方法,那么就会忽略DEFAULT_FILTER的设置,例如:
- echo I('get.name','','strip_tags'); // 等同于 strip_tags($_GET['name'])
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
- url
- number_int
- number_float
- magic_quotes
- callback
在有些特殊的情况下,我们不希望进行任何过滤,即使DEFAULT_FILTER已经有所设置,可以使用:
- I('get.name','',NULL);
一旦过滤参数设置为NULL,即表示不再进行任何的过滤。
ThinkPHP - I 函数的更多相关文章
- thinkphp C函数的实现原理
在写一个php原生函数的时候,想起使用thinkphp的C函数读取数据库配置非常方便,于是看了看源码的实现,原理很简单,分享一下: 下面是common.php,实现了C函数: if(is_file(& ...
- thinkPHP 全局函数
M函数 TP的Model父类,封装的功能比较多,增删改查操作都具备.一些表,比如留言表,comment class CommentModel extends Model { } M('comment' ...
- thinkphp 公用函数
thinkphp 的项目中指定了common/function.php的函数是公用函数. 不但php页面可以使用,模板文件也可以使用:
- Thinkphp getLastSql函数用法
如何判断一个更新操作是否成功: $Model = D('Blog'); $data['id'] = 10; $data['name'] = 'update name'; $result = $Mode ...
- ThinkPHP M函数疑点
模型类的命名规则是除去表前缀的数据表名称,采用驼峰法命名,并且首字母大写,然后加上模型层的名称(默认定义是Model),例如: 模型名 约定对应数据表(假设数据库的前缀定义是 think_) User ...
- ThinkPHP - F函数,更新配置文件
Html代码: <!DOCTYPE html> <html lang="zh-cn"> <head> <meta charset=&quo ...
- ThinkPHP快捷函数
16个快捷函数用法 1.A() 实例化控制器 格式:[资源://][模块/]控制器A($name,$layer='',$level='')@param string $name 资源地址 @pa ...
- thinkphp助手函数
tp3 C($name=null, $value=null,$default=null) 获取和设置配置参数 支持批量定义 load_config($file,$parse=CONF_PARSE) 加 ...
- thinkphp 使用函数
我们往往需要对模板输出变量使用函数,可以使用: 大理石平台支架 {$data.name|md5} 编译后的结果是: <?php echo (md5($data['name'])); ?> ...
随机推荐
- 1.2. chromium源代码分析 - chromiumframe - 入口函数
ChromiumFrame的入口函数在main.cpp中,打开main.cpp.中包含3个类和_tWinMain函数._tWinMain就是我们要找的入口函数.我做了部分注释: int APIENTR ...
- django分页linaro-django-pagination
1.安装linaro-django-pagination settings INSTALLED_APPS = ( # ... 'linaro_django_pagination', ) MIDDLEW ...
- word-break与word-wrap
本文列举了兼容 IE 和 FF 的换行 CSS 推荐样式,详细介绍了word-wrap同word-break的区别. 兼容 IE 和 FF 的换行 CSS 推荐样式 最好的方式是 以下是引用片段: ...
- Delphi中取整函数Round的Bug解决
Delphi中 Round函数有个Bug一旦参数是形如 XXX.5这样的数时如果 XXX 是奇数 那么就会 Round up如果 XXX 是偶数 那么就会 Round down例如 Round(17. ...
- BZOJ 1874 取石子游戏 (NIM游戏)
题解:简单的NIM游戏,直接计算SG函数,至于找先手策略则按字典序异或掉,去除石子后再异或判断,若可行则直接输出. #include <cstdio> const int N=1005; ...
- dojo 学习笔记
1 因为Dijit包括了一系列的UI组件,他绑定了4个支持的主题:nihilo, soria, tundra 和claro.每个主题包括了一系列的图片和CSS文件来控制组件的外观.CSS文件必须显示 ...
- [Python]Unicode转ascii码的一个好方法
写这篇文章的是一位外国人,他遇到了什么问题呢?比如有一个 Unicode 字符串他需要转为 ascii码: >>> title = u"Klüft skräms inför ...
- 如何让Table显示滚动条
Table显示滚动条,要先把table放到一个div中,div的长度和宽度要固定,控制overflow属性为scroll <div style="width:700px; height ...
- 关于CDC在非控件类中的使用
在非CStatic的派生类中,由于进行图形的绘制的话,我们需要对该类传入一个CDC以便于绘画.这是因为非CStatic等控件类无法自己产生onPaint这类的消息,因此需要借传入的CDC进行回执,然后 ...
- Java-线程间通信
Java-线程间通信 一 线程通讯 就是多个线程操作同一个资源,可是操作的动作不同 二 停止线程: 控制住run的循环就能够控制线程结束 当线程处于冻结状态,就不会读取标记,线程就不会结束 inter ...