可能重复:
Is using $GLOBALS['HTTP_GET_VARS'] deprecated?
Invalid arguements in php
我在WAMP环境中运行脚本时收到以下响应:
警告:为foreach()提供的参数无效 第17行的C:\ wamp \ www \ GeCard \ eCardScript_ecards \ ecard_lib.php
警告:为foreach()提供的参数无效 第21行的C:\ wamp \ www \ GeCard \ eCardScript_ecards \ ecard_lib.php
这是我的代码:
function getPostGetVars() {
global $HTTP_POST_VARS,$HTTP_GET_VARS;
foreach ($HTTP_POST_VARS as $key => $value) { //This is line 17
global $$key;
$$key = $value;
}
foreach ($HTTP_GET_VARS as $key => $value) { //This is line 21
global $$key;
$$key = $value;
}
}
我被告知此代码已被弃用。可以轻松更新这段代码以消除警告吗?
答案 0 :(得分:1)
此代码基本上执行register_globals = on
所做的事情,只是更糟糕的方式(GET优先于POST)。您应该完全删除此代码并更新脚本以使用适当的变量$_POST['field']
或$_GET['field']
来访问POST / GET数据,而不是仅使用$field
。
代码停止工作的原因是$HTTP_*_VARS
已替换为$_*
超全球,因此要修复它,请删除global $HTTP_POST_VARS,$HTTP_GET_VARS;
并将$HTTP_POST_VARS
替换为$_POST
(同样适用于$HTTP_GET_VARS
)。
但是,你也可以通过完全删除函数并用extract($_REQUEST);
替换调用来修复它(假设函数总是在全局范围内调用,而不是在函数内部调用)。
答案 1 :(得分:0)
试试这个:
function getPostGetVars() {
global $_POST,$_GET;
foreach ($_POST as $key => $value) { //This is line 17
global $$key;
$$key = $value;
}
foreach ($_GET as $key => $value) { //This is line 21
global $$key;
$$key = $value;
}
}
答案 2 :(得分:0)
分别使用$_POST
和$_GET
代替$HTTP_POST_VARS
和$HTTP_GET_VARS
。
function getPostGetVars() {
foreach ($_POST as $key => $value) { //This is line 17
global $$key;
$$key = $value;
}
foreach ($_GET as $key => $value) { //This is line 21
global $$key;
$$key = $value;
}
}
如果您查看$_POST
和$_GET
的手册页,您会看到他们更详细的同行已被弃用。
我不禁注意到你试图用这段代码做什么,实际上反映了extract()
的功能。我会提醒您这样做,因为攻击者可以使用请求重写必要变量(比如$isLoggedIn
)并利用服务器。如果您继续执行此类操作,建议您使用extract()
并使用EXTR_PREFIX_ALL
等标记,以便不会发生冲突。例如,您可以使用get_
为get变量添加前缀,为post_
添加post变量。
但是,除非您真正知道自己在做什么,否则在生产环境中使用这样的提取(或您的方法) 极 是危险的。我会建议完全反对它,而是使用适当的超级全局变量来访问$_GET
和$_POST
变量。
答案 3 :(得分:0)
是的,使用$ _POST ['variable_name']代替全球$ HTTP_POST_VARS和$ _GET ['变量名称'] $ HTTP_GET_VARS