Ver Mensaje Individual
  #1 (permalink)  
Antiguo 18/06/2013, 10:46
Avatar de guardarmicorreo
guardarmicorreo
 
Fecha de Ingreso: noviembre-2012
Ubicación: Córdoba
Mensajes: 1.153
Antigüedad: 11 años, 5 meses
Puntos: 84
foreach imprime en pantalla más veces de lo que quiero

estoy trabajando en un validador de registro de usuarios.

en el documento de la clase, tengo los parámetros que quiero buscar en propiedades array, luego lo proceso todo para buscar con métodos si alguno de esos parámetros se encuentra ahí, este es el documento:

Código PHP:
Ver original
  1. //aplico el constructor que recibe los parámetros del usuario
  2.     public function __construct( $usr, $emil, $paswd, $paswd2 )
  3.     {
  4.         $this->usuarioc = $usr;
  5.         $this->emailc = $emil;
  6.         $this->passwdc = $paswd;
  7.         $this->passwd2c = $paswd2;
  8.         $this->all_parametros = array( "usuario" => $usr, "email" => $emil, "passwd" => $paswd, "passwd2" =>$paswd2 );
  9.     }
  10.    
  11.     //funcion para evitar que el usuario, email, passwd y passwd2 no contienen sql injection
  12.     public function seguridad_usuario()
  13.     {
  14.         foreach( $this->seguridad_total as $seguridad )
  15.         {
  16.             $this->res = stripos ( $this->usuarioc , $seguridad );
  17.            
  18.             //si no contiene sql injection entonces doy valor true
  19.             if ( $this->res === false )
  20.             {
  21.                 $this->validar[$seguridad][] = true;
  22.             }
  23.             else
  24.             {
  25.                 //sino compruebo que no contiene espacios, si lo contiene doy valor "espacio"
  26.                 if( $seguridad == " " )
  27.                 {
  28.                     $this->validar[$this->usuarioc][] = "espacio"; 
  29.                 }
  30.                 //retorno el parametro de seguridad que da problemas
  31.                 $this->validar[$this->usuarioc][] = $seguridad;
  32.             }
  33.         }
  34.         return $this->validar;
  35.     }
  36.    
  37.     public function seguridad_email()
  38.     {
  39.         foreach ( $this->seguridad_email as $seguridad )
  40.         {
  41.             $this->res = stripos ( $this->emailc , $seguridad );
  42.            
  43.             if ( $this->res === false )
  44.             {
  45.                 $this->validar[$seguridad][] = true;
  46.             }
  47.             else
  48.             {
  49.                 //sino compruebo que no contiene espacios, si lo contiene doy valor "espacio"
  50.                 if( $seguridad == " " )
  51.                 {
  52.                     $this->validar[$seguridad][] = "espacio";  
  53.                 }
  54.                 //retorno el valor
  55.                 $this->validar[$this->emailc][] = $seguridad;                      
  56.             }
  57.         }
  58.         return $this->validar;
  59.     }
  60.    
  61.         ///////////////////////////
  62.         //validando la contraseña
  63.         ///////////////////////////
  64.     public function seguridad_passwd ()
  65.     {
  66.         foreach ( $this->seguridad_total as $seguridad )
  67.         {  
  68.             if ( !empty ( $this->passwd2c ) )
  69.             {
  70.                 //si $passwd y $passwd2 no coinciden
  71.                 if($this->passwdc !== $this->passwd2c)
  72.                 {
  73.                     $this->validar [$this->passwdc] ['coincidencia_password'] = false;
  74.                 }
  75.                 else
  76.                 {
  77.                     $this->validar [$this->passwdc] ['coincidencia_password'] = true;
  78.                 }
  79.             }
  80.            
  81.             //si la contraseña es insegura (inferior a 6 caracteres)
  82.             if(strlen($this->passwdc) < 6)
  83.             {
  84.                 $this->validar [$this->passwdc] ['longitud_password_2'] = false;
  85.             }
  86.             else
  87.             {
  88.                 $this->validar [$this->passwdc] ['longitud_password_2'] = true;
  89.             }
  90.         }
  91.         return $this->validar;
  92.     }

luego tengo en funciones (el controlador según modelo MVC) tengo la instancia a la clase y también los foreach anidados para imprimir todo aquello que me devolvió un valor diferente a true, es decir valores false o "espacio". este es el documento:

Código PHP:
Ver original
  1. ////////////////////////////////////////////////////////////////////////////////
  2.     //valida los datos introducidos por formulario de registro de nuevos usuarios
  3.     ////////////////////////////////////////////////////////////////////////////////
  4.     function validar($usuario, $email, $passwd, $passwd2, $nombre)
  5.     {
  6.         //creo una instancia para obtener un usuario, una contraseña y un email existentes
  7.         $usuario_class = new Validar($usuario, $email, $passwd, $passwd2);
  8.        
  9.         //compruebo que los campos no contienen sql injection, email injection, url's ni operadores
  10.         $validar_usuario = $usuario_class->seguridad_usuario();
  11.         $validar_email = $usuario_class->seguridad_email();
  12.         $validar_passwd = $usuario_class->seguridad_passwd();
  13.         $validacion = array ( $validar_usuario , $validar_email , $validar_passwd );
  14.         //print_r($validar_campos);
  15.        
  16.         foreach ( $validar_usuario as $caja=>$valor )
  17.         {
  18.             if ( is_array($valor) )
  19.             {
  20.                 foreach ( $valor as $caja2=>$valor2 )
  21.                 {
  22.                     if ( $valor2 !== true )
  23.                     {
  24.                         echo "Error en " .$caja. ", <b>".$valor2."</b> no es válido <br>";
  25.                     }
  26.                 }
  27.             }
  28.            
  29.         }
  30.         foreach ( $validacion as $caja=>$valor )
  31.         {
  32.             if ( is_array ( $valor ) )
  33.             {
  34.                 foreach ( $valor as $key => $result )
  35.                 {
  36.                     if ( is_array( $result ) )
  37.                     {
  38.                         foreach ( $result as $primero=>$segundo )
  39.                         {
  40.                             //print_r($result);
  41.                             if ( $segundo !== true)
  42.                             {
  43.                                 echo "Error en " .$key. ",  <b>".$segundo."</b> no es válido <br>";
  44.                             }
  45.                         }
  46.                     }
  47.                 }
  48.             }
  49.             else
  50.             {
  51.                 echo $caja." ".$valor;
  52.             }
  53.         }
  54.     }

¿cual es el problema?

pues que imprime tres veces el mensaje de error
. por ejemplo, si como usuario escribo un CONTENT-TYPE: me devuelve tres veces el mensaje de error

Código PHP:
Ver original
  1. echo "Error en " .$key. ",  <b>".$segundo."</b> no es válido <br>";

Cita:
Error en CONTENT-TYPE:, <b>Content-type:</b> no es válido