ThinkPHP的I方法使用详解
thinkphp的i方法是众多单字母函数中的新成员,其命名来自于英文input(输入),主要用于更加方便和安全的获取系统输入变量,可以用于任何地方,用法格式如下:
i('变量类型.变量名',['默认值'],['过滤方法'])
变量类型是指请求方式或者输入类型。
各个变量类型的含义如下:
变量类型 | 含义 |
---|---|
get | 获取get参数 |
post | 获取post参数 |
param | 自动判断请求类型获取get、post或者put参数 |
request | 获取request 参数 |
put | 获取put 参数 |
session | 获取 $_session 参数 |
cookie | 获取 $_cookie 参数 |
server | 获取 $_server 参数 |
globals | 获取 $globals参数 |
注意:变量类型不区分大小写。
变量名则严格区分大小写。
默认值和过滤方法均属于可选参数。
1.用法:
我们以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')
2.变量过滤
使用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 email url number_int number_float magic_quotes callback
在有些特殊的情况下,我们不希望进行任何过滤,即使default_filter已经有所设置,可以使用:
i('get.name','',null);
一旦过滤参数设置为null,即表示不再进行任何的过滤。
更多关于thinkphp相关内容感兴趣的读者可查看本站专题:《thinkphp入门教程》、《thinkphp模板操作技巧总结》、《thinkphp常用方法总结》、《smarty模板入门基础教程》及《php模板技术总结》。
希望本文所述对大家基于thinkphp框架的php程序设计有所帮助。
推荐阅读
-
js中Array对象的常用遍历方法详解
-
Android开发之ContentProvider的使用详解
-
Android onCreateOptionsMenu的使用方法总结
-
微信小程序使用wxParse解析html的方法示例
-
Android开发之SQLite的使用方法
-
在android开发中尽量不要使用中文路径的问题详解
-
解析Android中实现滑动翻页之ViewFlipper的使用详解
-
基于linux与windows平台下 如何下载android sdk源代码的方法详解
-
解析Android资源文件及他们的读取方法详解
-
Android 自动化测试经验分享 UiObejct.getFromParent()的使用方法