Ir al contenido


Foto

problema con validador de formulario de registro


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

#1 jonbra

jonbra

    Advanced Member

  • Miembros
  • PipPipPip
  • 57 mensajes

Escrito 28 mayo 2013 - 03:26

he creado un objeto para validar un formulario de registro.

el problema es que si el usuario sí existe y el email también da ambos por válidos cuando tiene que ser que no para no duplicar usuario o multicuenta.

si el usuario no existe pero el email sí da también ambos por válidos

y si el usuario sí existe pero el email no también da ambos por válidos.

no encuentro el error, no entiendo por qué a la hora de comparar valores pasados por form y valores de SELECT lo da todo por válido.

este es mi objeto al completo, es todo lo que hay en el documento he comentado los if concretos que no comparan correctamente los valores.

Gracias! :) :D


<?php

class Validar extends Conectar
{
private $arr = array();
private $salida = array();
public function datos_usuarios($usuarioc, $emailc, $passwdc, $passwd2c)
{

// consulto usuario y email de usuarios


// conciden a la vez el usuario y el email
// o coincide solo el usuario
// o coincide solo el email
$validacion="SELECT usuario, email, passwd FROM usuarios where (usuario='".$usuarioc."' AND email='".$emailc."')
OR (usuario='".$usuarioc."') OR (email='".$emailc."')";

//si no encuentra el usuario y la contraseña entonces es que se puede registrar
if(!empty($validación))
{
$this->salida['true'] = true;
}

$result_conexion=Conectar::connect($validacion);

//asigno los valores a un array con bucle while
while($validacion=mysql_fetch_array($result_conexion))
{
$this->arr[] = $validacion;
}
/*var_dump($this->arr);
echo "<br>";
print_r($emailc);
echo "<br>";*/
//var_dump($this->arr['email']);
//comparo los valores $usuario, $passwd y $email del usuario

////////////////////////////////////
//buscando coincidencias de usuario
////////////////////////////////////
foreach($this->arr as $usuario=>$valor)
{
//#######################################################################
//aquí el primer problema, se cumpla o no la condición siempre va al else
//#######################################################################
if($usuarioc == $valor)
{
$this->salida['usuario'] = "El usuario ya existe <br>";
}
else
{
$this->salida['usuario'] = "Usuario correcto <br>";
}
}

//////////////////////////////////
//buscando coincidencias de email
//////////////////////////////////
foreach($this->arr as $email=>$valor)
{
//#############################################################################
//aquí está el segundo problema, se cumpla o no la condición siempre va al else
//#############################################################################
if($emailc == $valor)
{
$this->salida['email'] = "El E-mail ya existe <br>";
}
else
{
$this->salida['email'] = "E-mail es correcto <br>";
}
}

///////////////////////////
//validando la contraseña
///////////////////////////

//si $passwd y $passwd2 no coinciden
if($passwdc !== $passwd2c)
{
$this->salida['passwd'] = "Las contraseñas no coinciden <br>";
}
else
{
$this->salida['passwd'] = "Contraseña válida <br>";
}

//si la contraseña es insegura (inferior a 6 caracteres)
if(strlen($passwdc) < 6)
{
$this->salida['passwd2'] = "La contraseña tiene menos de 6 caracteres <br>";
}
else
{
$this->salida['passwd2'] = "La contraseña tiene 6 o más caracteres <br>";
}

////////////////////////////
//devuelve el array
////////////////////////////
return $this->salida;
}
}

?>

  • 0

#2 poliburro

poliburro

    Advanced Member

  • Administrador
  • 4.945 mensajes
  • LocationMéxico

Escrito 28 mayo 2013 - 03:54

amigo, tu mismo código dice que eso debe hacer. En el siguiente bloque está explicado:



