使用 foreach 循环初始化变量


using a foreach loop to initialize variables

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

例如:

$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)捕获与当前键匹配的 post 数据中的值,在本例中为 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);
    }
}

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

你根本不访问 $_POST,所以你所做的只是获取一些你自己定义的数组成员,过滤它们中有害的 POST 字符(你为什么要尝试注入自己的代码?(,然后从这些自定义键值创建一个新数组。

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

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

使用条带斜杠表明您使用的是具有magic_quotes启用的 PHP 的脑死亡版本。您应该升级到 PHP 的现代版本和/或关闭它们。

解决方案是改变

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

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

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

另外,重新检查您的代码,这些代码正在执行一些错误。

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

$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 超全局 im 上使用 array_filter "擦除"所有空变量或空变量。 因此,如果预期的密钥不是通过 $_POST 发送的,则默认为 $defaultValues 数组指定的值。

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

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

而不是

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

尝试

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

然后在 foreach 循环之后

extract($insArray);