thinkphp3.x中变量的获取和过滤方法详解


Posted in PHP onMay 20, 2016

本文实例讲述了thinkphp3.x中变量的获取和过滤方法。分享给大家供大家参考,具体如下:

这里我们来学习如何在ThinkPHP中使用变量和对变量进行过滤。

在Web开发过程中,我们经常需要获取系统变量或者用户提交的数据,这些变量数据错综复杂,而且一不小心就容易引起安全隐患,但是如果利用好ThinkPHP提供的变量获取功能,就可以轻松的获取和驾驭变量了。

一、获取变量

1.首先,我们来谈下如何获取变量。

第一种方式:传统获取方式,你仍然可以在开发过程中使用传统方式获取各种系统变量,例如:

$id = $_GET['id'];//获取get变量
$name = $_POST['name'];//获取post变量
$value = $_SESSION['var'];//获取session变量
$name = $_COOKIE['name'];//获取cookie变量
$file = $_SERVER['PHP_SELF'];//获取server变量

不建议直接使用传统方式获取,因为没有统一的安全处理机制,后期如果调整的话,改起来会比较麻烦。

第二种方式:使用Action类提供的动态方法

系统的Action类提供了对系统变量的增强获取方法,包括对GET、POST、PUT、REQUEST、SESSION、COOKIE、SERVER和GLOBALS参数,除了获取变量值外,还提供变量过滤和默认值支持,用法很简单,只需要在Action中调用下面方法:

$id = $this->_get('id');//获取get变量
$name = $this->_post('name');//获取post变量
$value = $this->_session('var');//获取session变量
$name = $this->_cookie('name');//获取cookie变量
$file = $this->_server('PHP_SELF');//获取server变量

调用格式为:

$this->方法名("变量名",["过滤方法"],["默认值"])

支持的方法名:

_get 获取GET参数
_post 获取POST参数
_param 自动判断请求类型获取GET、POST或者PUT参数
_request 获取REQUEST参数
_put 获取PUT参数
_session 获取$_SESSION参数
_cookie 获取$_COOKIE参数
_server 获取$_SERVER参数
_globals 获取$GLOBALS参数

变量名:(必须)是要获取的系统变量的名称

过滤方法:(可选)可以用任何的内置函数或者自定义函数名,如果没有指定的话,采用默认的htmlspecialchars函数进行安全过滤(由DEFAULT_FILTER 参数配置),参数就是前面方法名获取到的值,

也就是说如果调用:

$this->_get("name");

最终调用的结果就是 htmlspecialchars($_GET["name"]),如果要改变过滤方法,可以使用:

$this->_get("name","strip_tags");

默认值:(可选)是要获取的参数变量不存在的情况下设置的默认值,例如:

$this->_get("id","strip_tags",0);

如果$_GET["id"] 不存在的话,会返回0。

如果没有设置任何默认值的话,系统默认返回NULL。

其他方法的用法类似。

看起来好像差别不大,但是有一个明显的优势,就是如果我需要增加或者改变对这些变量做统一的过滤,一般不需要修改变量获取的代码,只是在项目配置文件中增加一个配置参数即可,例如:

'DEFAULT_FILTER'=>'strip_tags'

对所有的采用动态方式获取的变量使用strip_tags方法进行统一过滤,也可以支持多个过滤方法,例如:

'DEFAULT_FILTER'=>'strip_tags,htmlspecialchars'

表示先进行strip_tags过滤,然后再进行htmlspecialchars过滤。

如果你在获取某个变量的时候 需要自定义过滤方法,则可以改成:

$name = $this->_post('content','trim,strip_tags');
// 获取post变量并过滤

如果你在项目配置中设置了统一的变量过滤方法,但是希望对某些变量不进行过滤,则可以用:

$name = $this->_post('id','',0);

如果你的参数可能会来自于多个提交方式,那么可以使用_param方法来更方便的获取,例如:

$this->_param('id');

当前为get方式提交的时候,就等效于

$this->_get('id');

当前为post方式提交的时候,就等效于

$this->_post('id');

如果为put方式提交的话,就等效于

$this->_put('id');

其优点自然很明显,同一个方法可以接受不同提交类型的变量,不用手动做太多的判断再来获取不同的参数了。

二、获取URL参数

在某些情况下面,我们还有一种获取URL参数的特殊需求,一般来说,获取URL参数是采用get变量的方式就够用了,但是对于我们定制过的URL,或者采用了路由的情况下面,URL的参数可能会没有规律,这个时候,我们可以采用另外一种方式来获取。

例如,当前的URL地址是:

http://localhost/index.php/news/hello_world/thinkphp

我们要获取其中的参数,可以用:

$this->_param(0); // 获取news
$this->_param(1); // 获取hello_world
$this->_param(2); // 获取thinkphp

不过_param(数字) 方式的变量获取,仅对PATHINFO模式URL地址有效

三、变量过滤

前面我们已经了解了如何使用Action类提供的方法来进行变量获取和过滤了,但是在没有调用这些动态方法的前提下,我们怎么来进行数据过滤呢?

