0

我记得曾经回顾过别人的 PHP 代码,他有一个函数或类方法,可以将所有 GET 和 POST 变量滚动到一个可以传递的普通旧对象中。如果 GET 和 POST 中出现相同的名称-值对,则 POST 将获胜。

是否有任何类型的编码良好的 PHP 插件可以做到这一点?

4

5 回答 5

7

您可以使用$_REQUEST,但请注意它包含 、 和 的内容$_GET$_POST并且$_COOKIE此超全局变量中变量的存在(和顺序,用于覆盖目的)取决于执行环境中的配置。

如果这会导致问题,那么汇总一个简单版本可能是个好主意,其关键是类似于

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

然后,您可以以某种方式将其包装起来,也许提供额外的有用功能,例如自动应用stripslashes()到使用修饰的magic_quotes值,为缺失变量提供默认值等。

于 2009-02-07T19:55:41.143 回答
2

合并两个变量(或使用$_REQUEST注册全局变量)可能会导致安全漏洞,因为您无法明确识别其值的来源。因此,在访问时,$_REQUEST['foobar']您无法判断该值是通过 URL、POST 正文还是 Cookie 发送的。这会使您的脚本容易受到跨站点请求伪造的攻击。

所以我建议你去追求安全而不是舒适,并使用那些你期望你的值来自哪里的变量。$_GET对于预期通过 URL 传递的参数、$_POST通过 POST 传递的参数和$_COOKIEcookie。

于 2009-02-08T12:02:54.063 回答
1

我认为将其$_GET$_POST. 它们用于完全不同的事物,并且将它们视为平等,您实际上是在滥用 HTTP 协议。如前所述,$_REQUEST做你想做的事,但有点不可预测。您可以轻松编写自己的全局函数来做同样的事情:

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

但真的..这是不好的做法。

于 2009-02-08T00:18:14.657 回答
0

您可以使用 $_REQUEST 全局变量。它由默认解释的 PHP 定义,当您的应用程序在 web sapi(如 CGI 或 web 服务器模块)中运行时,当您使用 PHP 编写基于 Web 的应用程序时,您的应用程序就是这种情况。$_REQUEST 是 $_GET 和 $_POST 中所有数据的关联数组,默认定义。使用它不需要扩展/库。

于 2009-02-07T19:39:02.643 回答
0

这是我的框架中处理整个应用程序的全局变量的类。此处不对变量进行任何处理。

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();
于 2009-02-08T11:37:50.400 回答