繁体   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