Thinkphp 控制器->输入变量(获取变量,变量过滤)
输入变量
在Web开发过程中,我们经常需要获取系统变量或者用户提交的数据,这些变量数据错综复杂,而且一不小心就容易引起安全隐患,但是如果利用好ThinkPHP提供的变量获取功能,就可以轻松的获取和驾驭变量了。
获取变量
虽然你仍然可以在开发过程中使用传统方式获取各种系统变量,例如:
但是我们不建议直接使用传统方式获取,因为没有统一的安全处理机制,后期如果调整的话,改起来会比较麻烦。所以,更好的方式是在框架中统一使用I函数进行变量获取和过滤。
I方法是ThinkPHP众多单字母函数中的新成员,其命名来自于英文Input(输入),主要用于更加方便和安全的获取系统输入变量,可以用于任何地方,用法格式如下:
I("变量类型.变量名",["默认值"],["过滤方法"],["额外数据源"])
变量类型是指请求方式或者输入类型,包括:

注意:变量类型不区分大小写。
变量名则严格区分大小写。
默认值和过滤方法均属于可选参数。
我们以GET变量类型为例,说明下I方法的使用:
支持默认值:
采用方法过滤:
支持直接获取整个变量类型,例如:
// 获取整个$_GET 数组
用同样的方式,我们可以获取post或者其他输入类型的变量,例如:
param变量类型是框架特有的支持自动判断当前请求类型的变量获取方式,例如:
echo I("param.id");
如果当前请求类型是GET,那么等效于 $_GET["id"],如果当前请求类型是POST或者PUT,那么相当于获取 $_POST["id"] 或者 PUT参数id。
由于param类型是I函数默认获取的变量类型,因此事实上param变量类型的写法可以简化为:
3.2.2新增了path和data两个变量类型,用法如下:
path类型变量可以用于获取URL参数(必须是PATHINFO模式参数有效,无论是GET还是POST方式都有效),例如:当前访问URL地址是 http://serverName/index.php/New/2013/06/01
那么我们可以通过
data类型变量可以用于获取不支持的变量类型的读取,例如:
变量过滤
如果你没有在调用I函数的时候指定过滤方法的话,系统会采用默认的过滤机制(由DEFAULT_FILTER配置),事实上,该参数的默认设置是:
也就说,I方法的所有获取变量如果没有设置过滤方法的话都会进行htmlspecialchars过滤,那么:
同样,该参数也可以设置支持多个过滤,例如:
设置后,我们在使用:
如果我们在使用I方法的时候 指定了过滤方法,那么就会忽略DEFAULT_FILTER的设置,例如:
I方法的第三个参数如果传入函数名,则表示调用该函数对变量进行过滤并返回(在变量是数组的情况下自动使用array_map进行过滤处理),否则会调用PHP内置的filter_var方法进行过滤处理,例如:
表示 会对$_POST["email"] 进行 格式验证,如果不符合要求的话,返回空字符串。(关于更多的验证格式,可以参考 官方手册的filter_var用法。)或者可以用下面的字符标识方式:
可以支持的过滤名称必须是filter_list方法中的有效值(不同的服务器环境可能有所不同),可能支持的包括:
在有些特殊的情况下,我们不希望进行任何过滤,即使DEFAULT_FILTER已经有所设置,可以使用:
一旦过滤参数设置为空字符串或者false,即表示不再进行任何的过滤。
在Web开发过程中,我们经常需要获取系统变量或者用户提交的数据,这些变量数据错综复杂,而且一不小心就容易引起安全隐患,但是如果利用好ThinkPHP提供的变量获取功能,就可以轻松的获取和驾驭变量了。
获取变量
虽然你仍然可以在开发过程中使用传统方式获取各种系统变量,例如:
$id = $_GET["id"]; // 获取get变量 $name = $_POST["name"]; // 获取post变量 $value = $_SESSION["var"]; // 获取session变量 $name = $_COOKIE["name"]; // 获取cookie变量 $file = $_SERVER["PHP_SELF"]; // 获取server变量
但是我们不建议直接使用传统方式获取,因为没有统一的安全处理机制,后期如果调整的话,改起来会比较麻烦。所以,更好的方式是在框架中统一使用I函数进行变量获取和过滤。
I方法是ThinkPHP众多单字母函数中的新成员,其命名来自于英文Input(输入),主要用于更加方便和安全的获取系统输入变量,可以用于任何地方,用法格式如下:
I("变量类型.变量名",["默认值"],["过滤方法"],["额外数据源"])
变量类型是指请求方式或者输入类型,包括:
注意:变量类型不区分大小写。
变量名则严格区分大小写。
默认值和过滤方法均属于可选参数。
我们以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"] 则返回空字符串
采用方法过滤:
// 采用htmlspecialchars方法对$_GET["name"] 进行过滤,如果不存在则返回空字符串 echo I("get.name","","htmlspecialchars");
支持直接获取整个变量类型,例如:
// 获取整个$_GET 数组
I("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类型是I函数默认获取的变量类型,因此事实上param变量类型的写法可以简化为:
I("id"); // 等同于 I("param.id") I("name"); // 等同于 I("param.name")
3.2.2新增了path和data两个变量类型,用法如下:
path类型变量可以用于获取URL参数(必须是PATHINFO模式参数有效,无论是GET还是POST方式都有效),例如:当前访问URL地址是 http://serverName/index.php/New/2013/06/01
那么我们可以通过
echo I("path.1"); // 输出2013 echo I("path.2"); // 输出06 echo I("path.3"); // 输出01
data类型变量可以用于获取不支持的变量类型的读取,例如:
I("data.file1","","",$_FILES);
变量过滤
如果你没有在调用I函数的时候指定过滤方法的话,系统会采用默认的过滤机制(由DEFAULT_FILTER配置),事实上,该参数的默认设置是:
// 系统默认的变量过滤机制 "DEFAULT_FILTER" => "htmlspecialchars"
也就说,I方法的所有获取变量如果没有设置过滤方法的话都会进行htmlspecialchars过滤,那么:
// 等同于 htmlspecialchars($_GET["name"]) I("get.name");
同样,该参数也可以设置支持多个过滤,例如:
"DEFAULT_FILTER" => "strip_tags,htmlspecialchars"
设置后,我们在使用:
// 等同于 htmlspecialchars(strip_tags($_GET["name"])) I("get.name");
如果我们在使用I方法的时候 指定了过滤方法,那么就会忽略DEFAULT_FILTER的设置,例如:
// 等同于 strip_tags($_GET["name"]) echo I("get.name","","strip_tags");
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_char sunsafe_raw email url number_int number_float magic_quotes callback
在有些特殊的情况下,我们不希望进行任何过滤,即使DEFAULT_FILTER已经有所设置,可以使用:
// 下面两种方式都不采用任何过滤方法 I("get.name","",""); I("get.id","",false);
一旦过滤参数设置为空字符串或者false,即表示不再进行任何的过滤。
声明:该文观点仅代表作者本人,牛骨文系教育信息发布平台,牛骨文仅提供信息存储空间服务。
- 上一篇: PHP安全过滤函数
- 下一篇: C语言sort函数如何使用