簡體   English   中英

php函數,用於將外部變量整理為單個對象,而不管GET還是POST

[英]php function for collating external variables into a single object regardless of GET or POST

我記得曾經回顧過別人的PHP代碼,他有一個函數或類方法,該函數或類方法將所有GET和POST變量滾動到一個普通的舊對象中,然后可以將其傳遞出去。 如果GET和POST中都出現了相同的名稱/值對,則POST將獲勝。

是否有任何經過良好編碼的PHP插件可以做到這一點?

您可以使用$_REQUEST ,但是要知道它包含$_GET$_POST$_COOKIE ,並且該超全局變量中變量的存在(和順序,出於覆蓋目的)要在執行環境中進行配置。

如果這引起了問題,最好匯總一個簡單的版本,其關鍵是

$requestData = array_merge( $_GET, $_POST );

然后,您可以用某種方式將其包裝起來,也許提供其他有用的功能,例如自動將stripslashes()應用於使用magic_quotes破壞的值,為缺失變量提供默認值,等等。

合並這兩個變量(或使用$_REQUESTRegister Globals代替)可能會導致安全漏洞,因為您無法明確標識其值的來源。 因此,在訪問$_REQUEST['foobar']您無法確定該值是通過URL,POST正文還是Cookie發送的。 這會使您的腳本容易受到跨站點請求偽造的攻擊。

因此,我建議您為了安全而放心,並在期望值來自的地方使用這些變量。 $_GET表示預期將通過URL傳遞的參數, $_POST POST表示通過POST傳遞的參數, $_COOKIE COOKIE表示cookie。

我認為將$_GET$_POST合並是不好的做法。 它們用於完全不同的事物,並且通過將它們視為相等來有效地濫用HTTP協議。 如前所述, $_REQUEST _ $_REQUEST您的要求,但是有點不可預測。 您可以輕松編寫自己的全局函數來執行以下操作:

function param($name, $default = null) {
  return isset($_POST[$name])
    ? $_POST[$name]
    : (isset($_GET[$name])
      ? $_GET[$name] 
      : $default);
}

但是實際上..這是不好的做法。

您可以使用$ _REQUEST全局變量。 當您的應用程序在Web sapi(例如CGI或Web服務器模塊)中運行時,默認情況下由PHP解釋它的定義,當您使用PHP編寫基於Web的應用程序時就是這種情況。 $ _REQUEST是$ _GET和$ _POST中所有數據的關聯數組,默認情況下已定義。 不需要擴展名/庫就可以使用它。

這是我框架中的類,可處理整個應用程序中的全局變量。 此處不對變量進行任何處理。

class stGlobal

{

//instance
private static $instance;

//global settings
public $post = '';
public $get = '';
public $files = '';
public $request = '';

private function initialize()
{
    $this->post = $_POST;
    $this->get = $_GET;
    $this->files = $_FILES;
    $this->request = $_REQUEST;
}

public function getInstance()
{
    if (!isset(self::$instance))
    {
        $class = __CLASS__;
        self::$instance = new $class();
        self::$instance->initialize();
    }
    return self::$instance;
}

}

在任何地方使用

$myObj = stGlobal::getInstance();

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM