Foros del Web » Programando para Internet » PHP »

Evitar duplicidad de email y password mediante php

Estas en el tema de Evitar duplicidad de email y password mediante php en el foro de PHP en Foros del Web. HOla amigos/as, a ver si me pueden ayudar con esto que no le saco la solucion. Tengo un codigo que me inserta en bbdd el ...
  #1 (permalink)  
Antiguo 31/03/2015, 04:51
 
Fecha de Ingreso: mayo-2012
Mensajes: 760
Antigüedad: 12 años, 6 meses
Puntos: 5
Evitar duplicidad de email y password mediante php

HOla amigos/as, a ver si me pueden ayudar con esto que no le saco la solucion.

Tengo un codigo que me inserta en bbdd el email y la contraseña , (y algunos datos mas ).

Pero el problema es que si en el formulario le doy a enviar de nuevo por segunda vez, me vuelve a insertar en la base de datos de nuevo el email y contraseña.


Se que se puede restringir esto mediante sql. pero necesito limitar la duplicidad del email y la contraseña mediante php.

¿Como se puede hacer esto?

De veras que no me sale por mas que lo intento.

Miren este es el codigo que tengo:

Gracias de antemano:


archivo 1, llamado : OperacionesMysql.php

Código PHP:
Ver original
  1. class OperacionesMysql
  2.        
  3.         {
  4.    
  5.             private $servidor = 'localhost';
  6.             private $usuario = 'root';
  7.             private $pass = '';
  8.             private $basedatos = 'bbdd_estadisticas';  
  9.        
  10.             public $nombre_tabla = 'usuarios';
  11.        
  12.        
  13.             public $array_datos = array(
  14.  
  15.                 'nombre'=>'$nombre',
  16.                 'apellidos'=>'$apellidos',
  17.                 'nick'=>'$nick',
  18.                 'email'=>'$email',
  19.                 'password'=>'$password',
  20.                 'repassword'=>'$repassword',               
  21.                 'sexo'=>'$sexo',
  22.                 'dia'=>'$dia',
  23.                 'mes'=>'$mes',
  24.                 'ano'=>'$ano'              
  25.  
  26.             );
  27.  
  28.  
  29.             //CONECTAMOS A LA BASE DE DATOS..................................................................
  30.            
  31.             public function ConectarBbdd()
  32.            
  33.             {
  34.                 $con = mysqli_connect($this->servidor, $this->usuario, $this->pass, $this->basedatos) or
  35.                 die ('Lo siento pero no conecta a la BBDD');
  36.                
  37.                 return $con;       
  38.             }
  39.  
  40.  
  41.             //INSERTAR DATOS...................................................................................
  42.  
  43.             function InsertarDatos($nombre_tabla, $array_datos)
  44.            
  45.                 {          
  46.                     $sql = "INSERT INTO " . $nombre_tabla . " (";
  47.                     $sql .= implode(', ', array_keys($array_datos));
  48.                     $sql .= ") VALUES('". implode("', '", $array_datos)."') ";
  49.                                          
  50.    
  51.                     $con = $this->ConectarBbdd();
  52.                    
  53.                     mysqli_query($con, $sql) or die ('Lo siento pero no se inserta en BBDD' . mysqli_error($con));
  54.                    
  55.                     header("Location:formulario_registrate.php");                                                                                  
  56.                 }      
  57.  
  58.  
  59.  
  60.             //SELECCIONAR TODOS LOS DATOS DE UNA TABLA..........................................................
  61.                    
  62.             public function SeleccionarTodosDatos($nombre_tabla)
  63.            
  64.                 {      
  65.                     $sql = "SELECT * FROM " . $nombre_tabla . " ";
  66.                    
  67.                    
  68.                     $con = $this->ConectarBbdd();
  69.                     $res = mysqli_query($con,$sql) or die ('Lo siento no se muestran los datos.' . mysqli_error($con));
  70.                     return $res;   
  71.                 }
  72.  
  73.  
  74.         } //fin de OperacionesMysql


archivo 2, llamado : validar_formulario_registrarse.php

