2010-08-04 74 views
1

我学会了如何通过在stackoverflow上的另一个答案中的引用来访问,但无法再次找到它。无论如何,以下方法是不安全的还是完全不可靠的?通过引用访问GET和POST

protected function checkVar($requestType, $varname, $checkIfNumber = false) 
{ 
    switch($requestType) 
    { 
     case 'GET': 
      $sg = &$_GET; 
      break; 
     case 'POST': 
      $sg = &$_POST; 
      break; 
     default: 
      throw new Exception('Variable `$requestType` is not `GET` or `POST` in AController::checkVar().'); 
    } 

    if(!isset($sg[$varname])) { 
     throw new Exception("$requestType variable [$varname] is not set in AController::checkVar()."); 
    } else if(empty($sg[$varname])) { 
     throw new Exception("$requestType variable [$varname] is empty in AController::checkVar()."); 
    } else if($checkIfNumber) { 
     if(!ctype_digit($sg[$varname])) { 
      throw new Exception("$requestType variable [$varname] is not a number in AController::checkVar()."); 
     } 
    } 

    return $sg[$varname]; 
} 
+0

我不明白这个功能的重点,但我没有看到很多的问题,除了在同一个功能混合POST和GET。你会想要小心的是,用户不能只在你不知道的情况下抛出一些= extra&data =到&your =函数。 :-) – Chris 2010-08-04 01:43:29

+0

@Chris - 感谢您的回复。我创建此函数的原因是在检查通过GET和POST发送的变量时限制重复执行的代码量。您对额外数据的警告很好,我会再次考虑这个功能。 – 2010-08-04 01:46:18

回答

3

这不是你应该如何使用引用。只要值不变,“复制”操作实际上便宜,并且这里不需要引用(尤其是因为您不是通过引用返回,而是实际制作副本)。代码的这一点引用唯一可以做的事情是在后面引起难以理解的错误,这些错误很难追查到。

+0

有趣的是,它更便宜! – 2010-08-04 01:54:38

+0

这是一个引用计数的东西,这是一个没有需要的时候不需要的整个动作。 – Wrikken 2010-08-04 02:05:09

2

这就是为什么我们有超全球性的$_REQUEST

protected function checkVar($varname, $checkIfNumber = false) 
{ 
    if(!isset($_REQUEST[$varname])) { 
     throw new Exception("variable [$varname] is not set in AController::checkVar()."); 
    } else if(empty($_REQUEST[$varname])) { 
     throw new Exception("variable [$varname] is empty in AController::checkVar()."); 
    } else if($checkIfNumber) { 
     if(!ctype_digit($_REQUEST[$varname])) { 
      throw new Exception("variable [$varname] is not a number in AController::checkVar()."); 
     } 
    } 

    return $_REQUEST[$varname]; 
} 

我知道这不是一回事,但恕我直言,这是够好的。

+0

我不知道$ _REQUEST!所以,如果我理解正确,只要在调用示例之前检查使用了哪个请求方法,那么这对GET,POST和COOKIE都有效? – 2010-08-04 01:49:23

+0

谢谢你的出色答案。我选择了@ Wrikken的答案,因为它是关于使用参考的要点。 – 2010-08-04 14:59:38

+0

@lets没有汗水:) – NullUserException 2010-08-04 17:13:27