Académique Documents
Professionnel Documents
Culture Documents
El registro de usuarios es algo que todo desarrollador debera conocer al dedillo, es una tarea
muy comn dentro de la construccin de una pgina web y con este tutorial quiero que
aprendis todos los pasos desde el inicio hasta la activacin del usuario en nuestra base de datos.
Este diagrama que os presento tenis que tenerlo muy en cuenta durante todo el tutorial, ya que
es en lo que nos vamos a basar bsicamente.
Antes de nada, vamos a hacer un planing de lo que vamos a aprender durante los distintos das
que ir ampliando el tutorial, hasta llegar a tener un sistema de registro de usuarios completo,
para as no perdernos en el camino.
El tutorial lo publicar en das salteados, as que estar atentos.
Registros de usuarios en Php y Mysql con validacin de campos y activacin por mail 2/6
Lo primero que tenemos que tener es un entorno de desarrollo en nuestro PC con Servidor Web
en forma local que incluya:
Php
Como todo esto resulta un poco engorroso instalarlo si no tienes experiencia, existen aplicaciones
que te facilitan mucho la tarea instalndote Apache, MySQL y Php con un proceso muy intuitivo
(el tpico siguiente, siguiente).
Entre las aplicaciones que tenemos disponibles para instalar el pack de Apache, MySql y Php
recomiendo una de estas dos:
WampServer
Appserv 2.5.10
Para este tutorial vamos a utilizar Appserv 2.5.10, as que lo primero que haremos ser
descargarla desde su pgina oficial.
Una vez tenemos descargada la aplicacin la instalamos para tener finalmente en nuestro
ordenador lo que necesitamos para empezar manos a la obra.
Instalar estos paquetes (utilizar solo uno) es bien sencillo aunque aqu tenis 2 tutoriales bien
explicados para seguirlos paso a paso:
Ya tenemos instalado Appserv en nuestro ordenador!!. Vamos a hacer una prueba sencilla para
saber si est todo correcto:
1.
Probar Mysql: Para probar si tenemos instalado Mysql en nuestro ordenador, basta con abrir el
navegador y escribir la siguiente direccin > http://localhost. Si nos muestra una pgina con enlaces para
acceder aphpMyAdmin Database Manager Version 2.10.3 y a PHP Information Version 5.2.6 , entre
otros, podemos estar contentos de tener nuestro ordenador preparado. Ahora slo tenemos que entrar en
phpMyAdmin Database Manager y poner las credenciales que configuramos en la instalacin. (si no has
cambiado nada, normalmente es usuario: root y password: a espacios).
2.
Probar PHP: Podemos hacerlo de 2 maneras, la ms rpida y fcil es hacer clic en el enlace que nos
sale en el punto anterior (PHP Information Version 5.2.6), si nos muestra informacin de PHP, lo tenemos
correctamente instalado. La otra manera sera crearnos un archivo .php cuyo contenido sea por ejemplo:
[php][/php]
Registros de usuarios en Php y Mysql con validacin de campos y activacin por mail 3/6
2.
En nuestro caso y es el que aconsejo yo, vamos a utilizar la segunda opcin. Elegir una u otra va a
gustos, pero lo que si es cierto es que de esta manera evitamos tener en una misma tabla
usuarios buenos de usuarios que podrian ser peligrosos o Spam.
La explicacin de optar por crear una tabla USERS_TEMP es bien sencilla. Seguro que alguna vez
os habis registrado en una web y para verificar que tus datos son correctos (es decir, que no eres
un robot de los que se mueven por Internet) se enva un e-mail (el facilitado en el formulario
de registro) al usuario con un enlace para activar su cuenta. Bien, pues a nivel de tabla consiste
en que cuando el usuario rellena el formulario y lo enva, se da de alta un registro en la tabla
USERS_TEMP (temporal) hasta que active su cuenta mediante el link que se le ha enviado por
correo, momento en el cual se da de alta en la tabla definitiva USUARIOS.
Grficamente el proceso sera de esta manera:
Ya que sabemos el funcionamiento del proceso de registro de usuarios, vamos a crear nuestra
base de datos en PhpMyAdmin.
Como ya tenemos instalado MySql, tendremos que acceder a PhpMyAdmin donde daremos de alta
la base de datos y las tablas, siguiendo los siguientes pasos:
Abrimos el navegador y escribimos http://localhost y hacemos clic en PhpMyAdmin e
introducimos los datos de Usuario y Contrasea (por defecto suele ser usuario root y contrasea a
espacios).
Para hacer ms fcil el trabajo (aunque recomiendo que lo hagis a mano os aseguro que
aprendereis mas de vuestros errores), podis escribir estaconsulta SQL que os dar de alta la
tabla USUARIOS.
PLAINTEXT
MySQL:
1.
2.
3.
`usuario` VARCHAR(50) NOT NULL COMMENT 'Usuario nico. No puede haber dos
usuarios iguales',
4.
5.
6.
7.
8.
PRIMARY KEY
9.
10.
(`id_usuario`),
Para hacer ms fcil el trabajo (aunque recomiendo que lo hagis a mano os aseguro que
aprendereis mas de vuestros errores), podis escribir esta consulta SQL que os dar de alta la
tabla USERS_TEMP
PLAINTEXT
MySQL:
1.
2.
3.
4.
5.
6.
7.
8.
9.
PRIMARY KEY
10.
11.
(`id_usersTemp`),
) ENGINE=INNODB
En esta ocasin no voy a explicar cada campo puesto que lo nico que cambiar es el nombre
(aadiendole un temp al final).
Registros de usuarios en Php y Mysql con validacin de campos y activacin por mail 4/6
Crear formulario
Mediante un formulario el usuario tendr que rellenar una serie de campos requeridos para poder
darlo de alta en una tabla temporal (USER_TEMP) en primera instancia para luego pasar a formar
parte de la tabla final (USUARIOS), no sin antes validar los datos introducidos en el
formulario para as tener informacin correcta en nuestra base de datos.
El formulario contendr los siguientes campos:
Una vez el usuario rellene los campos y pulse en el botn "Enviar Formulario", los datos
sern validados mediante PHP (podis ver otro tipo de validaciones de formulario en esta
direccin Validacin de formularios con jQuery)
Por lo tanto lo que tenemos que tener claro son los tipos de validaciones que vamos a hacer, que
son:
1.
2.
Usuario: Validar los caracteres introducidos en el campo y que el Usuario no exista ya en la base de
datos (Recuerda que en la base de datos el campo Usuario lo declaramos nico, por lo tanto no puede
haber dos iguales).
3.
Contraseas: Validar que la contrasea 1 y la contrasea 2 son iguales, adems que tengan un
mnimo de 5 caracteres. Por seguridad una vez se envan los datos a validar, si hay algn error no se
recuerdan los campos Password, as que el usuario tendr que volver a escribirlo.
4.
Email: Validar el formato del email y a continuacin validar que el e-mail no existe ya en la base de
datos. (Recuerda que en la base de datos el campo email lo declaramos nico).
NOTA: Esta forma de validar y sus archivos han sido inspirados en un post creado
por Web.ontuts.com (http://web.ontuts.com/tutoriales/como-validar-un-formulario-con-php-y-javascriptjquery/comment-page-1/#comment-3886)
1.
<div class="wrapper">
2.
<div class="section">
3.
<h1>Formulario de Registro</h1>
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
</form></div>
17.
18.
19.
</div>
20.
Hasta ahora lo nico que hemos hecho es crear un formulario simple en HTML en el que a
cada input le otorgamos el parmetro name que ser el que despus pasaremos por PHP.
Sabiendo esto, por ejemplo, para pasar el valor del campo "Nombre de usuario" mediante PHP,
utilizaremos la variable $username (que hemos declarado en el prametro name)
Como podis apreciar, he incluido el formulario en dos capas llamadas wrapper y section y en
cada "input" el valor text para los campos en los que se incluye texto y submit para el botn.
Esto nos sirve para que con ayuda de las hojas de estilo (CSS) podamos darle un mejor aspecto.
Para enlazar el archivo "formulario.php" con la hoja de estilo utilizamos el siguiente cdigo:
PLAINTEXT
HTML:
1.
Con esto estamos diciendo que incluya dentro del archivo "formulario.php"la hoja de estilos que
se encuentra en la misma carpeta con el nombre"main.css".
Nota: No voy a entrar en detalle sopbre las hojas de estilo para centrarnos ms en lo que es la parte HTML y
PHP, asi que el cdigo para darle estilo al formulario lo tenis disponible en el siguiente enlace.
Se ve bonito verdad?. Bueno pues ya lo tenemos creado pero de forma esttica, ahora lo
haremos dinmico incluyendo la validacin del formulario con PHP.
Antes de nada quiero explicar que la validacin la vamos a hacer en el mismo archivo
"formulario.php" para que cuando el usuario haga clic en enviar formulario reciba los mensajes
de error en la misma pgina sin que los datos viajen entre archivos. Esto se consigue poniendo en
el formulario el parmetro action igual al archivo donde tenemos dicho formulario.
Quedara de la siguiente manera:
PLAINTEXT
HTML:
1.
Como veis he incluido el valor method=post, con esto lo que le estamos diciendo es que las
variables pasadas por el formulario se podrn recoger con el mtodo $_POST[variable].
NOTA: Si tenis dudas con la forma de pasar las variables os recomiendo este tutorial donde explican
la diferencia entre el mtodo POST y GET en PHP.
Ahora ya tenemos preparado el formulario para enviar variables y poder "trastear" con ellas.
Vamos a hacerlo por partes, empezaremos validando el nombre. Os recuerdo de nuevo como
vamos a validar el usuario:
Validacin del Nombre: Validamos que tenga como mnimo una longitud de 4 caracteres.
1.
2.
$name = "";
3.
4.
5.
6.
function validateName($name){
7.
8.
if(strlen($name) <4)
return false;
//Si longitud OK pero
NOOK solo caracteres de la A a la z
else if(!preg_match("/^[a-zA-Z]+$/",
$name))
return false;
// SI longitud OK, y caracteres A-z OK
else
return true;
} //Si se ha enviado la variable mediante POST, validamos los
campos if(isset($_POST['send'])){
if(!validateName($_POST['name']))
$name
= "error";
//Validamos si hay error
if($name != "error")
$status =
1; } ?>
Lo primero que vemos es que se inicializa la variable name a espacios, as nos aseguramos que no
contiene ningun valor extrao (o como se suele decir, basura).
1.
if(!validateName($_POST['name']))
Con el valor recogido en la funcin, hacemos las comprobaciones necesarias como son la longitud
mnima y los caracteres soportados. La funcin ValidateName devuelve "false" si hay algun error
en la validacin y por el contrario "true" si todo es correcto, informando el campo namecon el
texto "error" si el retorno de la funcin es "false".
A la vuelta de la funcin hacemos la comprobacin de que si la variablename no es igual a "error",
entonces la validacin del formulario ha sido existosa, informando la variable status con el valor
1.
Esta variable status es la que nos informar de si los campos se han introducido correctamente o
no. Por tanto, lo que tenemos que tener claro es que si status es igual a 1, enviamos el
formulario, de lo contrario, informaremos el error en cuestin.
Cmo logramos esto?. Pues es bastante sencillo una vez veamos el cdigo. Lo que haremos es
incluir en nuestro formulario una condicin con la variable status. Si status no es 1, mostramos el
formulario con los errores, si status es 1 informamos al usuario de que la validacin ha sido
correcta.
Si lo plasmamos en pseudocdigo para que lo entendis mejor seria as:
En caso contrario
Mostrar al usuario texto informando que el formulario se ha enviado con xito.
Os ha quedado claro?. Creo que es una buena forma de explicarlo para que lo entendis a
primera vista. Para ver el cdigo que tendramos hasta el momento, acceder al siguiente enlace:
Cdigo Fuente 1
Fijaros que en la etiqueta label del campo Nombre he puesto otra etiqueta span en la que
informaremos al usuario de cmo tiene que rellenar el campo:
PLAINTEXT
HTML:
1.
Esto no servir mas tarde para indicarle al usuario los errores que hay en el formulario.
Es hora de probarlo en el navegador, rellenamos todos los datos correctamente y vemos como nos
escribe por pantalla "Formulario enviado con xito". Ahora probemos a forzar el error, poniendo
en el campo Nombre, un nombre con 3 letras solo. Esto nos debera generar un error, es decir, no
debera informar por pantalla "Formulario enviado con xito", sino dejarnos en el mismo
formulario.
Como os habis dado cuenta, lo hace correctamente, pero falta algo verdad?. Pues s, porque si
lo dejamos de esta manera, el usuario no sabe realmente porque no avanza el formulario, ni si
quiera sabe si los datos se han enviado, asi que llega la hora de informar los errores.
Para solucionar esto, vamos a poner una condicin en PHP en la etiqueta label para que cuando
haya habido algn error con el nombre (es decir, la variable name es igual a "error"), escriba las
letras en rojo y cuando todo este correcto las escriba en verde. Asi que hay que modificar el
cdigo y ponerlo de la siguiente manera:
PLAINTEXT
HTML:
1.
2.
3.
-->
4.
5.
Como veis en la imagen ya tenemos controlado este campo en cuanto a validacin y en cuanto a
informar al usuario.
El cdigo hasta ahora quedara as:
PLAINTEXT
HTML:
1.
2.
$name = "";
3.
4.
5.
6.
function validateName($name){
7.
8.
if(strlen($name) <4)
return false;
//Si longitud OK pero
NOOK solo caracteres de la A a la z
else if(!preg_match("/^[a-zA-Z]+$/",
$name))
return false;
// SI longitud, SI caracteres A-z
else
return true; } //Si se ha enviado la variable mediante POST, validamos los
campos if(isset($_POST['send'])){ if(!validateName($_POST['name']))
$name
= "error";
1; } ?>
9.
<div class="wrapper">
10.
<div class="section">
11.
<h1>Formulario de Registro</h1>
if($name != "error")
$status =
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
<!--
27.
28.
-->
29.
Y el error es:</h1>
30.
</div>
31.
32.
33.
</div>
34.
Una vez sabemos la metodologa que estamos siguiendo para validar los datos, es muy sencillo ir
aadiendo campos a las validaciones. Lo nico que tenemos que tener en cuenta es lo siguiente
para cada campo:
1.
$password1 = ;
2.
$password2 = ;
Una vez inicializadas las variables pasamos a crear las funciones que pondremos despues de la
funcin validateName:
PLAINTEXT
PHP:
1.
function validatePassword1($password1){
2.
3.
4.
return false;
5.
6.
7.
return false;
8.
9.
else
10.
return true;
11.
12.
13.
14.
//NO coinciden
15.
if($password1 != $password2)
16.
return false;
17.
else
18.
return true;
19.
Ahora faltara hacer las llamadas a estas funciones (colocamos debajo de la validacin del
nombre de la siguiente manera:
PLAINTEXT
PHP:
1.
if(isset($_POST['send'])){
2.
if(!validateName($_POST['name']))
3.
$name = "error";
4.
5.
if(!validatePassword1($_POST['password1']))
6.
$password1 = "error";
7.
if(!validatePassword2($_POST['password1'], $_POST['password2']))
8.
$password2 = "error";
9.
10.
11.
$status = 1;
12.
Como vis a parte de hacer las llamadas a las nuevas funciones, hemos aadido en la condicin
de "validacin si hay error" las variables de las nuevas validaciones sobre los passwords ya
que status slo cambiar a 1 cuando la validacin de todos los campos sea correcta:
PLAINTEXT
PHP:
1.
Ya tenemos la parte PHP, pero claro, como antes pasaba con el nombre, falta informar al usuario
sobre la validacin y esto se logra poniendo una condicin en la etiqueta label.
Recordad: Texto en Verde si es correcto, Texto en Rojo si no es correcto.
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
1.
$existusername = "";
Una vez inicializada la variable pasamos a crear las funcin que pondremos despus de la funcin
validatePassword2:
PLAINTEXT
PHP:
1.
2.
function validateExistUsername($username){
/*Los datos de estas variables dependen de cmo tengas configurado tu
servidor web, en mi caso y en local, lo tengo de la siguiente manera, por favor,
modificalo con tus datos*/
3.
$servidor = "localhost";
4.
$usuario = "root";
5.
$password = "";
6.
$sdb = "prueba1";
7.
8.
$ilink=mysql_connect($servidor,$usuario,$password) or die(mysql_error());
9.
10.
mysql_select_db($sdb,$ilink);
11.
12.
13.
if (mysql_num_rows($resultado)>0)
14.
return false;
15.
else
16.
return true;
17.
}
NOTA: Importante acordarse de cambiar los valores de las variablesservidor, usuario, password y sbd a lo
que vosotros tengais configurado en vuestro servidor web y de base datos.
Ahora faltara hacer las llamadas a esta funcin (colocamos debajo de la validacin del password2
de la siguiente manera:
PLAINTEXT
PHP:
1.
if(isset($_POST['send'])){
2.
if(!validateName($_POST['name']))
3.
$name = "error";
4.
if(!validatePassword1($_POST['password1']))
5.
$password1 = "error";
6.
if(!validatePassword2($_POST['password1'], $_POST['password2']))
7.
$password2 = "error";
8.
if(!validateExistUsername($_POST['username']))
9.
$existusername = "error";
10.
11.
12.
13.
if($existusername == "error"){
14.
$existeU = 1;
15.
16.
17.
18.
el formulario es correcto*/
19.
20.
$status = 1;
21.
22.
23.
Como vis a parte de hacer la llamada a la nueva funcin, hemos aadido en la condicin de
"validacin si hay error" la variable de la nueva validacin sobre si existe el usuario en la base de
datos (variable existusername distinto de "error"), ya que el status slo cambiar a 1 cuando la
validacin de todos los campos sea correcta.
Prubalo a ver que tal funciona:
Te has dado cuenta que falta algo verdad?. Pues tienes razn, ahora falta la parte en la que
informamos al usuario en caso de que haya algn error (como puedes ver en la imagen superior).
Por tanto nos faltara poner en el cdigo, en concreto en la parte label del campo Username, lo
siguiente:
PLAINTEXT
HTML:
1.
2.
3.
4.
5.
if ($existusername == "error"):
6.
7.
endif; ?>
8.
</span></label>
Registros de usuarios en Php y Mysql con validacin de campos y activacin por mail 5/6
Lo primero que tenemos que saber es cmo se inserta un registro con MySQL?. Esta pregunta la
podemos aclarar con el siguiente esquema:
PLAINTEXT
MySQL:
1.
--Caso 1
2.
3.
VALUES(valor1,valor2,valor3);
4.
--Caso 2
5.
Como podis ver, en principio, hay dos maneras de hacerlo, una en la que informamos todos los
campos que vamos a insertar (puede que nos lleve a menos confusiones) y otra en la que solo
informamos los valores. Nosotros vamos a usar el primer caso.
Nombretabla: Pondremos la tabla en la que vayamos a insertar el registro. En el caso de este
tutorial, utilizamos la tabla users_temp.
Values: Lo que va en el parntesis de los valores o VALUES depende de los campos que tengamos
en nuestra tabla. Si tenemos 3 campos, pondremos 3 valores, si tenemos 5 campos, pondremos 5
valores.
En el caso de nuestra tabla users_temp, tenemos los campos (id_usersTemp, nombre, usersTemp,
password, email, fecAlta). Por lo tanto todos estos campos los tenemos que tener en cuenta a la
hora de dar de alta con la sentencia INSERT, aunque bien es cierto, que el campoid_usersTemp se
puede descartar de la sentencia puesto que lo declaramos "Autonumeric", y nos incluir un
nmero en el campo que insertemos (suma automticamente 1 al ltimo nmero introducido).
Bien, ahora ya sabemos como insertar un registro en nuestra base de datos con MySQL, pero le
toca el turno a conectar nuestro archivo PHP con la base de datos.
Para hacer esta conexin tendremos que abrir de nuevo el archivo"formulario.php" y aadir una
funcin que se llamar insertarReg. Vamos a ver el cdigo y despus lo paso a explicar:
PLAINTEXT
PHP:
1.
2.
3.
4.
5.
$servidor = "localhost";
6.
$usuario = "root";
7.
$password = "";
8.
$sdb = "prueba1";
9.
10.
$ilink3=mysql_connect($servidor,$usuario,
$password) or die(mysql_error());
11.
mysql_select_db($sdb,$ilink3);
12.
13.
14.
15.
16.
if (!$resultado3)
17.
return false;
18.
else{
19.
return true;
20.
21.
22.
}
}
Lo que primero podemos ver es que la funcin recoge una serie de parmetros: name_,
username_, password1_, email_ . Estos parmetros son exactamente los que se van a introducir
en la tabla users_temp.
Ya dentro de la funcin vemos como declaramos unas variables, estos son los datos de acceso a
nuestra base de datos: servidor, usuario, password y base de datos a la que nos conectamos.
PLAINTEXT
PHP:
1.
$servidor = "localhost";
2.
$usuario = "root";
3.
$password = "";
4.
$sdb = "prueba1";
En vuestro caso, lo tendris que modificar con los datos de acceso que hayis configurado.
Lo siguiente que vemos es la conexin con la base de datos, de la siguiente forma:
PLAINTEXT
PHP:
1.
$ilink3=mysql_connect($servidor,$usuario,$password) or die(mysql_error());
2.
mysql_select_db($sdb,$ilink3);
Con esta lnea ya hemos hecho la conexin entre PHP y MySql, ahora la funcin se va a encargar
de ejecutar una sentencia (INSERT), que en nuestro caso se trata de insertar un registro, tal y
como hemos visto al principio del tutorial.
Para hacerlo un poco ms estructurado y limpio, guardamos la sentenciaINSERT dentro de una
variable.
PLAINTEXT
PHP:
1.
2.
En estas lenas de cdigo lo nico que tengo que destacar es que en la parte VALUES de la
sentencia, hemos puesto los valores que nos pasan en la funcin y que no hace falta poner en
dicha sentencia el campoid_usersTemp ya que como hemos comentado anteriormente, es
autonumrico.
Para comprobar si se ha dado de alta un nuevo usuario correctamente, lo nico que tendremos
que hacer es validar la variable resultado3, como podemos ver en el siguiente cdigo:
PLAINTEXT
PHP:
1.
if (!$resultado3)
2.
return false;
3.
else
4.
return true;
Ya tenemos la funcin creada, ahora Qu falta?. Pues es sencillo, lo nico que falta es hacer la
llamada a esa funcin pasndole los parmetros nombre, usuario, password e email que
previamente hemos validado (Ver tutorial Registro de usuarios en PHP y mySQL con validacin y
activacin por mail).
Esta llamada a la funcin insertarReg la tendremos que posicionar justo despus de que la
validacin de los datos introducidos por el usuario hayan sido satisfactorias.
Os voy a mostrar el cdigo resumido para que veais mejor donde habra que colocar la funcin:
PLAINTEXT
HTML:
1.
<body>
2.
<div class="wrapper">
3.
<div class="section">
4.
5.
6.
7.
8.
-->
9.
10.
11.
12.
13.
14.
.
-->
<?php endif; ?>
15.
</div>
16.
</div>
17.
</body>
Recordar que la variable status es la que controla si los datos se han validado correctamente,
estando vaca en caso de que haya algn error, y siendo valor 1 en caso de que no haya errores..
As que donde tendramos que poner la llamada a la funcin est bastante clara como
seguramente habis pensado. Por lo tanto el cdigo resumido quedara de la siguiente manera:
PLAINTEXT
HTML:
1.
<body>
2.
<div class="wrapper">
3.
<div class="section">
4.
5.
6.
7.
8.
-->
9.
10.
<?php
11.
12.
13.
14.
15.
16.
17.
</div>
</div>
</body>
Llegados a este punto, aqu tenis el cdigo con todo lo que llevamos hasta ahora:
Cdigo Fuente 1
Si vamos al navegador y ponemos la URL donde se encuentraformulario.php, en mi caso sera,
"http://localhost/PRUEBA1/formulario.php" nos aparecer el formulario que rellenaremos con
datos vlidos.
Una vez todo correcto si le damos a "Enviar Formulario" y hemos puesto todos los datos sin
errores de validacin, veris que hay algo que no cuadra y es que aunque los datos se hayan
introducido correctamente (lo puedes comprobar en phpMyAdmin accediendo a nuestra
tabla users_Tempde la base de datos PRUEBA1) el usuario no tiene ni idea de lo que ha pasado, es
decir, tanto si ha ido bien como si ha ido mal, ahora mismo tal y como esta el cdigo no obtiene
informacin del estado de su peticin.
Asi que vamos a modificar un poco el cdigo para solucionar esto. Lo primero que tenemos que
tener claro es que las funciones pueden devolver valores, y como bien hemos codificado ya en
ella, hemos puesto 2 returns (true y false).
Estos valores que devuelve la funcin nos servirn para verificar si se ha insertado el registro en
la base de datos o no. Si es true, significa que se ha insertado y si es false ha habido algn
problema. As que jugaremos con este valor aadiendo una condicin en la llamada a insertarReg.
El cdigo quedara de la siguiente manera:
PLAINTEXT
PHP:
1.
<?php
2.
3.
4.
5.
6.
7.
else: ?>
<?php if ($respuesta == 1) ?>
Registros de usuarios en Php y Mysql con validacin de campos y activacin por mail 6/8
Este es la parte 6 de 8 del tutorial sobre "Registros de usuarios en Php y Mysql con validacin
de campos y activacin 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 cmo activar usuarios en PHP por email, dividindolo en
varias partes:
Campo txt_activ
Ya vimos como crear la tabla users_temp donde se guardaran todos los usuarios registrados
mediante formulario.php pero que an no habanactivado 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 llamadotxt_activ el cual tendr
informado un cdigo o clave de 20 posiciones (en principio, ya que despus podremos
parametrizarlo en la llamada a la funcin).
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 aadir campos, donde aadiremos el nuestro justo
debajo del campofecAlta. Lo veris mejor con la siguiente imagen:
1.
Funcin generar_txtAct
Una vez tenemos creado el campo txt_activ vamos a crear la funcin para que nos devuelva un
campo de 20 caracteres aleatorios.
PLAINTEXT
PHP:
1.
function generar_txtAct($longitud,$especiales){
2.
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.
9.
$semilla[] = array('B','C','D','F','G','H','J','K','L','M','N','P','Q','R',
'S','T','V','W','X','Y','Z');
$semilla[] = array('0','1','2','3','4','5','6','7','8','9');
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
$posicion = mt_rand(0,count($semilla[$valor])-1);
21.
22.
$clave .= $semilla[$valor][$posicion];
23.
24.
// devolvemos la clave
25.
return $clave;
26.
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 parmetro indicaremos si queremos que en la clave aparezcan caracteres
especiales o no. True (si aparecen caracteres especiales) y False (no aparecen).
Dentro de la funcin hemos definido los caracteres permitidos con un array llamado semilla. Este
array lo podemos modificar a nuestro gusto segn los caracteres que queramos permitir.
Para llamar a la funcin que nos cree una "clave" de 20 posiciones y sin caracteres especiales,
bastar con esta lnea:
PLAINTEXT
PHP:
1.
$clave = generar_txtAct(20,false);
1.
2.
3.
4.
//MODIF 1
5.
$clave = generar_txtAct(20,false);
6.
7.
8.
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.
18.
19.
//MODIF 2
$inserta= "insert into users_temp
(nombre,usersTemp,password,email,fecAlta,txt_Activ) values
('$name_','$username_','$password1_','$email_',CURDATE(),'$clave')";
$resultado3=mysql_query($inserta,$ilink3) or die (mysql_error());
20.
21.
if (!$resultado3)
22.
return false;
23.
else
24.
return true;
25.
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 mtodo GET.
Nota: SI no sabis como utilizar los mtodos GET y POST en PHP, os aconsejo este manual.
Volviendo a la funcin mailActivacion para enviar el mail donde el usuario podr activar su
cuenta, vamos a escribir su cdigo:
PLAINTEXT
PHP:
1.
2.
3.
$destinatario = $dir_correo;
4.
5.
$cuerpo = '
6.
7.
8.
<h1>Hola';
9.
$cuerpo .= $usuario;
10.
$cuerpo .= '</h1>
11.
12.
13.
$cuerpo .= $url;
14.
$cuerpo .= '</p>
15.
';
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
mail($destinatario,$asunto,$cuerpo,$headers);
34.
35.
Como veis en el cdigo, en primera instancia vemos que la funcin recoge por
parmetros dir_correo y usuario ya que sern utilizadas para la composicin del texto del mail y
para saber a quien hay que enviarle dicho email.
Otra parte del cdigo y en la que nos centraremos ahora es la variableurl. Esta variable es la que
tiene ms 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 funcin generar_txtAct) y el archivo que recoger esa
informacin para comenzar el proceso de alta en la tabla usuarios. En este caso el archivo ser
"activar.php", por tanto en el cdigo de nuestra aplicacin, una vez tenemos la clave, deberemos
informar una variable con la URL y esto lo conseguimos volviendo a modificar la
funcin insertarReg del archivo funciones.php de la siguiente manera (la modificacin la sealo
con el comentario //MODIF NUMERO)
PLAINTEXT
PHP:
1.
2.
3.
4.
//MODIF 1
5.
6.
global $url;
7.
8.
9.
10.
//Le pasamos como parmetro los caracteres que queremos generar y si los
queremos especiales o no
$clave = generar_txtAct(20,false);
11.
//MODIF 2
12.
13.
14.
15.
16.
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.
26.
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
"aplicacin", ya que por norma, las variables que usamos en las funciones no tienen ningn valor
fuera de ellas.
Modif2: Construimos la URL que enviaremos por mail y que utilizaremos en la
funcin mailActivacion.
Os muestro dos imgenes con la recepcin del mail (prueba de usuario JOSELE) y el contenido de
este:
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.
Registros de usuarios en Php y Mysql con validacin de campos y activacin por mail 7/8
En esta pgina activar.php haremos todo el proceso, as que, vamos manos al a obra!!.
Como vis, estamos creando un enlace para que la pgina activar.phprecoja los valores con
el mtodo GET. Podramos enviar tantos parmetros como nos hiciera falta, pero en este caso
solo nos interesa la clave que aadimos en la tabla users_temp llamada txt_Activ.
En el caso que nos hicieran falta ms parmetros, bastara con aadir ms variables al enlace. Por
ejemplo, en el caso de que quisiramos pasar adems de la clave, el usuario, podramos hacerlo
de la siguiente manera:
activar.php?id=textoaleatorio&usuario=nombredeusuario
1.
$clave = $_GET[id];
Con el mtodo GET y recuperando el ID que hemos pasado por URL, nos guardamos el valor en
una variable, que utilizaremos en este archivo, llamada clave.
1.
/*Conectamos con la base de datos. Acuerdate de cambiar los valores por tus
datos de acceso*/
2.
$servidor = "localhost";
3.
$usuario = "root";
4.
$password = "";
5.
$sdb = "prueba1";
6.
7.
$ienlace=mysql_connect($servidor,$usuario,$password) or die(mysql_error());
8.
mysql_select_db($sdb,$ienlace);
9.
10.
11.
12.
13.
14.
Con esto comprobamos si existe el ID en la tabla users_temp. En caso de que el ID exista, vamos
a guardarnos los datos del registro que hemos seleccionado para poder dar de alta esos mismos
datos en la tabla definitiva USUARIO.
El cdigo despus de hacer el select quedara de la siguiente manera:
PLAINTEXT
PHP:
1.
2.
3.
$nombre = $registro['nombre'];
4.
$username = $registro['users_Temp'];
5.
$password = $registro['password'];
6.
$email = $registro['email'];
7.
8.
9.
10.
mysql_free_result($resultado);
11.
12.
mysql_close($resultado);
Ya hemos recuperado los datos del usuario que tenamos en la tablausers_temp con los que se dio
de alta en el formulario, ahora los vamos a utilizar para volcarlos en la tabla final USUARIOS.
1.
2.
3.
4.
5.
$usuario = "root";
6.
$password = "";
7.
$sdb = "prueba1";
8.
9.
//Conectamos
10.
$ilink4=mysql_connect($servidor,$usuario,$password) or die(mysql_error());
11.
12.
mysql_select_db($sdb,$ilink4);
13.
14.
15.
16.
17.
18.
19.
if (!$resultado4)
20.
return false;
21.
else
22.
return true;
23.
La funcin al igual que la que vimos en el anterior tutorial, nos devuelve true si todo ha ido bien
y false si ha habido algn error.
Ahora nos queda llamar a esta funcin pasndole los parmetros que espera, que son ni ms ni
menos que los que hemos recuperado al comprobar si el usuario existe en la tabla users_temp.
Despus de cerrar la conexin con la base de datos en la consulta anterior, incluiremos este
cdigo:
PLAINTEXT
PHP:
1.
/*LLamamos a la funcin*/
2.
3.
echo "
4.
5.
";
6.
7.
else
8.
echo "
9.
10.
";
Como veis, en este trozo de cdigo, en una sola lnea hacemos la llamada a la funcin y la
comprobacin de si ha devuelto true o false, y en cualquiera de los casos, informamos al usuario
de cmo ha ido el proceso.
1.
2.
echo "
3.
4.
";
5.
6.
//envioMail_regis();
7.
8.
else
9.
echo "
10.
11.
";
La funcin envioMail_regis como veis est comentada. Esto es porque quiero dejaros a vosotros
esta tarea, que despus de haber seguido eltutorial completo, seguro sabris hacer.
Con esto, hemos terminado por completo la aplicacin de "Registros de usuarios en Php y Mysql
con validacin de campos y activacin por mail".
Ahora slo quedar una parte 8 en la que explicar algunas posibles mejoras en esta pequea
aplicacin en PHP que vosotros mismos podrais aadir.
Aquellos que quieran tener todos los archivos de este completo tutorial, por favor, poneros
en contacto conmigo a travs del formulario de contacto del blog.
Registros de usuarios en Php y Mysql con validacin de campos y activacin por mail 8/8
Despus de estas siete partes del tutorial ya podemos hacer un registro de usuarios completo,
pero est claro que lo podemos mejorar y eso me gustara que vosotros mismos lo realizarais.
Os voy a dar una serie de consejos que podriamos aplicarle a esta pequea aplicacin:
Encriptar contraseas con MD5: A la hora de dar de alta contraseas en la base de datos, es
conveniente utilizar este tipo de encriptaciones del lado de PHP, aunque tambin existen otro tipo de
encriptaciones como es el caso de ENCODE. SHA1, etc ..
(http://dev.mysql.com/doc/refman/5.0/es/encryption-functions.html).
Comprobar que la clave utilizada para el campo txt_Activ de la tablausers_temp no exista ya.
Incluir la conexin a la base de datos dentro de una funcin que podriamos llamar conexin() para
as no redundar en el cdigo.
Pasar por GET, adems del ID, el mail del usuario y despus comprobar que el ID y el mail existen
en la base de datos users_temp. As nos aseguramos que ha hecho clic en el enlace el mail del usuario en
cuestin.
Crear una sola funcin llamada insertarRegiAct en la que adems de todos los campos que se pasan
hasta ahora, incluir uno ms para informar la tabla, por ejemplo $tabla. Esto solucionar la redundancia de
cdigo en el archivo funciones.php y activar.php.
Programacin Orientada a Objetos: Php soporta clases desde versiones anteriores y es una buena
manera de programar, puede ser interesante para aquellos que aun no controlan este tema, intentar realizar
esta misma aplicacin Orientada a Objetos.
Con estas mejoras tendriamos una aplicacin algo ms completa y ms segura. Ahora ya queda en
vuestras manos hacerlo o no.
Debido a la demanda de los archivos con el cdigo, os los dejo para que podis descargarlo en el
siguiente enlace:
Espero que este tutorial os haya gustado, y ya sabis que para cualquier duda, podis contactar
conmigo.
NOTA 2: A dia 19 de Abril del 2011, se ha modificado el cdigo, y actualizado en la descarga.
Por favor, vuelvan a descargarlo de nuevo los que tengis la versin anterior. Disculpen las
molestias
NOTA 1: En esta pequea aplicacin utilizamos el envo de correo electrnico para activar el
usuario haciendo uso de la funcin mail(). Esta funcin no puede ser usada en condiciones
normales en nuestro servidor local, as que os aconsejo que os leais este pequeo tutorial
de Cmo enviar mail desde localhost sin servidor smtp local?