I 函数的作用是获取系统变量,必要时还可以对变量值进行过滤及强制转化,I 函数的语法格式:

I('变量类型.变量名/修饰符',['默认值'],['过滤方法或正则'],['额外数据源'])

一、获取变量

在PHP中获取变量值的方法有很多,比如:$_GET['变量名'],$_POST['变量名'],$_SESSION['变量名'],$_COOKIE['变量名'],$_SERVER['变量名'] 都可以获取相应的变量值,但在thinkphp中为了安全的原因建议统一使用 I 函数来获取变量值。例如:获取 URL 地址栏中参数 id 的值,在php中我们用 $_GET['id'] 来获取,在thinkphp中我们可以用 I('get.id') 来获取。同样的, $_POST['id'] 就用 I('post.id') 取代,I 函数的语法格式中的变量类型就是指的像 get 和 post 之类的请求方式,类似的变量类型还包括:

变量类型 含义
get 获取GET参数
post 获取POST参数
param 自动判断请求类型获取GET、POST或者PUT参数
request 获取REQUEST 参数
put 获取PUT 参数
session 获取 $_SESSION 参数
cookie 获取 $_COOKIE 参数
server 获取 $_SERVER 参数
globals 获取 $GLOBALS参数
path 获取 PATHINFO模式的URL参数
data 获取 其他类型的参数,需要配合额外数据源参数

如果要获取的变量类型是get、post 或 put,可以统一用 param 变量类型,param 变量类型是框架特有的支持自动判断当前请求类型的变量获取方式,例如:I('param.id') ,如果当前请求类型是GET,那么等效于 $_GET['id'],如果当前请求类型是POST或者PUT,那么相当于获取 $_POST['id'] 或者 PUT参数id。而事实上当 I 函数获取的变量类型是param时变量类型可以省略直接写为:I('变量名') ,那么 $_GET['id']、$_POST['id'] 都可以简写为:I('id') 。但当变量类型为其他类型时就不能这么简写,比如 I('cookie.id')、I('session.id')就不能简写。

注意:I 函数的变量类型不区分大小写,但变量名严格区分大小写,比如 I('get.id') 可以写成 I('GET.id'),但不能写成 I('get.ID')

二、变量过滤

I 函数本身默认的过滤机制是 htmlspecialchars,因为在配置文件中配置了:

// 系统默认的变量过滤机制
'DEFAULT_FILTER' => 'htmlspecialchars'

所以 I('post.变量名') 就等同于 htmlspecialchars($_POST('变量名')),如果 I 函数自身带了过滤方法,则用自身带的过滤机制过滤变量,比如:

I('post.email','请输入正确的email地址',FILTER_VALIDATE_EMAIL);

表示会对$_POST['email'] 进行格式验证判断是否符合 email 的格式要求,如果不符合的话,返回提示信息。上面的代码也可以简化:

I('post.email','请输入正确的email地址','email')

请注意,上面的 FILTER_VALIDATE_EMAIL 是不带引号的,下面的 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

但我发现用简写的过滤名有时也会出现问题,我在我的笔记本上测试 print_r(filter_list()) 是包含 email 的,但 I('email','请输入正确的email地址','email') 却不能正确判断,改成 I('email','请输入正确的email地址',FILTER_VALIDATE_EMAIL) 就没问题。

I 函数的过滤方法也能支持正则表达式,如果要过滤的方法比较复制的话可以考虑使用正则表达式。在有些特殊的情况下,我们不希望进行任何过滤,即使DEFAULT_FILTER已经有所设置,可以使用:

// 下面两种方式都不采用任何过滤方法
I('get.name','','');
I('get.id','',false);

三、变量修饰符

变量修饰符和变量名称之间用“/”分割开来,变量修饰符的作用是强制转化变量的字符类型,比如:

I('get.id/d'); // 强制变量转换为整型
I('post.name/s'); // 强制转换变量为字符串类型
I('post.ids/a'); // 强制变量转换为数组类型

可以使用的修饰符包括:

修饰符 作用
s 强制转换为字符串类型
d 强制转换为整型类型
b 强制转换为布尔类型
a 强制转换为数组类型
f 强制转换为浮点类型

