2011-04-06 51 views
2

我正在使用正常的數據庫方法而不是預準備語句的數據庫驅動的網站。因此,我必須在傳遞給表單動作PHP腳本時清理POST和GET變量。錯誤抑制運算符是否使用錯誤練習?

定義了一個sanitise方法,它試圖儘可能最好地清理用戶輸入,但我試圖減少測試POST和GET變量存在的代碼,以及用於定義具有默認值的變量的代碼不存在。

這是我想出了,但它留下的地雷和其他開發人員的口不好的味道,因爲我們都覺得錯誤抑制操作被濫用:

$Page  = sanitise(@$_GET["page"], "Unspecified"); 
$Timestamp = sanitise(@$_POST["time"], time()); 

請你能給我一些批評這段代碼?這是不理想的,我會同意,但它確實減少了很多代碼,並且比我們的可讀性更強。

我試圖達到如下一行:

  1. 測試一個變量的存在。
  2. 如果存在,請清理輸入並分配給變量。
  3. 如果不存在,請創建一個變量但使用默認值。

您怎麼看?


這有點被問什麼我這裏延續:
Passing unset variables to functions

回答

3

保存自己的一些編碼,並「輸入」類的幾個靜態函數,就像這樣:

class Input { 

     public static function get($key, $default = null) 
     { 
      return (array_key_exists($key, $_GET)) ? $_GET[$key] : $default; 
     } 

     // same thing for $_POST... 

} 

然後,你可以打電話給你的sanitize函數是這樣的...

sanitize(Input::get('page', 'Unspecified')); 
+0

現在,我喜歡! – 2011-04-06 22:17:09

+0

這是相當冗長的,考慮到它做同樣的事情。 – 2011-04-06 22:25:16

+0

@Tomalak - 確實,它需要更多的代碼行,但它封裝了邏輯,使得所有事情都變得更具表現力,IMO。 – TaylorOtwell 2011-04-06 22:30:09

5

使用@算,確實,通常被認爲是不好的做法。


在你的情況下,它可能是可以避免的,由分裂的事情在幾個步驟:

  • 測試變量被設置 - 與isset()
  • 工作 - 或者不是:
    • 如果設置,則使用默認值對其進行消毒
    • 其他。

由於@操作可避免,在這裏...好,我會避免。


注:

  • 掩蓋錯誤通常是沒有這樣一個好主意(在這種情況下,不應該傷害了......不過,還是)
  • @運營商有一個成本,說到性能。
  • 單行不是目的,應該一定;-)


1.但有些人會說,這不管那麼多了 - 他們可能是正確的

+0

我同意你的意見,但我試圖避免所有額外的步驟。我非常喜歡TaylorOtwell提出的靜態輸入類的概念,請參閱您的想法。 – 2011-04-06 22:19:35

1

您可以使用terany運營商要測試存在,使用錯誤suprression操作避免:

$Page = (!empty($_POST['test'])) ? $_POST['test'] : 'default'; 

通常使用抑制運算符被認爲是一種不好的做法,所以使用像這樣的terany運算符將避免抑制錯誤以及給你想要的效果。

+0

再加上所有額外的大括號...... $ page =!empty($ foo)? $ xyz:'default'; – dogmatic69 2011-04-06 22:31:57

+0

你錯過了?我不能編輯它因爲網站是跛腳,'必須改變超過6個字符' – dogmatic69 2011-04-06 22:40:32

-1

要用isset避免貨物崇拜編程語法我在輸入數組周圍使用了對象包裝。它專門在幕後進行檢查,所以我可以避免愚蠢的遺漏 @。

爲了您的例子,我會寫$_GET->int->default("time", time())
$_GET->sanitize["page"],如果所有的規則都只是$_GET["whatever"]自動過濾預定義。

否則我仍然會使用@ $ _GET,因爲我不相信外觀編碼。

+0

所以你濫用OO只是爲了避免被視爲一隻羊。有趣! – 2011-04-06 22:22:41

+0

如果通過濫用OO你意味着一個緊湊的API和更少的努力,是的。 – mario 2011-04-06 22:23:58

0

@操作符不會避免這個錯誤,它會讓它變得相當。但是,如果你檢查錯誤,你會有一個。這就是爲什麼這是一個不好的做法。但也因爲隱藏錯誤通常會帶來麻煩。

的一個好方法是這樣的:

$Page = (isset($_GET['page'])) ? $_GET['page'] : 'default'; 
$Page = sanitise($Page, "Unspecified"); 

但因爲你有一個的sanitize()函數,你可以升級它,使這個檢查你。

function sanitise($value, $default, $fromRequest=false) { 
if ($fromRequest) $value = (isset($_REQUEST[$value])) ? $_REQUEST$value] : $default; 
    .. 
} 

$ _REQUEST是全局變量,表示_POST $ _GET + $ + $ _COOKIE,但你可能cutomize我的版本。

0

一般而言,其他答案是正確的。有一些問題使用@來假裝錯誤不存在。

也就是說,在這個的情況下,我會用你的方法。它很清晰,簡潔,在這個小場景中— — 只是做的工作。我很難在這裏想到潛在的錯誤。