2012-05-06 30 views
1

我已经构建了一个空的关联数组,它的键名引用了提交的发布数据。我可以很好地捕获postdata,但遇到麻烦时尝试实例化名称与数组键匹配的变量。使用foreach循环来初始化变量

例如:

$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是问题所在的值。我希望新变量的名称是关联键名,例如我想在第一次迭代中用$ rUsername替换$ key,在第二次中用$ rPass替换,等等。我尝试使用两个$$,但我知道这是不对的。以前从来没有尝试过这样做,但如果我能弄清楚它会有所帮助。

UPDATE:

这是最后的代码是两个提供的答复的组合。

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

那么什么是你得到 – Satya

回答

2

根本没有访问$ _POST,所以你所做的只是把你自己定义的一些数组成员,过滤掉有害的POST字符(为什么你会尝试注入你自己的代码?),然后创建来自这些自定义键值的新数组。

如果我在你想要的猜测正确的,它应该是这样的:

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

的用stripslashes的建议你在PHP的新空房禁地版本,其中有magic_quotes的支持。你应该升级到现代版本的PHP和/或关闭它们。

+0

错误,我伤心地在我的托管服务提供商的怜悯这让我对使用一个惊人的交易,因此,我要绑他们正在使用的PHP版本。至于注入我自己的代码,我设置了从以前的表单提交中提交的一些字段的数组键。而不是手动编码每个只需要我想要的变量,我初始化一个空数组,其中键名与表单中我想要的这个数组的字段名匹配。构建数组,并最终将该数组传递给处理函数。也就是说,数组键的答案正是我所期待的。再次感谢! – MaurerPower

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

此外,重新检查代码,这是做了一些错误..

+0

变量变量!我在代码中使用的另一个项目!可悲的是,不能给出两个答案,我讨厌那个部分! – MaurerPower

0

希望这将有助于如果不是,我可能会误解这个问题。

而不是

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

尝试

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

然后foreach循环后

extract($insArray); 
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; 
......... 

通过使用上面的代码片段,您可以使用extract功能与EXTR_SKIP所以你不要覆盖现有的变量要考虑到以下

  • 林。确保只在你的代码中使用你需要的变量,并适当地对它们进行消毒。

  • 通过在$ _POST超全局即时消息中使用array_filter所有空或空变量。所以如果预期的密钥不是通过$ _POST发送的,它将默认为由$ defaultValues数组指定的值。

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

+0

我正在使用filter_input来抓取直接后置堆栈,以确保在提交后没有任何内容添加到该帖子。虽然过滤器评论是一个很好的建议! – MaurerPower