TP框架I方法详解

 

I方法是ThinkPHP众多单字母函数中的新成员,其命名来自于英文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.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.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,即表示不再进行任何的过滤。

TP框架I方法详解的更多相关文章

  1. TP中U方法详解

    U方法常用于ThinkPHP里的页面跳转 官方称为url组装, 就是根据某种规则组成一个url地址,这个功能就叫组装. 在ThinkPHP里,系统提供了一个封装的函数来处理url的组装,俗称U方法. ...

  2. laravel框架少见方法详解

    1.whereDate() 方法 $q->where('created_at', '>=', date('Y-m-d').' 00:00:00')); 以前查数据时,直接用where条件来 ...

  3. Python的Django框架中forms表单类的使用方法详解

    用户表单是Web端的一项基本功能,大而全的Django框架中自然带有现成的基础form对象,本文就Python的Django框架中forms表单类的使用方法详解. Form表单的功能 自动生成HTML ...

  4. laravel 框架配置404等异常页面的方法详解(代码示例)

    本篇文章给大家带来的内容是关于laravel 框架配置404等异常页面的方法详解(代码示例),有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助. 在Laravel中所有的异常都由Handl ...

  5. JAVA 注解的几大作用及使用方法详解

    JAVA 注解的几大作用及使用方法详解 (2013-01-22 15:13:04) 转载▼ 标签: java 注解 杂谈 分类: Java java 注解,从名字上看是注释,解释.但功能却不仅仅是注释 ...

  6. java的集合框架最全详解

    java的集合框架最全详解(图) 前言:数据结构对程序设计有着深远的影响,在面向过程的C语言中,数据库结构用struct来描述,而在面向对象的编程中,数据结构是用类来描述的,并且包含有对该数据结构操作 ...

  7. Java提高篇——equals()与hashCode()方法详解

    java.lang.Object类中有两个非常重要的方法: 1 2 public boolean equals(Object obj) public int hashCode() Object类是类继 ...

  8. Yii::app()方法详解

    Yii::app()方法详解 1.Yii::app()返回的是一个当前框架应用程序的对象 2.Yii::app()是framework/web/CWebApplication.php类实例化的对象,所 ...

  9. spring框架 AOP核心详解

    AOP称为面向切面编程,在程序开发中主要用来解决一些系统层面上的问题,比如日志,事务,权限等待,Struts2的拦截器设计就是基于AOP的思想,是个比较经典的例子. 一 AOP的基本概念 (1)Asp ...

随机推荐

  1. poj 1066(枚举+线段相交)

    Treasure Hunt Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 6328   Accepted: 2627 Des ...

  2. android studio 自定义路径安装报错"You are attempting to install the android SDK

    android studio 自定义路径安装报错"You are attempting to install the android SDK 解决方法: 出现这个提示 主要是安装 Andro ...

  3. 几何+暴力【p1959】 遗址[NOI导刊2009普及(6)]

    题目描述--> P1959 遗址_NOI导刊2009普及(6) 普通方法分析: 因为题目要求是找最大正方形(如果是长方形更麻烦. 讲真,题目不难,耗时间! 根据题目要求,我们要找的是正方形. 我 ...

  4. 【动态规划】矩形嵌套 (DGA上的动态规划)

    [动态规划]矩形嵌套 时间限制: 1 Sec  内存限制: 128 MB提交: 23  解决: 9[提交][状态][讨论版] 题目描述 有n个矩形,每个矩形可以用a,b来描述,表示长和宽.矩形X(a, ...

  5. JVM内存溢出及配置

    一.Java JVM内存介绍 JVM管理两种类型的内存,堆和非堆.按照官方的说法:“Java 虚拟机具有一个堆,堆是运行时数据区域,所有类实例和数组的内存均从此处分配.堆是在 Java 虚拟机启动时创 ...

  6. 「Baltic2015」Network

    题目描述 原文 The government of Byteland has decided that it is time to connect their little country to th ...

  7. 【树链剖分】【dfs序】【线段树】bzoj2836 魔法树

    这道题告诉我们:树链剖分的重标号就是dfs序. #include<cstdio> #include<algorithm> using namespace std; #defin ...

  8. 【函数式权值分块】【块状链表】bzoj3065 带插入区间K小值

    显然是块状链表的经典题.但是经典做法的复杂度是O(n*sqrt(n)*log^2(n))的,出题人明确说了会卡掉. 于是我们考虑每个块内记录前n个块的权值分块. 查询的时候差分什么的,复杂度就是O(n ...

  9. 【暴力】【推导】bzoj1088 [SCOI2005]扫雷Mine

    考虑右侧的一个格子是否放雷,只可能对其左侧的三个格子造成影响. 也就是说,若左侧一个格子旁的两个格子已经放了雷,对第三个格子也就唯一确定了. 因此只枚举前两个格子是否放雷,剩下的暴力判断是否合法即可. ...

  10. react-native热更新从零到成功中的各种坑

    https://github.com/reactnativecn/react-native-pushy/blob/master/docs/guide.md Android NDK暂时没有安装 在你的项 ...