Registros de usuarios en Php y Mysql con validación de campos y activación por mail 6/8

Temario

Este es la parte 6 de 8 del tutorial sobre "Registros de usuarios en Php y Mysql con validación de campos y activación por mail" y ya nos queda muy poco para acabar. En el anterior tema aprendimos a dar de alta el usuario en la tabla users_temp.

En esta parte del tutorial vamos a ver cómo activar usuarios en PHP por email, dividiéndolo en varias partes:

  • Crear un nuevo campo en la tabla users_temp
  • Crear función generar_txtAct que genera una clave la cual se insertará en el nuevo campo txt_activ.
  • Incluir campo txt_activ en la función insertarReg
  • Enviar e-mail al usuario con el enlace para activar su cuenta.

Campo txt_activ

Ya vimos como crear la tabla users_temp donde se guardarían todos los usuarios registrados mediante formulario.php pero que aún no habían activado su cuenta.

Para que entendierais mejor las anteriores partes de estos tutoriales, no os hablé del campo que trataremos en este apartado del tutorial.

En la tabla users_temp por lo tanto, incluiremos un nuevo campo llamado txt_activ el cual tendrá informado un código o clave de 20 posiciones (en principio, ya que después podremos parametrizarlo en la llamada a la función).

Para generar este campo en phpmyadmin tenemos que entrar en la estructura de la tabla users_temp y debajo de donde tenemos reflejada dicha estructura (donde se muestran todos los campos), hay un apartado para añadir campos, donde añadiremos el nuestro justo debajo del campo fecAlta. Lo veréis mejor con la siguiente imagen:

Añadir campo en phpMyAdmin

El campo txt_activ lo definiremos varchar(20) NOT NULL.

Añadir campo en phpMyAdmin

Si lo queréis hacer mediante código, incluiríamos en la pestaña SQL la siguiente sentencia:

MySQL:

  1. ALTER TABLE ‘users_temp’ ADD ‘txt_Activ’ VARCHAR( 20 ) NOT NULL AFTER ‘fecAlta’ ;

La estructura ahora quedaría de la siguiente manera:

Añadir campo en phpMyAdmin

Función generar_txtAct

Una vez tenemos creado el campo txt_activ vamos a crear la función para que nos devuelva un campo de 20 caracteres aleatorios.

PHP:

  1. function generar_txtAct($longitud,$especiales){
  2. // Array con los valores a escoger
  3. $semilla = array();
  4. $semilla[] = array('a','e','i','o','u');
  5. $semilla[] = array('b','c','d','f','g','h','j','k','l','m','n','p','q','r','s','t','v','w','x','y','z');
  6. $semilla[] = array('0','1','2','3','4','5','6','7','8','9');
  7. $semilla[] = array('A','E','I','O','U');
  8. $semilla[] = array('B','C','D','F','G','H','J','K','L','M','N','P','Q','R','S','T','V','W','X','Y','Z');
  9. $semilla[] = array('0','1','2','3','4','5','6','7','8','9');
  10.  
  11. // si puede contener caracteres especiales, aumentamos el array $semilla
  12. if ($especiales) { $semilla[] = array('$','#','%','&','@','-','?','¿','!','¡','+','-','*'); }
  13.  
  14. // creamos la clave con la longitud indicada
  15. for ($bucle=0; $bucle <$longitud; $bucle++)
  16. {
  17. // seleccionamos un subarray al azar
  18. $valor = mt_rand(0, count($semilla)-1);
  19. // selecccionamos una posición al azar dentro del subarray
  20. $posicion = mt_rand(0,count($semilla[$valor])-1);
  21. // cogemos el carácter y lo agregamos a la clave
  22. $clave .= $semilla[$valor][$posicion];
  23. }
  24. // devolvemos la clave
  25. return $clave;
  26. }

La función, como podéis ver, la hemos llamado generar_txtAct y si os fijáis, le pasamos 2 parámetros:

  • Longitud: Como bien dice la palabra, es la longitud que va a tener nuestra "clave", que en nuestro caso será de 20 posiciones tal y como hemos definido en la tabla varchar(20)
  • Especiales: Con este parámetro indicaremos si queremos que en la clave aparezcan caracteres especiales o no. True (si aparecen caracteres especiales) y False (no aparecen).

