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 引用是个坏习惯
Mar 12 PHP
php带密码功能并下载远程文件保存本地指定目录 修改加强版
May 16 PHP
在VS2008中编译MYSQL5.1.48的方法
Jul 03 PHP
PhpMyAdmin出现export.php Missing parameter: what /export_type错误解决方法
Aug 09 PHP
PHP删除目录及目录下所有文件的方法详解
Jun 06 PHP
基于php常用函数总结(数组,字符串,时间,文件操作)
Jun 27 PHP
php5.5新数组函数array_column使用
Jul 08 PHP
Zend Framework教程之视图组件Zend_View用法详解
Mar 05 PHP
Thinkphp单字母函数使用指南
May 08 PHP
thinkPHP5.0框架整体架构总览【应用,模块,MVC,驱动,行为,命名空间等】
Mar 25 PHP
Apache+PHP+MySQL搭建PHP开发环境图文教程
Aug 06 PHP
php png失真的原因及解决办法
Nov 17 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
Email+URL的判断和自动转换函数
2006/10/09 PHP
一个简易需要注册的留言版程序
2006/10/09 PHP
php 3行代码的分页算法(求起始页和结束页)
2009/10/21 PHP
解析关于wamp启动是80端口被占用的问题
2013/06/21 PHP
yii上传文件或图片实例
2014/04/01 PHP
php中删除数组的第一个元素和最后一个元素的函数
2015/03/07 PHP
学习php设计模式 php实现策略模式(strategy)
2015/12/07 PHP
js 左右悬浮对联广告特效代码
2014/12/12 Javascript
原生javascript实现隔行换色
2015/01/04 Javascript
浅谈javascript函数式编程
2015/09/06 Javascript
基于JavaScript实现根据手机定位获取当前具体位置(X省X市X县X街道X号)
2015/12/29 Javascript
JS基于正则实现数字千分位用逗号分隔的方法
2017/06/16 Javascript
BootStrap Table实现server分页序号连续显示功能(当前页从上一页的结束序号开始)
2017/09/12 Javascript
你了解vue3.0响应式数据怎么实现吗
2019/06/07 Javascript
使用p5.js临摹动态图形
2019/10/23 Javascript
[15:28]DOTA2 HEROS教学视频教你分分钟做大人-剧毒术士
2014/06/13 DOTA
python实现应用程序在右键菜单中添加打开方式功能
2017/01/09 Python
python下os模块强大的重命名方法renames详解
2017/03/07 Python
梯度下降法介绍及利用Python实现的方法示例
2017/07/12 Python
Python SVM(支持向量机)实现方法完整示例
2018/06/19 Python
Python 实现某个功能每隔一段时间被执行一次的功能方法
2018/10/14 Python
对python多线程中互斥锁Threading.Lock的简单应用详解
2019/01/11 Python
win10下安装Anaconda的教程(python环境+jupyter_notebook)
2019/10/23 Python
Python 随机生成测试数据的模块:faker基本使用方法详解
2020/04/09 Python
TensorFlow Autodiff自动微分详解
2020/07/06 Python
Python 利用flask搭建一个共享服务器的步骤
2020/12/05 Python
详解Python GUI编程之PyQt5入门到实战
2020/12/10 Python
狗狗玩具、零食和咀嚼物的月度送货服务:Super Chewer
2018/08/22 全球购物
英国玛莎百货澳大利亚:Marks & Spencer Australia
2019/08/30 全球购物
计算机应用与科学个人的自我评价
2013/11/15 职场文书
社区服务活动总结
2014/05/07 职场文书
毕业生找工作自荐书
2014/06/30 职场文书
2014年度考核工作总结
2014/12/24 职场文书
水电工程师岗位职责
2015/02/13 职场文书
2015年施工员工作总结范文
2015/04/20 职场文书
Python实现科学占卜 让视频自动打码
2022/04/09 Python