2010-10-06 120 views
0

我有这样的:PHP:的foreach和数组问题

foreach($_POST as $key => $value) { 
    $data[$key] = filter($value); 
} 

filter();条如果任何标签,而真正的逃避它们。

现在我在POST表单中也有一个数组,所以我在strip_tags()mysql_real_escape_string中收到错误。我应该如何让只有$_POST["Searching"]不被filter();过滤?

回答

0

使用is_array()

array_walk_recursive($_POST,'filter'); 

,让你的函数filter如参考取值

foreach($_POST as $key => $value) { 
    if (!is_array($value)) 
     $data[$key] = filter($value); 
} 
+0

在哪里? – Johnson 2010-10-06 15:48:14

+0

是的,在foreach中,但用$ value改变$ _POST ['Searching']。我改变了答案。 – CristiC 2010-10-06 15:49:55

3

您可以使用array_walk_recursive

function filter(&$value) { 
    // apply strip_tags and real escape to $value. 
    $value = mysql_real_escape(strip_tags($value)); 
} 
+0

小的语法 - 不应该'array_walk_recursive($ _ POST,过滤器);'是'array_walk_recursive($ _ POST, '过滤器');' ?另外,就像我自己的教化问题一样 - 这个函数不是在原地尝试和修改源数组,而是将它转录到一个新的数组中,比如问题中的'$ data'?我从php.net看到,这个函数只返回true或false。 – 2010-10-06 15:53:32

+0

也不建议使用引用时间传递参考,并会引发警告。应该是'array_walk_recursive($ _ POST,'filter');' – meagar 2010-10-06 15:59:22

+0

@ Lucanos,@ meagar:谢谢。 – codaddict 2010-10-06 16:09:10

0
<?php 
foreach($_POST as $key => $value){ 
    if(!is_array($_POST[$key])){ 
     $data[$key] = filter($value); 
    }else{ 
     $data[$key] = $value; 
    } 
} 
?> 
+0

此解决方案不完整 - 如果遇到数组,它什么也不做。虽然它防止了filter()在尝试处理数组时抛出错误,但这也意味着该数组会丢失数据(因为任何子数组都会被丢弃)。 – 2010-10-06 15:51:04

+0

你是对的。我太快地输入了我的原始解决方案。 – FallenRayne 2010-10-06 16:02:21

1

首先,你可以使用array_map()加快这,所有你需要做的就是允许函数识别数组并递归地调用它自己。

function filter($inVar){ 
    if(is_array($inVar)) 
    return array_map('filter' , $inVar); 
    return mysql_real_escape(strip_tags($inVar)); 
} 

然后调用它像这样:

$data = array_map('filter' , $_POST);