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函数之子字符串替换 str_replace
Mar 23 PHP
PHP SEO优化之URL优化方法
Apr 21 PHP
php数组函数序列之krsort()- 对数组的元素键名进行降序排序,保持索引关系
Nov 02 PHP
PHP小教程之实现双向链表
Jun 12 PHP
php生成二维码时出现中文乱码的解决方法
Dec 18 PHP
php实现数组按指定KEY排序的方法
Mar 30 PHP
php简单复制文件的方法
May 09 PHP
浅析Laravel5中队列的配置及使用
Aug 04 PHP
PHP CURL采集百度搜寻结果图片不显示问题的解决方法
Feb 03 PHP
php实现简单加入购物车功能
Mar 07 PHP
基于Laravel实现的用户动态模块开发
Sep 21 PHP
php实现QQ小程序发送模板消息功能
Sep 18 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
PHP连接MSSQL2008/2005数据库(SQLSRV)配置实例
2014/10/22 PHP
ZF框架实现发送邮件的方法
2015/12/03 PHP
Docker配置PHP开发环境教程
2016/12/21 PHP
PHPUnit测试私有属性和方法功能示例
2018/06/12 PHP
javascript iframe中打开文件,并检测iframe存在否
2008/12/28 Javascript
javascript sudoku 数独智力游戏生成代码
2010/03/27 Javascript
用js正确判断用户名cookie是否存在的方法
2014/01/28 Javascript
jquery结合CSS使用validate实现漂亮的验证
2015/01/29 Javascript
javascript实现根据3原色制作颜色选择器的方法
2015/07/17 Javascript
基于jQuery实现仿百度首页换肤背景图片切换代码
2015/08/25 Javascript
jquery实现的V字形显示效果代码
2015/10/27 Javascript
使用vue.js2.0 + ElementUI开发后台管理系统详细教程(二)
2017/01/21 Javascript
JS中利用localStorage防止页面动态添加数据刷新后数据丢失
2017/03/10 Javascript
用vue和node写的简易购物车实现
2017/04/25 Javascript
ES6 迭代器(Iterator)和 for.of循环使用方法学习(总结)
2018/02/08 Javascript
常见的浏览器存储方式(cookie、localStorage、sessionStorage)
2019/05/07 Javascript
js获取 gif 的帧数的代码实例
2019/09/10 Javascript
vue实现弹幕功能
2019/10/25 Javascript
JavaScript中展开运算符及应用的实例代码
2021/01/14 Javascript
[05:17]DOTA2誓师:今天我们在这里 明天TI4等我!
2014/03/26 DOTA
python使用xlrd模块读写Excel文件的方法
2015/05/06 Python
python机器学习库常用汇总
2017/11/15 Python
python生成tensorflow输入输出的图像格式的方法
2018/02/12 Python
使用TensorFlow-Slim进行图像分类的实现
2019/12/31 Python
matlab中二维插值函数interp2的使用详解
2020/04/22 Python
PyCharm vs VSCode,作为python开发者,你更倾向哪种IDE呢?
2020/08/17 Python
css3中transition属性详解
2014/09/02 HTML / CSS
自动化系在校本科生求职信
2013/10/23 职场文书
经理职责范文
2013/11/08 职场文书
还款承诺书范文
2014/05/20 职场文书
2015年行政助理工作总结
2015/04/30 职场文书
党支部鉴定意见
2015/06/02 职场文书
2019行政前台转正申请书范文3篇
2019/08/15 职场文书
一篇文章带你了解Python和Java的正则表达式对比
2021/09/15 Python
详解Python中__new__方法的作用
2022/03/31 Python