2010-10-06 69 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);