// conciden a la vez el usuario y el email
// o coincide solo el usuario
// o coincide solo el email
$validacion="SELECT usuario, email, passwd FROM usuarios where (usuario='".$usuarioc."' AND email='".$emailc."')      OR (usuario='".$usuarioc."') OR (email='".$emailc."')";



el uso de OR en la consulta genera ese comportamiento. Qué es lo que buscas validar?
  • 0

#3 jonbra

jonbra

    Advanced Member

  • Miembros
  • PipPipPip
  • 57 mensajes

Escrito 28 mayo 2013 - 04:05

amigo, tu mismo código dice que eso debe hacer. En el siguiente bloque está explicado:



// conciden a la vez el usuario y el email
// o coincide solo el usuario
// o coincide solo el email
$validacion="SELECT usuario, email, passwd FROM usuarios where (usuario='".$usuarioc."' AND email='".$emailc."')      OR (usuario='".$usuarioc."') OR (email='".$emailc."')";



el uso de OR en la consulta genera ese comportamiento. Qué es lo que buscas validar?


claro, lo que quiero lograr son tres casos:

si el usuario y el email existen entonces envíe que el usuario y email no son válidos.

si solo el usuario existe, pero el email no, entonces que solo reporte que el usuario no es válido pero el email sí.

si solo el email existe, pero el usuario no, entonces que solo reporte que el email no es válido pero que el usuario sí.

pero siempre da por válido el usuario y email existan o no los dos o solo uno.
  • 0

#4 poliburro

poliburro

    Advanced Member

  • Administrador
  • 4.945 mensajes
  • LocationMéxico

Escrito 28 mayo 2013 - 04:33

Ok, eso puedes resolverlo de la siguiente manera:




$validacion=  "

SELECT CASE WHEN USUEXISTE <> 0 AND EMAILEXISTE <> 0 THEN
              'USUARIO Y PASSWORD EXISTEN'
            WHEN USUEXISTE <> 0 THEN
              'USUARIO EXISTE'
            WHEN EMAILEXISTE <> 0 THEN
              'EMAIL EXISTE'
            ELSE 'NADA EXISTE'
      END VALIDACION
  FROM (
        SELECT (SELECT COUNT(*) USUEXISTE 
                  FROM usuarios 
                  where usuario='$usuarioc') USUEXISTE,
                (SELECT COUNT(*) EMAILEXISTE
                  FROM usuarios 
                  where email='$emailc') EMAILEXISTE
        ) DATOS

                    ";



  • 0

#5 jonbra

jonbra

    Advanced Member

  • Miembros
  • PipPipPip
  • 57 mensajes

Escrito 28 mayo 2013 - 04:44

Ok, eso puedes resolverlo de la siguiente manera:




$validacion=  "

SELECT CASE WHEN USUEXISTE <> 0 AND EMAILEXISTE <> 0 THEN
              'USUARIO Y PASSWORD EXISTEN'
            WHEN USUEXISTE <> 0 THEN
              'USUARIO EXISTE'
            WHEN EMAILEXISTE <> 0 THEN
              'EMAIL EXISTE'
            ELSE 'NADA EXISTE'
      END VALIDACION
  FROM (
        SELECT (SELECT COUNT(*) USUEXISTE 
                  FROM usuarios 
                  where usuario='$usuarioc') USUEXISTE,
                (SELECT COUNT(*) EMAILEXISTE
                  FROM usuarios 
                  where email='$emailc') EMAILEXISTE
        ) DATOS

                    ";




ahhhh, definitivamente voy a ponerme de lleno en sql, porque lo que me has escrito se sale de mis conocimientos.

voy a ponerme a ello para razonar tu código, comprenderlo, desmenuzarlo y que me quede bien clarito :p

de todo corazón muchísimas gracias!! :D
  • 0

#6 poliburro

poliburro

    Advanced Member

  • Administrador
  • 4.945 mensajes
  • LocationMéxico

Escrito 28 mayo 2013 - 04:53

voy a ponerme a ello para razonar tu código, comprenderlo, desmenuzarlo y que me quede bien clarito :p