Thinkphp中的 I 函数(Thinkphp3.2.3版本)的更多相关文章

  1. Thinkphp中的U函数(Thinkphp3.2.3版本)

    U函数的作用是根据当前的URL设置生成对应的URL地址,使用U函数可以确保项目在移植过程中不受环境的影响. U方法的定义规则如下(方括号内参数根据实际应用决定): U('地址表达式',['参数'],[ ...

  2. Thinkphp中的A 函数(Thinkphp3.2.3版本)

    A函数是TP中实例化控制器的一个快捷函数,它的语法结构如下: A('模块/控制器') //当控制器层名称不是 Controller 时须这样写 A('模块/控制器','控制器层名称') 如果要调用的控 ...

  3. ThinkPHP中的快捷函数小结

    U() 制作url地址的快捷函数 C(名称) 获得配置变量(convertion.php config.php)信息C(名称,值) 设置配置变量信息 L() 获得语言变量信息E() 给页面输出错误信息 ...

  4. thinkphp3.1课程 1-2 thinkphp中入口文件的实质是什么

    thinkphp3.1课程 1-2 thinkphp中入口文件的实质是什么 一.总结 一句话总结:在thinkphp中,我们访问的始终是入口文件,并没有主动去访问任何一个其他文件,只不过在入口文件体内 ...

  5. Thinkphp模板中使用自定义函数的方法

    注意:自定义函数要放在项目应用目录/common/common.php中. 这里是关键. 模板变量的函数调用格式:{$varname|function1|function2=arg1,arg2,### ...

  6. 关于thinkphp3.2中的U函数使用的是二级域名但是U函数生成的还是WWW开头的域名

    关于thinkphp3.2中的U函数使用的是二级域名但是U函数生成的还是WWW开头的域名 查看代码是由于U函数中对开启 APP_SUB_DOMAIN_DEPLOY  子域名部署 加的额外设置 如果你使 ...

  7. thinkphp模板中使用自定义函数

    注意:自定义函数要放在项目应用目录/common/common.php中. 这里是关键. 模板变量的函数调用格式:{$varname|function1|function2=arg1,arg2,### ...

  8. thinkphp中的内置操作数据库与mysql中的函数汇总

    8.4.4 Model类getModelName() 获取当前Model的名称getTableName() 获取当前Model的数据表名称switchModel(type,vars=array()) ...

  9. 封装一个函数,在ThinkPHP中一定程度上取代success和error

    1.下载jq2.下载layer3.根据自己的项目配置,将上述2文件放到样式目录中4.在Application/Common/function.php中添加如下代码function msg($msg,$ ...

随机推荐

  1. SQL语句取多列的最小值(排除0)

    经常遇到获取数据表中多个列的最小值和最大值,例如: 获取这 4个价格的最小值和最大值: SELECT( SELECT min(minPrice) FROM ( VALUES (IIF(MarketSi ...

  2. R语言基础1

    ----------------------------------R语言学习与科研应用,科研作图,数据统计挖掘分析,群:719954246-------------------------- 我们将 ...

  3. Mybatis学习日志

    在Mybatis深入学习的一周中,总感觉跟着师傅的视屏讲解什么都能懂,但实际自己操作的时候才发现自己一脸懵逼,不知道从何入手.但还好自己做了点笔记.在此记录一下自己浅度学习Mybatis遇到几个小问题 ...

  4. LeetCode & Q20-Valid Parentheses-Easy

    Stack String Description: Given a string containing just the characters '(', ')', '{', '}', '[' and ...

  5. js正则表达语法

    /* *通过量词可以设置一个内容出现的次数 *量词只对它前边的一个内容起作用.所以在作用多个时需要用小括号()来向计算机说明这是一个整体. *-{n}代表正好出现n次. *-{m,n}出现了m-n次. ...

  6. Centos7安装openvpn及客户端配置

    1.openvpn介绍 VPN直译就是虚拟专用通道,是提供给企业之间或者个人与公司之间安全数据传输的隧道,使用OpenSSL加密库中的SSLv3/TLSv1协议函数库. 目前OpenVPN能在Sola ...

  7. ASP.NET MVC 5 SmartCode Scaffolding for Visual Studio.Net

    介绍 ASP.NET MVC 5 SmartCode Scaffolding是集成在Visual Studio.Net开发工具中一个ASP.NET MVC Web应用程序代码生成框架,使用SmartC ...

  8. Python内置函数(28)——iter

    英文文档: iter(object[, sentinel]) Return an iterator object. The first argument is interpreted very dif ...

  9. redis入门(14)redis集群下的数据分区存储

    redis入门(10)redis集群下的数据分区存储

  10. spring3——IOC之基于XML的依赖注入(DI )

    我们知道spring容器的作用是负责对象的创建和对象间关系的维护,在上一篇博客中我们讲到spring容器会先调用对象的无参构造方法创建一个空值对象,那么接下来容器就会对对象的属性进行初始化,这个初始化 ...