Dentro de la función hemos definido los caracteres permitidos con un array llamado semilla. Este array lo podemos modificar a nuestro gusto según los caracteres que queramos permitir.

Para llamar a la función que nos cree una "clave" de 20 posiciones y sin caracteres especiales, bastará con esta línea:

PHP:

  1. $clave = generar_txtAct(20,false);

Incluir campo txt_activ en la función insertarReg

Ahora que ya tenemos la función para informar la clave a introducir en la tabla, hay que modificar la función insertarReg para incluir este campo (la modificación la señalo con el comentario //MODIF NUMERO). Así que la función quedaría de la siguiente manera:

PHP:

  1. function insertarReg($name_, $username_, $password1_, $email_){
  2.  
  3. /*Llamar a la función para generar el texto aleatorio para Activar Usuario. Le pasamos como parámetro los caracteres que queremos generar y si los queremos especiales o no*/
  4. //MODIF 1
  5. $clave = generar_txtAct(20,false);
  6.  
  7. /*Tenéis que declarar las variables $servidor, $usuario,$password y
  8. $sdb (base de datos). En mi caso para Localhost tengo lo siguiente:*/
  9. $servidor = "localhost";
  10. $usuario = "root";
  11. $password = "";
  12. $sdb = "prueba1";
  13.  
  14. $ilink3=mysql_connect($servidor,$usuario,$password) or die(mysql_error());
  15. mysql_select_db($sdb,$ilink3);
  16.  
  17. //MODIF 2
  18. $inserta= "insert into users_temp (nombre,usersTemp,password,email,fecAlta,txt_Activ) values ('$name_','$username_','$password1_','$email_',CURDATE(),'$clave')";
  19. $resultado3=mysql_query($inserta,$ilink3) or die (mysql_error());
  20.  
  21. if (!$resultado3)
  22. return false;
  23. else
  24. return true;
  25. }

Paso a explicar cada una de las líneas que hemos modificado:

Modif1: Hacemos la llamada a la función generar_txtAct para que nos recupere una “clave” de 20 posiciones y sin caracteres especiales.
Modif2: Incluimos en la sentencia sql, el campo txt_Activ que irá informado con la clave que hemos recuperado.

Si hacemos la prueba, dando de alta un registro nuevo desde formulario.php, veremos que en la tabla tendremos la siguiente información:

Añadir campo en phpMyAdmin

Ya tenemos nuestro registro en la tabla users_temp con el nuevo campo txt_Activ informado.

Enviar e-mail al usuario con el enlace para activar su cuenta

Como bien hablamos en el primer tema de esta serie de tutoriales, una vez el usuario se registre rellenando el formulario que le proporcionamos, es dado de alta en una tabla temporal (users_temp) y no pasará a formar parte de la tabla definitiva (usuarios) hasta que active su cuenta haciendo clic en el enlace que se le pasa por e-mail.

Esta última parte es la que vamos a abordar ahora.

Para el envío del correo electrónico haremos uso de la función mail que trae PHP desde su versión 4.

El envío del e-mail con la URL para activar la cuenta del usuario lo crearemos en una función llamada mailActivacion. Esta función se encarga de enviar el correo electrónico al usuario con un texto y un enlace de este tipo:

PHP:

  1. activar.php?id=clavede20posicioness

Este tipo de enlace, se crea de esta manera para que en el archivo "activar.php" recojamos el valor del id (que es la clave de 20 posiciones) por el método GET.

Nota: SI no sabéis como utilizar los métodos GET y POST en PHP, os aconsejo este manual.

Volviendo a la función mailActivacion para enviar el mail donde el usuario podrá activar su cuenta, vamos a escribir su código:

PHP:

  1. function mailActivacion($dir_correo, $usuario){
  2.  
  3. $destinatario = $dir_correo;
  4. $asunto = "COLORATE - Activar Usuario";
  5. $cuerpo = '
  6. COLORATE - Activar usuario
  7. <h1>Hola';
  8. $cuerpo .= $usuario;
  9. $cuerpo .= '</h1>
  10. <strong>Gracias por registrarte en COLORATE</strong>. Para completar el registro tienes que confirmar que has recibido este email haciendo click en el siguiente enlace:
  11. <p style="text-align: center;">';
  12. $cuerpo .= $url;
  13. $cuerpo .= '</p>
  14. ';
  15.  
  16. //para el envío en formato HTML
  17. $headers = "MIME-Version: 1.0\r\n";
  18. $headers .= "Content-type: text/html; charset=iso-8859-1\r\n";
  19.  
  20. //dirección del remitente
  21. $headers .= "From: Admin COLORATE \r\n";
  22.  
  23. //dirección de respuesta, si queremos que sea distinta que la del remitente
  24. $headers .= "Reply-To: direccion_respuesta@dominio.com \r\n";
  25.  
  26. //direcciones que recibián copia
  27. //$headers .= "Cc: correocopia@dominio.com\r\n";
  28.  
  29. //direcciones que recibirán copia oculta
  30. //$headers .= "Bcc: copiaocula1@dominio.com, copiaocula1@dominio.com \r\n";
  31.  
  32. mail($destinatario,$asunto,$cuerpo,$headers);
  33.  
  34. }

Como veis en el código, en primera instancia vemos que la función recoge por parámetros dir_correo y usuario ya que serán utilizadas para la composición del texto del mail y para saber a quien hay que enviarle dicho email.

Otra parte del código y en la que nos centraremos ahora es la variable url. Esta variable es la que tiene más importancia ya que es el enlace del que venimos hablando durante todo el apartado, con el cual el usuario activará su cuenta y pasará a formar parte de la tabla usuarios.

Para crear dicho enlace, nos hará falta la clave (que ya hemos creado previamente en al darse de alta en la tabla users_temp en la función generar_txtAct) y el archivo que recogerá esa información para comenzar el proceso de alta en la tabla usuarios. En este caso el archivo será "activar.php", por tanto en el código de nuestra aplicación, una vez tenemos la clave, deberemos informar una variable con la URL y esto lo conseguimos volviendo a modificar la función insertarReg del archivo funciones.php de la siguiente manera (la modificación la señalo con el comentario //MODIF NUMERO)

PHP:

  1. //FUNCION PARA INSERTAR EL REGISTRO EN LA TABLA users_temp
  2. function insertarReg($name_, $username_, $password1_, $email_){
  3.  
  4. //MODIF 1
  5. //Declaramos esta variable global, para poder usarla en toda la aplicación
  6. global $url;
  7. //LLamar a la función para generar el texto aleatorio para Activar Usuario.
  8. //Le pasamos como parámetro los caracteres que queremos generar y si los queremos especiales o no
  9. $clave = generar_txtAct(20,false);
  10.  
  11. //MODIF 2
  12. //Montamos la estructura del enlace con la clave.
  13. $url = "activar.php?id=" . $clave;
  14.  
  15. /*Teneis que declarar las variables $servidor, $usuario,$password y
  16. $sdb (base de datos). En mi caso para Localhost tengo lo siguiente:*/
  17. $servidor = "localhost";
  18. $usuario = "root";
  19. $password = "";
  20. $sdb = "prueba1";
  21.  
  22. $ilink3=mysql_connect($servidor,$usuario,$password) or die(mysql_error());
  23. mysql_select_db($sdb,$ilink3);
  24.  
  25. $inserta= "insert into users_temp (nombre,usersTemp,password,email,fecAlta,txt_Activ) values ('$name_','$username_','$password1_','$email_',CURDATE(),'$clave')";
  26. $resultado3=mysql_query($inserta,$ilink3) or die (mysql_error());
  27.  
  28. if (!$resultado3)
  29. return false;
  30. else
  31. return true;
  32. }

Modif1: Declaramos la variable URL como global para poder usarla en otra parte de la "aplicación", ya que por norma, las variables que usamos en las funciones no tienen ningún valor fuera de ellas.
Modif2: Construimos la URL que enviaremos por mail y que utilizaremos en la función mailActivacion.

Os muestro dos imágenes con la recepción del mail (prueba de usuario JOSELE) y el contenido de este:

Email activar usuario

Email activar usuario

Con esto ya hemos creado el mail que se enviará al usuario una vez se haya registrado en el formulario. En el siguiente tutotial aprenderemos como dar de alta al usuario en la tabla final USUARIOS una vez haya hecho clic en el enlace enviado.

Temario

Posts Relacionados