我遇到了一些在其他人的代码中为表单验证器工作的代码。它应该从发布的表单数据中返回一个值。无论如何,总是返回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
存在。