2010-10-06 3 views
0

J'ai ceci:PHP: problème de foreach et le réseau

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

filter(); bandes si toutes les balises, et réelle leur échapper.

Maintenant, j'ai un tableau dans le formulaire POST aussi, donc je reçois des erreurs dans strip_tags() et mysql_real_escape_string. Comment dois-je laisser seulement $_POST["Searching"] pas filtré par filter();?

Répondre

0

Utilisation is_array():

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

Où dans le foreach? – Johnson

+0

Oui, dans foreach, mais changez $ _POST ['Searching'] avec $ value. J'ai changé la réponse. – CristiC

3

Vous pouvez utiliser array_walk_recursive.

array_walk_recursive($_POST,'filter'); 

et faites votre fonction filter prendre la valeur par référence:

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

syntaxe mineure - ne devrait pas 'array_walk_recursive (& $ _ POST, filtre),' être 'array_walk_recursive (& $ _ POST, 'filtre');' ? Aussi, juste comme une question pour ma propre édification - Cette fonction n'essaie-t-elle pas de modifier le tableau source sur place, plutôt que de le transcrire dans un nouveau tableau, comme '$ data' comme dans la question? Je vois sur php.net que cette fonction ne renvoie que true ou false. –

+0

La passe d'appel par référence est également déconseillée et déclenchera des avertissements. Devrait juste être 'array_walk_recursive ($ _ POST, 'filter');' – meagar

+0

@ Lucanos, @ meagar: Merci. – codaddict

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

Cette solution est incomplète - elle ne fait rien si elle touche un tableau. Alors qu'il empêche un problème avec 'filter()' en lançant une erreur quand il essaie de gérer un tableau, cela signifierait aussi que le tableau perdrait des données (en ce sens que les sous-tableaux seraient supprimés). –

+0

Vous avez raison. J'ai tapé ma solution originale trop rapidement. – FallenRayne

1

D'abord, vous pouvez utiliser array_map() pour accélérer ce, et tout ce que vous avez à faire est de permettre à la fonction d'identifier les tableaux et de s'appeler récursivement.

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

Puis l'appeler comme ceci:

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