发布表单时,如何自动填充PHP全局变量(即$email)


How does a PHP global variable (i.e. $email) automatically get populated when a form is posted?

我遇到了一些在其他人的代码中为表单验证器工作的代码。它应该从发布的表单数据中返回一个值。无论如何,总是返回NULL。这就是函数的整体(假设此代码在某一点上确实起作用):

function _getValue($field)
{
    global ${$field};
    return ${$field};
}

从其他函数的上下文中,我可以看出它试图从(在本例中)$_POST变量中获取值。当我将功能更改为以下时,一切都像一个魅力:

function _getValue($field)
{
    // $_REQUEST should hold $_GET and $_POST values
    return $_REQUEST[$field];
}

所以我的问题是…global ${$field}在这种情况下到底意味着什么?我知道${$field}是什么,但假设他们将email传递给该函数。这个全局$email变量来自哪里?

最初的功能应该是如何工作的?我知道有一种叫做"超级全球化"之类的东西,这很糟糕。这有关系吗?这可能是它停止工作的原因吗?主持人是否关闭了Super Globals?

[EDIT]我的提问方式明显有些混乱。我知道${$field}和$$field是什么意思,但我不知道是怎么回事

global ${$field};
return ${$field};

返回用户在类似的表单中输入的值

<input name="email">

当你呼叫时

$this->_getValue('email');

由于register_globals指令,您之前的程序员希望POST变量在全局空间中。值得庆幸的是,这个功能在PHP 4.2中默认被关闭,在PHP 5.4中被删除。

引用文件:

启用后,register_globals将为脚本注入各种变量,比如HTML表单中的请求变量。

我想知道怎么会有人认为这是个好主意:)

是的,它与register_globals有关,是的,这非常糟糕。我想你已经从非常古老的代码中提取了这一点。现在默认情况下,Php的register_globals设置为off。这就是代码不起作用的原因。您的修复是正确的。Register_globals不好,因为它会产生严重的安全风险问题。

很明显,我对这个问题的措辞很差,我很抱歉,但从Radu和pst对Radu帖子的评论来看,我发现以下内容完美地回答了我的问题(如http://php.net/manual/en/security.globals.php):

注意:处理register_globals

如果不推荐使用的register_globals指令在上设置为,则中的变量也将在脚本。例如,$_POST['foo']也将作为$foo存在。