欢迎各位兄弟 发布技术文章

这里的技术是共享的

You are here

ThinkPHP3.1快速入门(5)变量

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

获取变量

首先,我们来谈下如何获取变量。
第一种方式:传统获取方式
你仍然可以在开发过程中使用传统方式获取各种系统变量,例如:
  1. $id = $_GET['id']; // 获取get变量
  2. $name = $_POST['name'];  // 获取post变量
  3. $value = $_SESSION['var']; // 获取session变量
  4. $name = $_COOKIE['name']; // 获取cookie变量
  5. $file =  $_SERVER['PHP_SELF']; // 获取server变量
复制代码
 
不建议直接使用传统方式获取,因为没有统一的安全处理机制,后期如果调整的话,改起来会比较麻烦。
第二种方式:使用Action类提供的动态方法
系统的Action类提供了对系统变量的增强获取方法,包括对GET、POST、PUT、REQUEST、SESSION、COOKIE、SERVER和GLOBALS参数,除了获取变量值外,还提供变量过滤和默认值支持,用法很简单,只需要在Action中调用下面方法:
  1. $id = $this->_get('id'); // 获取get变量
  2. $name = $this->_post('name'); // 获取post变量
  3. $value = $this->_session('var'); // 获取session变量
  4. $name = $this->_cookie('name'); // 获取cookie变量
  5. $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 参数配置),参数就是前面方法名获取到的值,也就是说如果调用:
  1. $this->_get("name");
复制代码
 
最终调用的结果就是 htmlspecialchars($_GET["name"]),如果要改变过滤方法,可以使用:
  1. $this->_get("name","strip_tags");
复制代码
 
默认值:(可选)是要获取的参数变量不存在的情况下设置的默认值,例如:
  1. $this->_get("id","strip_tags",0);
复制代码
 
如果$_GET["id"] 不存在的话,会返回0。
如果没有设置任何默认值的话,系统默认返回NULL。
其他方法的用法类似。
看起来好像差别不大,但是有一个明显的优势,就是如果我需要增加或者改变对这些变量做统一的过滤,一般不需要修改变量获取的代码,只是在项目配置文件中增加一个配置参数即可,例如:
  1. 'DEFAULT_FILTER'=>'strip_tags'
复制代码
 
对所有的采用动态方式获取的变量使用strip_tags方法进行统一过滤,也可以支持多个过滤方法,例如:
  1. 'DEFAULT_FILTER'=>'strip_tags,htmlspecialchars'
复制代码
 
表示先进行strip_tags过滤,然后再进行htmlspecialchars过滤。
如果你在获取某个变量的时候 需要自定义过滤方法,则可以改成:
  1. $name = $this->_post('content','trim,strip_tags'); // 获取post变量并过滤
复制代码
 
如果你在项目配置中设置了统一的变量过滤方法,但是希望对某些变量不进行过滤,则可以用:
  1. $name = $this->_post('id','',0);
复制代码
 
如果你的参数可能会来自于多个提交方式,那么可以使用_param方法来更方便的获取,例如:
  1. $this->_param('id');
复制代码
 
当前为get方式提交的时候,就等效于
  1. $this->_get('id');
复制代码
 
当前为post方式提交的时候,就等效于
  1. $this->_post('id');
复制代码
 
如果为put方式提交的话,就等效于
  1. $this->_put('id');
复制代码
 
其优点自然很明显,同一个方法可以接受不同提交类型的变量,不用手动做太多的判断再来获取不同的参数了。

获取URL参数

在某些情况下面,我们还有一种获取URL参数的特殊需求,一般来说,获取URL参数是采用get变量的方式就够用了,但是对于我们定制过的URL,或者采用了路由的情况下面,URL的参数可能会没有规律,这个时候,我们可以采用另外一种方式来获取。
例如,当前的URL地址是:
  1. http://localhost/index.php/news/hello_world/thinkphp
复制代码
 
我们要获取其中的参数,可以用:
  1. $this->_param(0); // 获取news
  2. $this->_param(1); // 获取hello_world
  3. $this->_param(2); // 获取thinkphp
复制代码
 
不过_param(数字) 方式的变量获取,仅对PATHINFO模式URL地址有效

变量过滤

前面我们已经了解了如何使用Action类提供的方法来进行变量获取和过滤了,但是在没有调用这些动态方法的前提下,我们怎么来进行数据过滤呢?
ThinkPHP还提供了两种方式来进行数据过滤操作:
第一:配置全局的变量过滤
这种情况是针对一些会在多使用的情况,可以通过配置全局过滤 简化操作,例如在项目配置文件中添加参数:
  1. 'VAR_FILTERS'=>'strip_tags'
复制代码
 
则会对全局的get和post变量进行过滤,其他类型的系统变量需要自行过滤。

第二:在写入数据库之前进行变量过滤
如果你的变量数据是要写入到数据库的话,可以在数据写入数据库之前调用filter方法对数据进行安全过滤,例如:
  1. $this->data($data)->filter('strip_tags')->add();
