2012-09-19 94 views
3

我想編寫一個PHP模塊,它將修改$ _POST和$ _FILES變量。目標是在模塊中進行預處理,例如,對輸入進行規範化處理,不允許特定擴展名處理。

這可能嗎?看來you can't modify the $_FILES variable但是,如果你有一個擴展名,你可能能夠modify these variables during the RINIT phase

我該怎麼做?

編輯:澄清

我猜正火的數據是不是一個很好的例子。我更感興趣的是如何完成它並學習更多關於PHP和模塊的知識。例如,function that reorganizes $_files。我認爲編寫一個能夠自動完成這個任務的模塊會很有趣,就像學術練習一樣,並且正在尋找關於從哪裏開始的指針。

+0

「正常化輸入」 - 一些通用的解決方案是一個壞主意。數據標準化,驗證和消毒是一個特定領域的過程。所以不可能寫足夠通用的(和安全的)。 – zerkms

+0

「我認爲寫一個能夠自動完成這個任務的模塊會很有趣」 - 實際上修改superglobals絕不是一件有趣的事情。它們具有特定的格式,因此如果您更改它會造成混淆。 – zerkms

+0

「並且正在尋找從何處開始的指針」---您已經發現可以使用功能。這不是「指針」嗎?只要拿它並使用 – zerkms

回答

0

正常化您的數據很可能是特定於上下文的,因此我不會推薦您建議的內容。如果你真的想,但是,我建議你寫一個函數,該函數接受assoc數組($ _FILES,$ _POST)並根據你的需要修改它們,然後返回一個你想要的數據的新的assoc數組。不要忘記從其位置移動文件($_FILES['file1']['tmp_name'])。

但是,編寫整個模塊似乎是多餘的。不要這樣。 :P

+0

(將編輯移動到實際文章中,因爲它似乎更適合此處) –

1

或許用(POST/GET甚至FILES等)封裝「請求」作爲對象會更好。然後只引用這個對象而不是單個變量作用域。

這將允許您創建所述對象的新實例並執行您選擇的任何方法,或者在整個「模塊」(您可以修改/規範化它)的客戶端代碼中使用它。另外,這樣做時不需要修改超級模型。

非常快說明這很容易進一步擴展:

class Request 
    { 
    protected $params = array(); 

    public function __construct() 
    { 
     return $this; 
    } 

    public function getParam($key) 
    { 
     if (isSet($_params[$key])) { 
     return $_POST[$key]; 
     } else if (isSet($_GET[$key])) { 
     return $_GET[$key]; 
     } else if ($_POST[$key]) { 
     return $_POST[$key]; 
     } else if ($_FILES[$key]) { 
     // do something special with files here 
     } 
    } 

    public function setParam($key, value); 

    public function getParams(); 

    public function getPostParams(); 

    ...etc...etc 
    }