常用函数中常被忽略的小技巧(2)

addslashes这个函数大家应该比较熟,虽然名字长了一些,但其功能强大,一点也不影响其使用,这次要讲的内容与此函数相关

先来一段代码

 CODE:

// 在表单数据入库之前,对数据进行转义处理
$username = addslashes($_POST['username']);

这是很通常的用法,用于对提交过来的用户名进行转义,防止特殊字符如单引号等未转义就入库
一般说来对于单引号之类的数据提交,在服务器端应当进行自动处理,办法就是开启php.ini中的magic_quotes_gpc

在无法确定服务器端是否开启时或想程序更加兼容时,我们可以用如下的方法来判断

 CODE:

define("PHP_MAGIC_GPC",get_magic_quotes_gpc());

if (false == PHP_MAGIC_GPC)
{
    // 执行转义
}

上面的办法似乎已经很好了,是的,以前我也是这样干的。但是科技以人为本,如果在每个数据提交时都进行一次判断,都调用一次addslashes这就太累了。怎么办,有没有办法更简单?

有。

先抛出一个函数给大家看看

 CODE:

/**
 * 递归处理提交数据
 *
 * @param   string|array     $data    提交数据
 * @return  string|array
 */
function rAddSlashes(&$data)
{
    // 这里用到了之前定义的常量
    if(!PHP_MAGIC_GPC)
    {
        return is_array($data)?array_map('rAddSlashes',$data):addslashes($data);
    }
    else
    {
        Return $data;
    }
}

看明白了没有。没有看明白的话我就讲讲,看明白了也不妨向下看看。
一般说来,对于提交的数据都是一维数组,但是也不排除多维的情况,比如多选项,对于cookie就有更多的可能是多维了,因此我们不可能把任何的提交都foreach来降维进行处理,这里我们可以用递归来进行这项工作。array_map函数在这里可是居功至伟,用它回调rAddSlashes本身来完成递归,简洁明快。此函数一次性将数据中的特殊字符进行了转义,不管其有多少维。我们可以这样来用它

 CODE:
$post = rAddSlashes($_POST);

当你使用$post时,就不用担心数据的安全性问题了。难道这样就真是的最简单了吗?在用户的每次提交时,对其数据进行批量的转义,难道还不是最简单?答案:是的,这样还不是最简单。

那办法是什么?

想知道吗?想知道你就说嘛。你不是真的想知道吧?(%#&*%^^$...)

OK,先看下面的代码

 CODE:

class Base
{
    var $post;
    function Base()
    {
        $this->post = rAddSlashes($_POST);
    }
}

上面定义了一个名为Base的类,在构造函数中调用了rAddSlashes()函数,并将转义得到的结果放到了成员变量中。如果我们传递此对象到每一个类中,或是我们的类都由其继承出来,想想,我们就可以在任何地方来使用$this->post这个成员变量了,这样就不用我们每次提交时去对数据进行处理了。

大家有兴趣的不妨试试。还是那句话,科技以人为本,为了下一代,我们一定要尽可能的偷懒:)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值