【问题标题】:using a foreach loop to initialize variables使用 foreach 循环初始化变量
【发布时间】:2012-05-15 03:17:51
【问题描述】:

我已经建立了一个空的关联数组,其键名指的是提交的帖子数据。我可以很好地捕获 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);
    }
}

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

【问题讨论】:

  • 那么你得到的错误是什么

标签: php arrays foreach variable-assignment


【解决方案1】:

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

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

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

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

【讨论】:

  • 我很遗憾地受制于我的托管服务提供商,这给了我一个惊人的使用交易,因此我被绑定到他们使用的 php 版本。至于注入我自己的代码,我正在为之前提交的表单提交的一些字段设置数组键。而不是手工编码每个只抓取我想要的变量,我初始化了一个空数组,其键名与表单中我想要的该数组的字段名匹配。构建数组,并最终将该数组传递给处理函数。也就是说,array-keys 的答案正是我想要的。再次感谢!
【解决方案2】:

解决办法是改变

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

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

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

另外,请重新检查您的代码,其中有一些错误..

【讨论】:

  • 变量变量!我在代码中使用的另一个项目!可悲的是,无法给出两个答案,我讨厌那部分!
【解决方案3】:

希望这会有所帮助,否则可能是我误解了问题。

代替

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

试试

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

然后在foreach循环之后

extract($insArray);

【讨论】:

    【解决方案4】:

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

    $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;
    .........
    

    通过使用上面的sn-p,你必须考虑到以下几点

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

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

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

    【讨论】:

    • 我使用 filter_input 来抓取直接帖子堆栈,以确保提交后没有添加任何内容。虽然过滤器 cmets 是一个很好的建议!
    猜你喜欢
    • 2011-05-24
    • 2012-01-02
    • 1970-01-01
    • 1970-01-01
    • 2011-04-02
    • 2018-07-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多