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水印技术
Feb 14 PHP
PHP中使用unset销毁变量并内存释放问题
Jul 05 PHP
php下Memcached入门实例解析
Jan 05 PHP
PHP实现的下载远程图片自定义函数分享
Jan 28 PHP
php metaphone()函数的定义和用法
May 15 PHP
PHP实现无限分类的实现方法
Nov 14 PHP
老生常谈php 正则中的i,m,s,x,e分别表示什么
Mar 02 PHP
PHP注释语法规范与命名规范详解篇
Jan 21 PHP
PHP unlink与rmdir删除目录及目录下所有文件实例代码
Feb 07 PHP
PHP使用curl_multi_select解决curl_multi网页假死问题的方法
Aug 15 PHP
php tpl模板引擎定义与使用示例
Aug 09 PHP
Laravel框架验证码类用法实例分析
Sep 11 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将csv文件导入到mysql数据库的方法
2014/12/24 PHP
Zend Framework教程之Zend_Config_Ini用法分析
2016/03/23 PHP
PHP接口并发测试的方法(推荐)
2016/12/15 PHP
PHP实现一个限制实例化次数的类示例
2019/09/16 PHP
基于jQuery的弹出警告对话框美化插件(警告,确认和提示)
2010/06/10 Javascript
jquery radio 操作代码
2011/03/16 Javascript
基于jQuery的获取标签名的代码
2012/07/16 Javascript
JavaScript高级程序设计 阅读笔记(十七) js事件
2012/08/14 Javascript
JavaScript怎么判断图片是否加载完成以便获取其尺寸
2014/05/08 Javascript
js 模式窗口(模式对话框和非模式对话框)的使用介绍
2014/07/17 Javascript
JavaScript中九种常用排序算法
2014/09/02 Javascript
js的回调函数详解
2015/01/05 Javascript
Node.js+Express配置入门教程详解
2016/05/19 Javascript
JS实现鼠标框选效果完整实例
2016/06/20 Javascript
jquery 禁止鼠标右键并监听右键事件
2017/04/27 jQuery
underscore之Chaining_动力节点Java学院整理
2017/07/10 Javascript
JavaScript数组,JSON对象实现动态添加、修改、删除功能示例
2018/05/26 Javascript
vue2.0 路由模式mode="history"的作用
2018/10/18 Javascript
微信小程序开发的基本流程步骤
2019/01/31 Javascript
微信小程序swiper组件实现抖音翻页切换视频功能的实例代码
2020/06/24 Javascript
electron踩坑之dialog中的callback解决
2020/10/06 Javascript
[01:06:26]全国守擂赛第二周 Team Coach vs DeMonsTer
2020/04/28 DOTA
新手该如何学python怎么学好python?
2008/10/07 Python
python使用正则表达式提取网页URL的方法
2015/05/26 Python
利用Python批量生成任意尺寸的图片
2016/08/29 Python
python实时分析日志的一个小脚本分享
2017/05/07 Python
使用Django和Postgres进行全文搜索的实例代码
2020/02/13 Python
Python内存泄漏和内存溢出的解决方案
2020/09/26 Python
VICHY薇姿美国官方网站:欧洲药房第一的抗衰老品牌
2017/11/22 全球购物
Linux上比较文件的命令都有哪些
2012/02/24 面试题
如何开发一个JQuery插件
2016/07/28 面试题
文员的职业生涯规划发展方向
2014/02/08 职场文书
机关单位人员学雷锋心得体会
2014/03/10 职场文书
奥林匹克运动会口号
2014/06/19 职场文书
陕西导游词
2015/02/04 职场文书
古诗文之爱国名句(77句)
2019/09/24 职场文书