复制代码
 
在执行add方法之前,会对$data数据进行strip_tags过滤处理。但是,这种方式下面,filter方法不支持多个过滤方法。

总结

使用ThinkPHP,我们可以轻松地对系统变量的获取和过滤,你的开发功力明显提升了不少。加油,后面还会讲解如何使用路由。

来自 
http://www.thinkphp.cn/info/117.html

Generalsphper01月06日
更新略慢...
electroApache05月15日
先快噜一遍,然后边做变找。
Aexus04月17日
已阅
jtwpf2014年11月27日
其实看不大懂,求全局变量
回复boyzhaotian04月28日
同求
htao19922014年11月25日
不会单选框的自动验证
lm010972014年10月20日
非常简单易学
iHero_he2014年10月18日
这章也看完了。
完美的神速2014年06月01日
说真心话 看了那么长时间的教程 感觉比较复杂 不适合初学php的人使用
回复zygzyp2014年07月19日
3.2以上的改动确实太大了
回复sandred03月17日
话说之前从来没有学过PHP,我觉得很容易看懂啊
hhl_victory2014年05月05日
请问3.2还能用么??那天在3.2使用报错呢
iLoveProgram2014年04月11日
奴家求安慰
dsjafijdsaoifjdf2014年02月14日
一些简单的操作一定要封装一层,有必要吗,考虑安全性连注入xss都不知道怎么防的还搞什么开发
wawa2014年01月14日
实践出真知呀... 唉 没经验的只能看看 ,记住最好
yapph2013年12月16日
确实很强大 有点不习惯
laoqiao20132013年11月28日
来个实例吧
namelesswei2013年11月08日
能不能来一点实例啊。。
happyckx2013年10月28日
还行。
wcjwhl2013年10月23日
3.2 好像用不起了呢?
chyoo2013年09月24日
我一般每次都要用trim过滤,一个好的框架,确实省了不少力气,前提是你会用!
akgmxks2013年09月22日
THINKPHP 用起来真的很不错 ,努力学习ing !!!!!
134135323812013年09月16日
可能要实战才能理解
Simplemu2013年08月30日
学习中。
dago_zxf2013年08月13日
如何自定义全局变量啊?
ruoge20072013年07月17日
严重提出建议 _post( "id", null, 0)。如果加上这种,表示 默认过滤方式,默认值为0。
回复fudongdong6902013年12月18日
真的吗?
回复fudongdong6902013年12月18日
真的吗?
混世小子2013年07月02日
感觉还蛮好的,继续学习!
旅途2013年06月17日
眼花缭乱 一头雾水
萨摩耶2013年05月31日
33333333
DolphinBoy2013年05月29日
如果不需要过滤某个请求的值该怎么办呢?
回复小网蚁2013年06月01日
好像有提到置空额。
回复小网蚁2013年06月01日
好像有提到置空额。
com6064172462013年05月27日
啊,不错越来越喜欢学THINKPHP了比玩JAVA代码要好理解不少呢,希望能很快学会,谢谢作者
大叔_pro2013年05月21日
if (!empty($this->_param('name'))) {} 这种用法会出错,但是先给变量赋值再判断就不会。比如:$name=$this->_param('name'); if(!empty($name)){}
JimmyCai2013年05月19日
自定义过滤函数strip_tags应该写在哪呢?
回复江浩19912013年05月26日
写在配置文件中
回复江浩19912013年05月26日
写在配置文件中
Simplemu2013年08月30日
学习中。
dago_zxf2013年08月13日
如何自定义全局变量啊?
ruoge20072013年07月17日
严重提出建议 _post( "id", null, 0)。如果加上这种,表示 默认过滤方式,默认值为0。
混世小子2013年07月02日
感觉还蛮好的,继续学习!
旅途2013年06月17日
眼花缭乱 一头雾水
萨摩耶2013年05月31日
33333333
DolphinBoy2013年05月29日
如果不需要过滤某个请求的值该怎么办呢?
com6064172462013年05月27日
啊,不错越来越喜欢学THINKPHP了比玩JAVA代码要好理解不少呢,希望能很快学会,谢谢作者
大叔_pro2013年05月21日
if (!empty($this->_param('name'))) {} 这种用法会出错,但是先给变量赋值再判断就不会。比如:$name=$this->_param('name'); if(!empty($name)){}
JimmyCai2013年05月19日
自定义过滤函数strip_tags应该写在哪呢?
onezhi2012年09月10日
方法很不错,看出TP在多处都进行了安全处理,不知有没有重复处理的,对性能影响怎样!
此处变量功能也是很牛的,支持!
onezhi2012年09月10日
方法很不错,看出TP在多处都进行了安全处理,不知有没有重复处理的,对性能影响怎样!
此处变量功能也是很牛的,支持!

普通分类: