ThinkPHP3.1快速入门5变量

本篇我们来学习如何在ThinkPHP中使用变量和对变量进行过滤。
在Web开发过程中,我们经常需要获取系统变量或者用户提交的数据,这些变量数据错综复杂,而且一不小心就容易引起安全隐患,但是如果利用好ThinkPHP提供的变量获取功能,就可以轻松的获取和驾驭变量了。
如果你使用的是3.1.3以上版本,那么可以直接参考新版的I函数用法,基本上涵盖了本章的内容。

获取变量

首先,我们来谈下如何获取变量。
第一种方式:传统获取方式
你仍然可以在开发过程中使用传统方式获取各种系统变量,例如:
$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,我们可以轻松地对系统变量的获取和过滤,你的开发功力明显提升了不少。加油,后面还会讲解如何使用路由。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


(1)创建数据表: CREATE TABLE IF NOT EXISTS `think_form` (   `id` smallint(4) unsigned NOT NULL AUTO_INCREMENT,
组合查询的主体还是采用数组方式查询,只是加入了一些特殊的查询支持,包括字符串模式查询(_string)、复合查询(_complex)、请求字符串查询(_query),混合查询中的特殊查询每次查询只能定义一个,由于采用数组的
(1)创建模版:/App/Home/View/Form/edit.html   <FORM method=\"post\" action=\"__URL__/update\">
自定义配置文件user.php: <?php return array(    \'sex\'=>\'man\', ); config.php: <?php return array(
在一些成熟的CMS系统中,后台一般都包含一个配置中心(如织梦后台中系统设置),以方便站长在后台修改配置文件;那么这个功能是如果实现的呢?在ThinkPHP中有没有捷径可走呢?答案肯定是有的。下面大概说一下这个功能
废话不多说先上图预览下,即本博客的分页; 这个分页类是在thinkphp框架内置的分页类的基础上修改而来,原分页类的一些设计,在实际运用中感觉不是很方便;
在php中截取字符串的函数有很多,而在thinkphp中也可以直接使用php的函数,本文给大家简单的介绍thinkPHP模板中截取字符串的具体用法,希望能对各位有所帮助。
thinkphp开发图片上传,图片异步上传是目前比较方便的功能,这里我就不写css文件了,将代码写出来。
配置数据库:/app/Common/Conf/config.php 方法一: // 添加数据库配置信息 \'DB_TYPE\'   => \'mysql\',// 数据库类型
/app/Home/Controller/IndexController.class.php
(1)创建数据表: CREATE TABLE IF NOT EXISTS `think_data` (   `id` int(8) unsigned NOT NULL AUTO_INCREMENT,
(1)控制器设置:/app/Home/Controller/IndexController.class.php <?php namespace HomeController; use ThinkController;
(1)普通模式 http://localhost/index.php?m=module&a=action&var=value m参数表示模块,a操作表示操作(模块和操作的URL参数名称是可以配置的),后面的表示其他GET参数。
入库的时候用htmlspecialchars()处理含有html代码的内容 输出的时候用htmlspecialchars_decode()处理含有html代码的内容
<?php define(\'APP_NAME\',\'app\'); define(\'APP_PATH\',\'./app/\'); define(\'APP_DEBUG\',TRUE); // 开启调试模式
(1)创建控制器中定义read方法:/App/Home/Controller/FormController.class.php public function read($id=0){
一、实现不同字段相同的查询条件 $User = M(\"User\"); // 实例化User对象 $map[\'name|title\'] = \'thinkphp\';
如果你的数据完全是内部操作写入而不是通过表单的话(也就是说可以充分信任数据的安全),那么可以直接使用add方法,如:
查询表达式的使用格式: $map[\'字段名\'] = array(\'表达式\',\'查询条件\'); 表达式不分大小写,支持的查询表达式有下面几种,分别表示的含义是:
一、使用字符串作为查询条件 $User = M(\"User\"); // 实例化User对象 $User->where(\'type=1 AND status=1\')->select();