我有几个变量来自$ POST _ ['array']中的一个数组我想做一些循环,例如foreach,它为变量中的每个值创建一个变量名,并为它赋值.
例如,如果我有
$POST_['name'];
$POST_['last'];
$POST_['age'];
$POST_['sex'];
Run Code Online (Sandbox Code Playgroud)
我希望循环从$ _POST中的数组创建每个变量,其变量名称如下所示:
$name = 'John';
$last = 'Doe';
$age = '32';
$sex = 'male';
Run Code Online (Sandbox Code Playgroud)
注 - 该数组来自一个序列化的jquery字符串,它将表单中的所有变量和值组合成一个大字符串.
这可能吗?
Nic*_*ole 17
你不需要循环,你想要提取:
extract($_POST); // But use caution, see below
Run Code Online (Sandbox Code Playgroud)
如注释中所述,这会强制$_POST数组中的所有参数进入当前符号空间.
<?php
extract($_GET);
var_dump($_SERVER); // Can be overwritten by the GET param
?>
Run Code Online (Sandbox Code Playgroud)
上面的代码说明了这个问题所示的问题 - 一些非常危险的事情可以在全球空间中被覆盖.
function myFunc() {
// (Mostly) empty symbol space! (excluding super globals)
extract($_POST);
}
Run Code Online (Sandbox Code Playgroud)
在功能内部,作为第一线,没有伤害.
重要提示:您可能认为既然$_SERVER是超级全局的,那么这个漏洞也可能发生在函数内部.然而,在我的测试,在PHP 5.3.4版本,它是一个函数内部安全 -既不是$_SERVER,$_POST,$_GET,$_SESSION,或可能其他超全局,可能会被覆盖.
您还可以将extract与extract_type选项一起使用,这些选项不会覆盖.
在我看来,最好的选择是简单地从提取中加上所有变量的前缀:
// $_GET = test=1&name=Joe
extract($_GET, EXTR_PREFIX_ALL, "request_get");
echo $request_get_test; // 1
echo $request_get_name; // Joe
Run Code Online (Sandbox Code Playgroud)
这样你就没有覆盖问题,但你也知道从阵列中得到了所有东西.
如果您想手动(但仍然是动态地)执行此操作,或者想要有条件地仅提取一些变量,则可以使用变量变量:
foreach ($_POST as $key => $value) {
if (isset($$key)) continue;
$$key = $value;
}
Run Code Online (Sandbox Code Playgroud)
(我使用的示例条件是覆盖防止.)
Jak*_*e N 13
使用extract()时尽量不要使用$_POST.您可能会覆盖所需的变量,从而导致不可预测的行为.进入是一个坏习惯,而动态可能不是最好的解决方案.
你可以这样做:
foreach($_POST as $key => $value)
{
switch($key)
{
case "name":
$name = $value;
break;
case "last":
$last = $value;
break;
}
}
Run Code Online (Sandbox Code Playgroud)