Código PHP:
Ver original
  1. include '../../clases/OperacionesMysql.php';   
  2.  
  3.     $op = new OperacionesMysql();  
  4.  
  5.  
  6.  
  7. //RECIBIBOS LOS DATOS DEL FORMULARIO.....................................................
  8.  
  9.     $nombre = trim(($_POST['nombre']));
  10.     $apellidos = trim(($_POST['apellidos']));  
  11.     $nick = trim(($_POST['nick']));    
  12.     $email = trim(($_POST['email']));
  13.     $password = trim(($_POST['password']));
  14.     $repassword = trim(($_POST['repassword']));
  15.     $sexo = $_POST['sexo'];    
  16.     $dia = $_POST['dia'];
  17.     $mes = $_POST['mes'];
  18.     $ano = $_POST['ano'];
  19.  
  20.  
  21.  
  22.     $nombre_tabla = $op->nombre_tabla;
  23.  
  24.     $op->SeleccionarTodosDatos($nombre_tabla); 
  25.  
  26.  
  27.     while($fila = mysqli_fetch_assoc($res))
  28.    
  29.         {  
  30.        
  31.             if (($fila['email'] == $email) and ($fila['password'] != $password))
  32.            
  33.                 {
  34.                     header("Location:formulario_registrate.php?tipo_error_registro_usuario=email_existente");
  35.                 }
  36.            
  37.                
  38.                 else
  39.            
  40.                
  41.             if (($fila['email'] != $email) and (($fila['password'] == $password) or ($fila['repassword'] == $repassword)))
  42.            
  43.                 {
  44.                     header("Location:formulario_registrate.php?tipo_error_registro_usuario=password_existente");
  45.                 }
  46.  
  47.                
  48.                 else
  49.                
  50.                
  51.             if (($fila['email'] == $email) and (($fila['password'] == $password) or ($fila['repassword'] == $repassword)))
  52.            
  53.                 {
  54.                     header("Location:formulario_registrate.php?tipo_error_registro_usuario=email_y_password_existente");
  55.                 }  
  56.  
  57.                                    
  58.         } //fin de while
  59.  
  60.  
  61.  
  62. //INSERTAR CAMPOS EN LA TABLA USUARIOS EN LA BBDD.................................................................  
  63.  
  64.             //Lineas para solo poner el nombre de la tabla en el archivo "OperacionesMysql.php"
  65.             $nombre_tabla = $op->nombre_tabla; 
  66.        
  67.            
  68.             $array_datos = array(
  69.            
  70.                 'nombre'=>$nombre,
  71.                 'apellidos'=>$apellidos,
  72.                 'nick'=>$nick,
  73.                 'email'=>$email,
  74.                 'password'=>$password, 
  75.                 'repassword'=>$repassword,             
  76.                 'sexo'=>$sexo,
  77.                 'dia'=>$dia,
  78.                 'mes'=>$mes,
  79.                 'ano'=>$ano
  80.                                
  81.             );         
  82.      
  83.      
  84.             $op->InsertarDatos($nombre_tabla, $array_datos);
  #2 (permalink)  
Antiguo 31/03/2015, 06:28
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 17 años
Puntos: 2658
Respuesta: Evitar duplicidad de email y password mediante php

Cita:
Se que se puede restringir esto mediante sql. pero necesito limitar la duplicidad del email y la contraseña mediante php.
En primer lugar y ante todo, debes proteger la base de datos, de modo que ni ante un error de la aplicación se generen duplicidades. En ese sentido crea un índice UNIQUE pero únicamente sobre el e-Mail, no sobre la password. Si el indice lo hicieras con la password también permitiría de todos modos crear dos entradas con el mismo e-Mail pero con diferentes password, lo que es un error.
Por otro lado, poner como unica la PWD tampoco tiene mucho sentido, porque la misma pasword sólo aplicaría en combinación con el mismo e-Mail, lo que reduce al mínimo los problemas. Además no hay razones validas para restringir la pwd de ese modo. Sí el e-Mail.

Por otro lado, debes recordar que PHP no tiene forma de saber si algo está o no registrado en la base, a menos que lo valides. Para eso solo existen dos formas: 1) Consultas a la base si el e-Mail ya existe antes de crear la inserción (esto de todos modos es lógicamente necesario), y 2) REgistrar de algún modo que el formulario ya se envió, y que envío y registración fueron exitosos.

En este último punto yo te sugeriría que usaras la sesión en PHP para almacenar dos cosas:

1) Un atributo booleano que cuando envías el formulario se ponga en TRUE.
2) Un atributo booleano que cuando la registración sea exitosa se ponga en TRUE.

Obviamente ambos atributos se deben crear como FALSE al inicio, y además ser verificados antes de enviar el formulario, aunque sea por primera vez.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #3 (permalink)  
Antiguo 31/03/2015, 10:03
 
Fecha de Ingreso: mayo-2012
Mensajes: 760
Antigüedad: 12 años, 6 meses
Puntos: 5
Respuesta: Evitar duplicidad de email y password mediante php

Hola, gnzsoloyo:

mira estoy haciendo la "Consulta a la base si el email ya existe antes de crear la inserción".

Pero me tira un error que no entiendo mira:

Código PHP:
Ver original
  1. class OperacionesMysql
  2.        
  3.         {
  4.    
  5.             private $servidor = 'localhost';
  6.             private $usuario = 'root';
  7.             private $pass = '';
  8.             private $basedatos = 'bbdd_prueba';
  9.  
  10.             //CONECTAMOS A LA BASE DE DATOS..................................................................
  11.            
  12.             public function ConectarBbdd()
  13.            
  14.             {
  15.                 $con = mysqli_connect($this->servidor, $this->usuario, $this->pass, $this->basedatos) or
  16.                 die ('Lo siento pero no conecta a la BBDD');
  17.                
  18.                 return $con;       
  19.             }
  20.  
  21.  
  22.  
  23.             public function SeleccionarDatosSegunEmail($nombre_tabla, $email, $password)
  24.            
  25.                 {  
  26.                     $con = $this->ConectarBbdd();                  
  27.                                
  28.                     echo $sql = "SELECT * FROM " . $nombre_tabla . " WHERE email=".$email. " ";
  29.            
  30.                     $res = mysqli_query($con,$sql) or die ('Lo siento pero no selecciona los datos' . mysqli_error($con));
  31.    
  32.                      
  33.                      
  34.                     if (mysqli_num_rows($res) == 0)
  35.                    
  36.                       {
  37.                            $segundasql = "INSERT INTO " . $nombre_tabla . " (email, password) VALUES ('$email,','$password')";
  38.                          
  39.  
  40.                           $res = mysqli_query($con,$segundasql) or die ('Lo siento pero no selecciona los datos' . mysqli_error($con));
  41.  
  42.                       }        
  43.  
  44.                 }
  45. }

y el error que me dice es:

"Lo siento pero no selecciona los datos"

Y que tengo un error de sintaxis, pero esta bien escrito , mi programa no detecta tampoco ningun error.

y si hago un echo a la senentcia select sale bien, ejem:

"SELECT * FROM usuarios WHERE [email protected]"


  #4 (permalink)  
Antiguo 31/03/2015, 10:08
Avatar de hhs
hhs
Colaborador
 
Fecha de Ingreso: junio-2013
Ubicación: México
Mensajes: 2.995
Antigüedad: 11 años, 4 meses
Puntos: 379
Respuesta: Evitar duplicidad de email y password mediante php

En tu consulta $email debe de estar entre comillas simples
__________________
Saludos
About me
Laraveles
A class should have only one reason to change.
  #5 (permalink)  
Antiguo 31/03/2015, 10:20
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 17 años
Puntos: 2658
Respuesta: Evitar duplicidad de email y password mediante php

Como te dice @hhs: Estás generando un error de ejecución.
El SQL no es PHP. MySQL no entiende que eso es una cadena de texto.

La consulta debe terminar de esta forma:
Código SQL:
Ver original
  1. SELECT *
  2. FROM usuarios
  3. WHERE email='[email protected]'
Para eso el PHp debe ser:
Código PHP:
sql "SELECT * FROM " $nombre_tabla " WHERE email='".$email"' "
¿Se entiende?
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #6 (permalink)  
Antiguo 31/03/2015, 10:25
Avatar de NueveReinas  
Fecha de Ingreso: septiembre-2013
Ubicación: No tan Buenos Aires
Mensajes: 1.101
Antigüedad: 11 años, 2 meses
Puntos: 145
Respuesta: Evitar duplicidad de email y password mediante php

Cita:
Iniciado por gnzsoloyo Ver Mensaje
Como te dice @hhs: Estás generando un error de ejecución.
El SQL no es PHP. MySQL no entiende que eso es una cadena de texto.

La consulta debe terminar de esta forma:
Código SQL:
Ver original
  1. SELECT *
  2. FROM usuarios
  3. WHERE email='[email protected]'
Para eso el PHp debe ser:
Código PHP:
sql "SELECT * FROM " $nombre_tabla " WHERE email='".$email"' "
¿Se entiende?
Por lo que tengo entendido, también se puede hacer algo como esto:

Código PHP:
Ver original
  1. $sql = "SELECT * FROM '$nombre_tabla' WHERE email='$email' ";
__________________
¿Te sirvió la respuesta? Deja un +1
  #7 (permalink)  
Antiguo 31/03/2015, 12:44
 
Fecha de Ingreso: mayo-2012
Mensajes: 760
Antigüedad: 12 años, 6 meses
Puntos: 5
Respuesta: Evitar duplicidad de email y password mediante php

Bueno, gracias a todos por ayudarme a ver el camino correcto.

Lo consegui, ya funciona miren este es el codigo:

