Ir al contenido


Foto

foreach imprime mensaje de error más veces de las que quiero


  • Por favor identifícate para responder
2 respuestas en este tema

#1 jonbra

jonbra

    Advanced Member

  • Miembros
  • PipPipPip
  • 57 mensajes

Escrito 18 junio 2013 - 12:56

les explico mi problema.

para validar los datos que el usuario introduce para su registro en la supuesta web que estoy creando hago lo siguiente:

desde el documento funciones (el controlador según el Modelo Vista Controlador) instancio la clase correspondiente para validar los datos, en ella tengo tres funciones que validan cada campo.
en el documento funciones nuevamente uno los return en un solo array.

el problema es que al recorrer todos los array y llegar hasta el último valor comprobando si es un valor distinto de true genera un mensaje de error, sino no genera ningún mensaje, me genera 3 veces el mismo mensaje con los campos usuario y email, pero con la contraseña no.

estos son los documentos

funciones.php (controlador)


////////////////////////////////////////////////////////////////////////////////
//valida los datos introducidos por formulario de registro de nuevos usuarios
////////////////////////////////////////////////////////////////////////////////
function validar($usuario, $email, $passwd, $passwd2, $nombre)
{
//creo una instancia para obtener un usuario, una contraseña y un email existentes
$usuario_class = new Validar($usuario, $email, $passwd, $passwd2);

//compruebo que los campos no contienen sql injection, email injection, url's ni operadores
$validar_usuario = $usuario_class->seguridad_usuario();
$validar_email = $usuario_class->seguridad_email();
$validar_passwd = $usuario_class->seguridad_passwd();
$validacion = array ( $validar_usuario , $validar_email , $validar_passwd );
//var_dump($validar_usuario);

/* con este trozo de código me imprime una sola vez el error*/
/*foreach ( $validar_usuario as $caja=>$valor )
{
if ( is_array($valor) )
{
foreach ( $valor as $caja2=>$valor2 )
{
if ( $valor2 !== true )
{
echo "Error en " .$caja. ", <b>".$valor2."</b> no es válido <br>";
}
}
}

}*/
//var_dump($validacion);

//pero con este código lo imprime tres veces
foreach ( $validacion as $caja=>$valor )
{
//si validación contiene un array
if ( is_array ( $valor ) )
{
foreach ( $valor as $key => $result )
{
//si a su vez el array contiene otros array
if ( is_array( $result ) )
{
foreach ( $result as $primero=>$segundo )
{
//si el valor no es true (que indica válido)
//imprime el mensaje de error
if ( $segundo !== true)
{
echo "Error en " .$key. ",  <b>".$segundo."</b> no es válido <br>";
}
}
}
}
}
}
}



validador.php


/////////////////////////////////////////////////////////////
//aplico el constructor que recibe los parámetros del usuario
/////////////////////////////////////////////////////////////
public function __construct( $usr, $emil, $paswd, $paswd2 )
{
$this->usuarioc = $usr;
$this->emailc = $emil;
$this->passwdc = $paswd;
$this->passwd2c = $paswd2;
$this->all_parametros = array( "usuario" => $usr, "email" => $emil, "passwd" => $paswd, "passwd2" =>$paswd2 );
}

//////////////////////////////////
//funcion para validar el usuario
//////////////////////////////////
public function seguridad_usuario()
{
//paso todos los parámetros de seguridad para usuario
foreach( $this->seguridad_total as $seguridad )
{
//compruebo que cada parámetro de seguridad no está en el usuario
$this->res = stripos ( $this->usuarioc , $seguridad );

//si no está devuelvo true
if ( $this->res === false )
{
$this->validar [$this->usuarioc] [] = true;
}

//si está
else
{
//y es un "espacio"
if( $seguridad == " " )
{
$this->validar [$this->usuarioc] [] = "espacio";
}

//sino
else
{
//devuelvo el error de seguridad donde ha fayado
$this->validar [$this->usuarioc] [] = $seguridad;
}
}
}
return $this->validar;
}

///////////////////////////////
//funcion para validar el email
///////////////////////////////
public function seguridad_email()
{
//paso todos los parámetros de seguridad para email
foreach ( $this->seguridad_email as $seguridad )
{
//compruebo que cada parámetro de seguridad no está en el email
$this->res = stripos ( $this->emailc , $seguridad );

//si no está entonces devuelvo true
if ( $this->res === false )
{
$this->validar [$this->emailc] [] = true;
}

//si está
else
{
//y es un "espacio"
if( $seguridad == " " )
{
$this->validar [$this->emailc] [] = "espacio";
}

//sino devuelvo el error de seguridad donde ha fayado
else
{
$this->validar [$this->emailc] [] = $seguridad;
}
}
}
return $this->validar;
}

///////////////////////////
//validando la contraseña
///////////////////////////
public function seguridad_passwd ()
{
foreach ( $this->seguridad_total as $seguridad )
{
if ( !empty ( $this->passwd2c ) )
{
//si $passwd y $passwd2 no coinciden
if($this->passwdc !== $this->passwd2c)
{
$this->validar [$this->passwdc] ['coincidencia_password'] = false;
}
else
{
$this->validar [$this->passwdc] ['coincidencia_password'] = true;
}
}

//si la contraseña es insegura (inferior a 6 caracteres)
if(strlen($this->passwdc) < 6)
{
$this->validar [$this->passwdc] ['longitud_password_2'] = false;
}
else
{
$this->validar [$this->passwdc] ['longitud_password_2'] = true;
}
}
return $this->validar;
}


si introduzco en el campo usuario un sql injection más una letra que distinga ese sql injection del sql injection email: Content-Typeaaa

si introduzco en el campo email un sql injection más una letra que distinga ese sql injection del sql injectio usuario: Content-typebbb

si introduzo en el campo contraseña una contraseña corta: 123

me devuelve esto y no entiendo por qué:

Error en Content-Type:aaa, Content-Type: no es válido
Error en Content-Type:aaa, Content-Type: no es válido
Error en Content-Type:bbb, Content-Type: no es válido
Error en Content-Type:aaa, Content-Type: no es válido
Error en Content-Type:bbb, Content-Type: no es válido
Error en 123, no es válido


¿alguien me puede ayudar?

gracias!!
  • 0

#2 jonbra

jonbra

    Advanced Member

  • Miembros
  • PipPipPip
  • 57 mensajes

Escrito 19 junio 2013 - 06:36

pude encontrar el error por mi mismo. gracias de todas formas :)

el error consistía en que cada return devolvía lo que había hecho en su función más la función anterior, entonces se duplicaban los errores al recorrerlos para imprimirlos.

lo solucioné retornando variables distintas en cada función.

saludos! :)
  • 0

#3 poliburro

poliburro

    Advanced Member

  • Administrador
  • 4.945 mensajes
  • LocationMéxico

Escrito 19 junio 2013 - 07:15


lo solucioné retornando variables distintas en cada función.

saludos! :)


Gracias por compartirnos la solución amigo mio. Saludos
  • 0




IP.Board spam blocked by CleanTalk.