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-accelerator网站加速PHP缓冲的方法
Jul 30 PHP
PHP 身份证号验证函数
May 07 PHP
PHP 柱状图实现代码
Dec 04 PHP
php $_SERVER["REQUEST_URI"]获取值的通用解决方法
Jun 21 PHP
PHP编码规范之注释和文件结构说明
Jul 09 PHP
php header示例代码(推荐)
Sep 08 PHP
PHP面向接口编程 耦合设计模式 简单范例
Mar 23 PHP
解析在apache里面给php写虚拟目录的详细方法
Jun 24 PHP
php官方微信接口大全(微信支付、微信红包、微信摇一摇、微信小店)
Dec 21 PHP
PHP编程获取音频文件时长的方法【基于getid3类】
Apr 20 PHP
Yii2.0框架实现带分页的多条件搜索功能示例
Feb 20 PHP
Laravel框架学习笔记之批量更新数据功能
May 30 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
IIS php环境配置PHP5 MySQL5 ZendOptimizer phpmyadmin安装与配置
2008/11/18 PHP
php 验证码(倾斜,正弦干扰线,黏贴,旋转)
2013/06/29 PHP
WordPress特定文章对搜索引擎隐藏或只允许搜索引擎查看
2015/12/31 PHP
Zend Framework教程之Bootstrap类用法概述
2016/03/14 PHP
IE6不能修改NAME问题的解决方法
2010/09/03 Javascript
推荐11款jQuery开发的复选框和单选框美化插件
2011/08/02 Javascript
js操作textarea 常用方法总结
2012/12/03 Javascript
js实现在同一窗口浏览图片
2014/09/17 Javascript
js实现大转盘抽奖游戏实例
2015/06/24 Javascript
使用coffeescript编写node.js项目的方法汇总
2015/08/05 Javascript
javascript实现下拉提示选择框
2015/12/29 Javascript
js导出excel文件的简洁方法(推荐)
2016/11/02 Javascript
以BootStrap Tab为例写一个前端组件
2017/07/25 Javascript
最通俗易懂的javascript变量提升详解
2017/08/05 Javascript
浅谈 vue 中的 watcher
2017/12/04 Javascript
nodejs图片处理工具gm用法小结
2018/12/12 NodeJs
VUE+elementui组件在table-cell单元格中绘制微型echarts图
2020/04/20 Javascript
实现vuex原理的示例
2020/10/21 Javascript
python实现的一个火车票转让信息采集器
2014/07/09 Python
python爬虫实战之爬取京东商城实例教程
2017/04/24 Python
基于wxPython的GUI实现输入对话框(1)
2019/02/27 Python
详解Python使用Plotly绘图工具,绘制甘特图
2019/04/02 Python
Python matplotlib画图与中文设置操作实例分析
2019/04/23 Python
python实现上传文件到linux指定目录的方法
2020/01/03 Python
python根据字典的键来删除元素的方法
2020/08/16 Python
利用CSS3的特性改变文本选中时的颜色
2013/09/11 HTML / CSS
Application Cache未缓存文件无法访问无法加载问题
2014/05/31 HTML / CSS
享誉全球的多元化时尚精品购物平台:Farfetch发发奇(支持中文)
2017/08/08 全球购物
成绩单公证书
2014/04/10 职场文书
公务员检讨书
2014/11/01 职场文书
私用公车造成事故检讨书
2014/11/16 职场文书
义诊活动通知
2015/04/24 职场文书
暗恋桃花源观后感
2015/06/12 职场文书
团干部培训班心得体会
2016/01/06 职场文书
Django使用redis配置缓存的方法
2021/06/01 Redis
Python实现日志实时监测的示例详解
2022/04/06 Python