我建立了一个空的关联数组,其中键名称引用提交的帖子数据。我可以很好地捕获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)
捕获与当前密钥匹配的post数据中的值,在这种情况下为rUsername
$key
是问题所在。我希望新变量的NAME是关联键名,例如我想在第一次迭代中用$ rUsername替换$ key,在第二次迭代中用$ 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);
}
}
给我完全想要的输出,谢谢你们!
答案 0 :(得分:2)
你根本没有访问$ _POST,所以你所做的只是自己定义一些数组成员,过滤它们以获取有害的POST字符(为什么你会尝试注入自己的代码?)然后创建一个来自那些自定义键值的新数组。
如果我猜对了你想要的东西,应该是这样的:
foreach(array_keys($insArray) as $key) {
$insArray[$key] = stripslashes(filter_input(INPUT_POST, $_POST[$key]));
}
使用stripslashes表明你使用的是启用了magic_quotes的PHP的脑死亡版本。您应该升级到现代版本的PHP和/或关闭它们。
答案 1 :(得分: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
另外,请重新检查您的代码,这些代码存在一些错误。
答案 2 :(得分: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中使用extract函数,因此您不会覆盖现有变量。确保只使用代码中需要的变量并适当地清理它们。
在$ _POST超全局im上使用array_filter“删除”所有空或空变量。因此,如果未通过$ _POST发送预期的密钥,则默认为$ defaultValues数组指定的值。
我不太明白为什么在没有第三个参数(过滤器常量)的情况下使用filter_input。
答案 3 :(得分:0)
希望这会有所帮助,如果不是,我可能会误解这个问题。
而不是
$key = stripslashes(filter_input(INPUT_POST, $key));
$insArray[$key] = $key;
尝试
$insArray[$key] =stripslashes(filter_input(INPUT_POST, $key));
然后在foreach循环之后
extract($insArray);