:) Realmente no es nada del otro mundo amigo, te explico.

el primer bloque



SELECT (SELECT COUNT(*) USUEXISTE 
                  FROM usuarios 
                  where usuario='$usuarioc') USUEXISTE,
                (SELECT COUNT(*) EMAILEXISTE
                  FROM usuarios 
                  where email='$emailc') EMAILEXISTE




es un select que devuelve solo una fila con dos columnas, cada columna contiene el número de coincidencias para usuario y correo. Dando como resultado si hubiera un usuario coincidente algo así

UsuExiste      EmailExiste
    1                  0


Luego, ya que tenemos un recorset que contiene ese bloque, ahora, vamos a meterlo dentro de una subconsulta para evaluar cada columna con un were, de ahí surge el bloque completo:



SELECT CASE WHEN USUEXISTE <> 0 AND EMAILEXISTE <> 0 THEN
              'USUARIO Y PASSWORD EXISTEN'
            WHEN USUEXISTE <> 0 THEN
              'USUARIO EXISTE'
            WHEN EMAILEXISTE <> 0 THEN
              'EMAIL EXISTE'
            ELSE 'NADA EXISTE'
      END VALIDACION
  FROM (
        SELECT (SELECT COUNT(*) USUEXISTE 
                  FROM usuarios 
                  where usuario='$usuarioc') USUEXISTE,
                (SELECT COUNT(*) EMAILEXISTE
                  FROM usuarios 
                  where email='$emailc') EMAILEXISTE
        ) DATOS








  • 0

#7 jonbra

jonbra

    Advanced Member

  • Miembros
  • PipPipPip
  • 57 mensajes

Escrito 28 mayo 2013 - 05:17


voy a ponerme a ello para razonar tu código, comprenderlo, desmenuzarlo y que me quede bien clarito :p


:) Realmente no es nada del otro mundo amigo, te explico.

el primer bloque



SELECT (SELECT COUNT(*) USUEXISTE 
                  FROM usuarios 
                  where usuario='$usuarioc') USUEXISTE,
                (SELECT COUNT(*) EMAILEXISTE
                  FROM usuarios 
                  where email='$emailc') EMAILEXISTE




es un select que devuelve solo una fila con dos columnas, cada columna contiene el número de coincidencias para usuario y correo. Dando como resultado si hubiera un usuario coincidente algo así

UsuExiste      EmailExiste
    1                  0


Luego, ya que tenemos un recorset que contiene ese bloque, ahora, vamos a meterlo dentro de una subconsulta para evaluar cada columna con un were, de ahí surge el bloque completo:



SELECT CASE WHEN USUEXISTE <> 0 AND EMAILEXISTE <> 0 THEN
              'USUARIO Y PASSWORD EXISTEN'
            WHEN USUEXISTE <> 0 THEN
              'USUARIO EXISTE'
            WHEN EMAILEXISTE <> 0 THEN
              'EMAIL EXISTE'
            ELSE 'NADA EXISTE'
      END VALIDACION
  FROM (
        SELECT (SELECT COUNT(*) USUEXISTE 
                  FROM usuarios 
                  where usuario='$usuarioc') USUEXISTE,
                (SELECT COUNT(*) EMAILEXISTE
                  FROM usuarios 
                  where email='$emailc') EMAILEXISTE
        ) DATOS




sinceramente MIL gracias, porque con tu breve explicación me has ayudado a entender mucho mejor. de todas formas entendí el concepto pero no la técnica de la consulta, entonces como aquí en españa son ya la 1:30 de la madrugada mañana a primera hora me pongo con esto para tener un validador básico.

cada vez que vengo a este foro a preguntar algo salgo contento, pero hoy salgo muy contento.

gracias por tu tiempo y dedicación.

un gran saludo!!! :D :p
  • 0




IP.Board spam blocked by CleanTalk.