2010-08-04 70 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