[英]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
破坏的值,为缺失变量提供默认值,等等。
合并这两个变量(或使用$_REQUEST
或Register 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.