Código PHP:
Ver original
  1. public function SeleccionarDatosSegunEmail($nombre_tabla, $array_datos, $email)
  2.            
  3.                 {  
  4.                     $con = $this->ConectarBbdd();                  
  5.                                
  6.                     $sql = "SELECT * FROM " . $nombre_tabla . " WHERE email='$email' ";
  7.            
  8.                     $res = mysqli_query($con,$sql) or die ('Lo siento pero no selecciona los datos' . mysqli_error($con));
  9.                      
  10.                      
  11.                      
  12.                     if (mysqli_num_rows($res) == 0)
  13.                    
  14.                       {
  15.                             $segundasql = "INSERT INTO " . $nombre_tabla . " (";
  16.                             $segundasql .= implode(', ', array_keys($array_datos));
  17.                             $segundasql .= ") VALUES('". implode("', '", $array_datos)."') ";
  18.                                                
  19.  
  20.                             $res = mysqli_query($con,$segundasql) or die ('Lo siento pero no selecciona los datos' .
  21.                             mysqli_error($con));                           
  22.  
  23.  
  24.                             header("Location:formulario_registrate.php?mensaje_registro_usuario=registrado_correctamente");                                             }
  25.                      
  26.                       else
  27.                      
  28.                         {
  29.                            header("Location:formulario_registrate.php?tipo_error_registro_usuario=email_existente");     
  30.                         }
  31.  
  32.                 }

Solo me queda una ultima cosa que no me funciona, veran el mensaje ultimo , cuando

dice "email existente", si se muestra cuando existe el email en la base de datos.

pero el mensaje de "registrado correctamente", no se muestra cuando el email no existe en la bbdd y se inserta.


A que puede ser debido¿?

los mensajes de error vienen espificados en otra pagina asi:

Código PHP:
Ver original
  1. if(isset($_GET['tipo_error_registro_usuario']))
  2.            
  3.                 {
  4.                     switch($_GET['tipo_error_registro_usuario'])
  5.                    
  6.                         {
  7.                             case 'email_existente':
  8.                                                 echo "El email introducido pertenece a otro usuario ya registrado.";
  9.                                                 break;
  10.                        
  11.                        
  12.                             case 'passwords_diferentes':
  13.                                                 echo "Los dos passwords deben ser iguales.";
  14.                                                 break;                                                                                                             
  15.                     }
  16.                    
  17.                 }
  18.  
  19.  
  20.  
  21.  
  22.  
  23.  
  24.             if(isset($_GET['mensaje_registro_usuario']))
  25.            
  26.                 {
  27.                     switch($_GET['mensaje_registro_usuario'])
  28.                    
  29.                         {
  30.                             case 'registrado_correctamente':
  31.                                                 echo "Ha sido registrado correctamente.";
  32.                                                 break;                                                                                                         
  33.                     }
  34.                    
  35.                 }
  #8 (permalink)  
Antiguo 01/04/2015, 04:43
 
Fecha de Ingreso: mayo-2012
Mensajes: 760
Antigüedad: 12 años, 6 meses
Puntos: 5
Respuesta: Evitar duplicidad de email y password mediante php

Na, que se sigue resistiendo,

Si inserta bien , y sin repetirse el email en la base de datos.

pero acto seguido de insertarme en bbdd, me muestra el mensaje de "email_ existente",

cuando no debe mostrarlo ya que ha insertado correctamente por que no existia previamente.

es como si ejecutara la linea del header que hay despues del else, cuando no debe hacerlo.

Incluso he puesto una redireccion a la pagina de google si inserta correctamente y no redirecciona miren:


Código PHP:
Ver original
  1. public function RegistrarUsuario($nombre_tabla, $array_datos, $email)
  2.            
  3.                 {  
  4.                     $con = $this->ConectarBbdd();                  
  5.                                
  6.                     $sql = "SELECT * FROM " . $nombre_tabla . " WHERE email='$email' ";
  7.            
  8.                     $res = mysqli_query($con,$sql) or die ('Lo siento pero no selecciona los datos' . mysqli_error($con));
  9.                      
  10.                      
  11.                      
  12.                     if (mysqli_num_rows($res) == 0)
  13.                    
  14.                       {
  15.                             $segundasql = "INSERT INTO " . $nombre_tabla . " (";
  16.                             $segundasql .= implode(', ', array_keys($array_datos));
  17.                             $segundasql .= ") VALUES('". implode("', '", $array_datos)."') ";
  18.                                                
  19.  
  20.                             $res = mysqli_query($con,$segundasql) or die ('Lo siento pero no selecciona los datos' .
  21.                            
  22.                             mysqli_error($con));
  23.                            
  24.                             //header("Location:formulario_registrate.php?mensaje_registro_usuario=registrado_correctamente");  
  25.                            
  26.                             header("Location:https://www.google.com");                             
  27.                         }
  28.                      
  29.                         else
  30.                      
  31.                         {
  32.                            header("Location:formulario_registrate.php?tipo_error_registro_usuario=email_existente");     
  33.                         }
  34.  
  35.                 }

Etiquetas: duplicidad, email, formulario, mysql, password, registro, select, sql, tabla, usuarios
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 11:09.