1

我建立了一个空的关联数组,其键名指的是提交的帖子数据。我可以很好地捕获 postdata,但是在尝试实例化名称与数组键匹配的变量时遇到了麻烦。

例如:

$insArray = array('rUsername'=>'', 'rPass'=>'', 'rQuestion'=>'', 'rAnswer'=>'', 'rFName'=>'', 'rLName'=>'', 'rBDateD'=>'', 'rBDateM'=>'', 'rBDateY'=>'', 'rHCheck'=>'', 'rHCeckOption'=>'', 'rEmail'=>'');

foreach($insArray as $key=>$value){
    if (filter_input(INPUT_POST, $key) != ''){
        $key = stripslashes(filter_input(INPUT_POST, $key)); 
        $insArray[$key] = $key;
    }       
}

第一行创建空数组,然后 foreach 循环遍历该数组。现在变得棘手了。

filter_input(INPUT_POST, $key)捕获位于与当前键匹配的帖子数据中的值,在这种情况下为 rUsername

$key是问题所在。我希望新变量的 NAME 是关联键名,例如,我想在第一次迭代中将 $key 替换为 $rUsername,在第二次迭代中替换为 $rPass,依此类推。我尝试使用两个 $$,但我知道这是不对的。以前从未尝试过这样做,但如果我能弄清楚会有所帮助。

更新:

这是最终代码,它是所提供的两个答案的组合。

if (isset($_POST['submit'])) {
    //Build array of variables to be put into database
    $insArray = array('rUsername'=>'', 'rPassword'=>'', 'rQuestion'=>'', 'rAnswer'=>'', 'rFName'=>'', 'rLName'=>'', 'rBDateD'=>'', 'rBDateM'=>'', 'rBDateY'=>'', 'rHCheck'=>'', 'rHCheckOption'=>'', 'rEmail'=>'');

    foreach(array_keys($insArray) as $key){
        $insArray[$key] = filter_input(INPUT_POST, $key);
        $$key = filter_input(INPUT_POST, $key);
    }
}

给了我想要的输出,谢谢大家!

4

4 回答 4

2

您根本没有访问 $_POST ,所以您所做的只是获取一些您自己定义的数组成员,过滤它们以查找有害的 POST 字符(为什么要尝试注入自己的代码?),然后从那些自定义的键值。

如果我猜对了你想要什么,它应该是这样的:

foreach(array_keys($insArray) as $key) {
    $insArray[$key] = stripslashes(filter_input(INPUT_POST, $_POST[$key]));
}

stripslashes 的使用表明您使用的是启用了 magic_quotes 的 PHP 脑残版本。您应该升级到现代版本的 PHP 和/或关闭它们。

于 2012-05-06T04:44:56.530 回答
1

解决方案是改变

$key = stripslashes(filter_input(INPUT_POST, $key));

$$key = stripslashes(filter_input(INPUT_POST, $key));

http://www.php.net/manual/en/language.variables.variable.php

另外,重新检查你的代码,它正在做一些错误..

于 2012-05-06T04:45:19.573 回答
1

如果我理解正确,我将建议这种方法:

$defaultValues = array('rUsername'=>'', 'rPass'=>'', 'rQuestion'=>'', 'rAnswer'=>'', 'rFName'=>'', 'rLName'=>'', 'rBDateD'=>'', 'rBDateM'=>'', 'rBDateY'=>'', 'rHCheck'=>'', 'rHCeckOption'=>'', 'rEmail'=>'');
$values = array_map('stripslashes', array_merge($defaultValues, array_filter($_POST)));
extract($values, EXTR_SKIP);
echo $rUsername;
echo $rPass;
.........

通过使用上面的代码段,您必须考虑以下几点

  • 我将提取函数与 EXTR_SKIP 一起使用,因此您不会覆盖现有变量。确保仅在代码中使用您需要的变量并适当地清理它们。

  • 通过在 $_POST 超全局上使用array_filter可以“擦除”所有空或空变量。因此,如果预期的密钥不是通过 $_POST 发送的,它默认为 $defaultValues 数组指定的值。

  • 我不太明白为什么您使用filter_input没有第三个参数(过滤器常量)。

于 2012-05-06T06:45:10.957 回答
0

希望这会有所帮助,如果没有,可能是我误解了这个问题。

代替

$key = stripslashes(filter_input(INPUT_POST, $key)); 
$insArray[$key] = $key;

尝试

$insArray[$key] =stripslashes(filter_input(INPUT_POST, $key));

然后在foreach循环之后

extract($insArray);
于 2012-05-06T04:49:32.390 回答