ThinkPHP的I方法使用详解


Posted in PHP onJune 18, 2014

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框架的PHP程序设计有所帮助。

PHP 相关文章推荐
第二节 对象模型 [2]
Oct 09 PHP
PHP查询MySQL大量数据的时候内存占用分析
Jul 22 PHP
php中导出数据到excel时数字变为科学计数的解决方法
Feb 03 PHP
CodeIgniter中实现泛域名解析
Jul 19 PHP
PHP实现AES256加密算法实例
Sep 22 PHP
ThinkPHP有变量的where条件分页实例
Nov 03 PHP
ThinkPHP打开验证码页面显示乱码的解决方法
Dec 18 PHP
PHP cURL初始化和执行方法入门级代码
May 28 PHP
PHP使用strstr()函数获取指定字符串后所有字符的方法
Jan 07 PHP
初识ThinkPHP控制器
Apr 07 PHP
PHP删除数组中指定值的元素常用方法实例分析【4种方法】
Aug 21 PHP
实例讲解PHP验证邮箱是否合格
Jan 28 PHP
ThinkPHP的L方法使用简介
Jun 18 #PHP
Thinkphp中的volist标签用法简介
Jun 18 #PHP
ThinkPHP令牌验证实例
Jun 18 #PHP
Smarty局部缓存的几种方法简介
Jun 17 #PHP
smarty模板局部缓存方法使用示例
Jun 17 #PHP
CodeIgniter CLI模式简介
Jun 17 #PHP
CI框架在CLI下执行占用内存过大问题的解决方法
Jun 17 #PHP
You might like
php读取出一个文件夹及其子文件夹下所有文件的方法示例
2017/06/15 PHP
Js 弹出框口并返回值的两种常用方法
2010/12/30 Javascript
js隐藏与显示回到顶部按钮及window.onscroll事件应用
2013/01/25 Javascript
javascript event在FF和IE的兼容传参心得(绝对好用)
2014/07/10 Javascript
javascript检查浏览器是否支持flash的实现代码
2014/08/14 Javascript
jQuery简单实现上下,左右滑动的方法
2016/06/01 Javascript
vue2.0构建单页应用最佳实战
2017/04/01 Javascript
jQuery实现菜单栏导航效果
2017/08/15 jQuery
Nodejs中使用phantom将html转为pdf或图片格式的方法
2017/09/18 NodeJs
如何实现一个webpack模块解析器
2018/10/24 Javascript
jQuery Ajax实现Select多级关联动态绑定数据的实例代码
2018/10/26 jQuery
微信小程序本地存储实现每日签到、连续签到功能
2019/10/09 Javascript
Python+Selenium+PIL+Tesseract自动识别验证码进行一键登录
2017/09/20 Python
利用TensorFlow训练简单的二分类神经网络模型的方法
2018/03/05 Python
Python实现的本地文件搜索功能示例【测试可用】
2018/05/30 Python
用python打印菱形的实操方法和代码
2019/06/25 Python
深入解析神经网络从原理到实现
2019/07/26 Python
python实现的多任务版udp聊天器功能案例
2019/11/13 Python
Python解析json代码实例解析
2019/11/25 Python
python 函数嵌套及多函数共同运行知识点讲解
2020/03/03 Python
装上这 14 个插件后,PyCharm 真的是无敌的存在
2021/01/11 Python
css3 条纹化和透明化表格Firefox下测试成功
2014/04/15 HTML / CSS
HTML5实时语音通话聊天MP3压缩传输3KB每秒
2019/08/28 HTML / CSS
纽约通行卡:The New York Pass(免费游览纽约90多个景点)
2017/07/29 全球购物
世界上第一个创建了罩杯系统的美国内衣品牌:Maidenform
2019/03/23 全球购物
大学生毕业自我鉴定范文
2013/11/03 职场文书
毕业生自我鉴定
2013/12/04 职场文书
经济管理毕业生求职信
2014/03/15 职场文书
小学生优秀评语大全
2014/04/22 职场文书
反对邪教标语
2014/06/30 职场文书
三严三实对照检查材料思想汇报
2014/09/28 职场文书
离婚协议书应该怎么写
2014/10/12 职场文书
节约用电倡议书
2015/04/28 职场文书
答谢酒会主持词
2015/07/02 职场文书
2016年母亲节寄语
2015/12/04 职场文书
电力安全学习心得体会
2016/01/18 职场文书