ThinkPHP还提供了两种方式来进行数据过滤操作:

第一:配置全局的变量过滤

这种情况是针对一些会在多使用的情况,可以通过配置全局过滤 简化操作,例如在项目配置文件中添加参数:

'VAR_FILTERS'=>'strip_tags'

则会对全局的get和post变量进行过滤,其他类型的系统变量需要自行过滤。

第二:在写入数据库之前进行变量过滤

如果你的变量数据是要写入到数据库的话,可以在数据写入数据库之前调用filter方法对数据进行安全过滤,例如:

$this->data($data)->filter('strip_tags')->add();

在执行add方法之前,会对$data数据进行strip_tags过滤处理。但是,这种方式下面,filter方法不支持多个过滤方法。

四、总结

使用ThinkPHP,我们可以轻松地对系统变量的获取和过滤,你的开发功力明显提升了不少。加油,后面还会讲解如何使用路由。

PHP 相关文章推荐
PHP用户指南-cookies部分
Oct 09 PHP
php设计模式 Prototype (原型模式)代码
Jun 26 PHP
PHP循环函数使用介绍之PHP基础入门教程
Sep 21 PHP
解决Codeigniter不能上传rar和zip压缩包问题
Mar 07 PHP
php开启openssl的方法
May 15 PHP
PHP扩展模块memcached长连接使用方法分析
Dec 24 PHP
php中mysql操作buffer用法详解
Mar 19 PHP
PHP中filter函数校验数据的方法详解
Jul 31 PHP
PHP基于mssql扩展远程连接MSSQL的简单实现方法
Oct 08 PHP
PHP正则验证字符串是否为数字的两种方法并附常用正则
Feb 27 PHP
laravel 数据迁移与 Eloquent ORM的实现方法
Apr 12 PHP
php 实现简单的登录功能示例【基于thinkPHP框架】
Dec 02 PHP
thinkphp3.x中session方法的用法分析
May 20 #PHP
PHP编写登录验证码功能 附调用方法
May 19 #PHP
一段实用的php验证码函数
May 19 #PHP
thinkphp3.x中cookie方法的用法分析
May 19 #PHP
thinkphp3.x中display方法及show方法的用法实例
May 19 #PHP
thinkphp3.x连接mysql数据库的方法(具体操作步骤)
May 19 #PHP
thinkphp3.x自定义Action、Model及View的简单实现方法
May 19 #PHP
You might like
在 PHP 中使用随机数的三个步骤
2006/10/09 PHP
第十二节--类的自动加载
2006/11/16 PHP
mysql_fetch_assoc和mysql_fetch_row的功能加起来就是mysql_fetch_array
2007/01/15 PHP
PHP 快速排序算法详解
2014/11/10 PHP
php生成验证码,缩略图及水印图的类分享
2016/04/07 PHP
Yii2中YiiBase自动加载类、引用文件方法分析(autoload)
2016/07/25 PHP
PHP随机数函数rand()与mt_rand()的讲解
2019/03/25 PHP
js保存当前路径(cookies记录)
2010/12/14 Javascript
js中document.getElementByid、document.all和document.layers区分介绍
2011/12/08 Javascript
将光标定位于输入框最右侧实现代码
2012/12/04 Javascript
JS隐藏参数post传值实例
2013/04/18 Javascript
jquery的父子兄弟节点查找示例代码
2014/03/03 Javascript
javascritp添加url参数将参数加入到url中
2014/09/25 Javascript
Bootstrap基础学习
2015/06/16 Javascript
贴近用户体验的Jquery日期、时间选择插件
2015/08/19 Javascript
jQuery实现默认是闭合的FAQ展开效果菜单
2015/09/14 Javascript
深入浅析JavaScript中的作用域和上下文
2016/03/26 Javascript
js面向对象编程总结
2017/02/16 Javascript
十分钟带你快速了解React16新特性
2017/11/10 Javascript
JS中图片压缩的方法小结
2017/11/14 Javascript
基于bootstrap写的一点localStorage本地储存
2017/11/21 Javascript
vue进行图片的预加载watch用法实例讲解
2018/02/07 Javascript
axios简单实现小程序延时loading指示
2018/07/30 Javascript
vue-cli基础配置及webpack配置修改的完整步骤
2019/10/20 Javascript
Python base64编码解码实例
2015/06/21 Python
Python控制Firefox方法总结
2019/06/03 Python
在Pandas中处理NaN值的方法
2019/06/25 Python
Python参数类型以及常见的坑详解
2019/07/08 Python
学点简单的Django之第一个Django程序的实现
2021/02/24 Python
外语专业毕业生自我评价分享
2013/10/05 职场文书
酒吧副总经理岗位职责
2013/12/10 职场文书
德语专业求职信
2014/03/12 职场文书
初中三好学生自我鉴定
2014/04/07 职场文书
应届生求职信范文
2014/05/26 职场文书
java调用Restful接口的三种方法
2021/08/23 Java/Android
MySql统计函数COUNT的具体使用详解
2022/08/14 MySQL