Foros del Web » Programando para Internet » PHP »

[SOLUCIONADO] foreach imprime en pantalla más veces de lo que quiero

Estas en el tema de foreach imprime en pantalla más veces de lo que quiero en el foro de PHP en Foros del Web. 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 ...
  #1 (permalink)  
Antiguo 18/06/2013, 10:46
Avatar de 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
  #2 (permalink)  
Antiguo 19/06/2013, 00:25
Avatar de repara2  
Fecha de Ingreso: septiembre-2010
Ubicación: München
Mensajes: 2.445
Antigüedad: 13 años, 7 meses
Puntos: 331
Respuesta: foreach imprime en pantalla más veces de lo que quiero

$validac ion contiene a $validar_usuario por tanto los valores se repiten. El código es muy confuso, intenta utilizar nombres de variables descriptivos, saludos.
__________________
Fere libenter homines, id quod volunt, credunt.
  #3 (permalink)  
Antiguo 19/06/2013, 02:34
Avatar de guardarmicorreo  
Fecha de Ingreso: noviembre-2012
Ubicación: Córdoba
Mensajes: 1.153
Antigüedad: 11 años, 5 meses
Puntos: 84
Respuesta: foreach imprime en pantalla más veces de lo que quiero

Cita:
Iniciado por repara2 Ver Mensaje
$validac ion contiene a $validar_usuario por tanto los valores se repiten. El código es muy confuso, intenta utilizar nombres de variables descriptivos, saludos.
muchas gracias por la ayuda, anoche justo antes de irme a dormir pude encontrar la solución.

tienes razón, el error estaba en que cuando retornaba el segundo $this->validar estaba retornando el anterior método más el segundo y cuando retornaba en el tercero estaba retornando el primero más el segundo más el tercero, por eso se duplicaban los errores encontrados. gracias de nuevo !! :D

pd.: tiene razón también en lo del código confuso, utilizo los nombres de variables más descriptivos que puedo pero ¿cómo puedo hacer para escribir un nombre descriptivo sin escribir un nombre de variable terriblemente largo y que por eso no caiga en errores de sintaxis?
  #4 (permalink)  
Antiguo 19/06/2013, 03:03
Avatar de repara2  
Fecha de Ingreso: septiembre-2010
Ubicación: München
Mensajes: 2.445
Antigüedad: 13 años, 7 meses
Puntos: 331
Respuesta: foreach imprime en pantalla más veces de lo que quiero

¿cómo puedo hacer para escribir un nombre descriptivo sin escribir un nombre de variable terriblemente largo y que por eso no caiga en errores de sintaxis?:
0. Identifica correctamente los nombres de las funciones y métodos, deberían ser de tipo verbo_sustantivO. validar_usuario(), eliminar_variable(), etc.
valida() or validar(), usuario_obtenido() no son buenos nombres
1. Las variables deberían ser sustantivos o adjetivos: $usuario_validado, $lista_compra, $autorizado, etc...
$validar, $obtener, etc. no son buenos nombres.
2. En general, ayuda mucho escribir en inglés dado que es un idioma bastante mas analitico que el castellano.
getUser() o setParam() es mas corto y claro que obtenerUsuario() o establerParametro().
3. Puedes buscar cualquier guia sobre coding standards por ahí.

Por norma general, te diría que no debes ahorrar en letras o palabras, debes utilizar nombres descriptivos que te ayuden a entender el código y evitar errores.

Salu2
__________________
Fere libenter homines, id quod volunt, credunt.
  #5 (permalink)  
Antiguo 19/06/2013, 03:18
Avatar de guardarmicorreo  
Fecha de Ingreso: noviembre-2012
Ubicación: Córdoba
Mensajes: 1.153
Antigüedad: 11 años, 5 meses
Puntos: 84
Respuesta: foreach imprime en pantalla más veces de lo que quiero

Cita:
Iniciado por repara2 Ver Mensaje
¿cómo puedo hacer para escribir un nombre descriptivo sin escribir un nombre de variable terriblemente largo y que por eso no caiga en errores de sintaxis?:
0. Identifica correctamente los nombres de las funciones y métodos, deberían ser de tipo verbo_sustantivO. validar_usuario(), eliminar_variable(), etc.
valida() or validar(), usuario_obtenido() no son buenos nombres
1. Las variables deberían ser sustantivos o adjetivos: $usuario_validado, $lista_compra, $autorizado, etc...
$validar, $obtener, etc. no son buenos nombres.
2. En general, ayuda mucho escribir en inglés dado que es un idioma bastante mas analitico que el castellano.
getUser() o setParam() es mas corto y claro que obtenerUsuario() o establerParametro().
3. Puedes buscar cualquier guia sobre coding standards por ahí.

Por norma general, te diría que no debes ahorrar en letras o palabras, debes utilizar nombres descriptivos que te ayuden a entender el código y evitar errores.

Salu2
sinceramente gracias, ahora sí puedo hacerme una idea de cómo tengo que nombrar correctamente las variables, no sabía sobre esto. gracias!!

doy el tema por resuelto :D

Etiquetas: foreach, formulario, imprime, pantalla, quiero, registro, sql, usuarios, veces
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 04:56.