Vous êtes sur la page 1sur 50

Registros de usuarios en Php y Mysql con validacin de campos y activacin por mail 1/6

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

Instalar Appserv o Wamp


Hoy seguimos con el tutorial Registros de usuario en PHP y Mysql con validacin de campos y
activacin por mail explicando los pasos para tener en nuestro ordenador un sistema (Servidor
Web, Mysql, PHP) con el cual podremos probar nuestras aplicaciones con pginas dinmicas y
accesos a bases de datos Mysql.

Lo primero que tenemos que tener es un entorno de desarrollo en nuestro PC con Servidor Web
en forma local que incluya:

Servidor Web: Apache

Gestor de Base de datos: Mysql

Php

Editor de Texto o Web (Aconsejo UltraEdit o NotePad ++)

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:

Cmo instalar Appserv en nuestro ordenaror?

Cmo instalar Wamp en nuestro ordenaror?

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]

Que hemos aprendido en este captulo?


Si todo ha ido bien y no tenis dudas (lo que las tengis dejarme un comentario), ahora mismo
hemos aprendido a poner nuestro ordenador a punto para empezar a crear nuestra pequea
aplicacin en PHP y Mysql.
Por tanto, en nuestro ordenador tendremos instalado Php, Mysql y Apache.
En el prximo capitulo crearemos la base de datos con las tablas USUARIOS y USERS_TEMP para
dar de alta a los usuarios en nuestra aplicacin.

Registros de usuarios en Php y Mysql con validacin de campos y activacin por mail 3/6

Crear la base de datos


La base de datos para el registro de usuarios se puede hacer (entre otras) de dos maneras:
1.

Una sola tabla llamada USUARIOS con campo de activacin

2.

Dos tablas llamadas USUARIOS y USERS_TEMP

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).

Crear base de datos PRUEBA1


En vuestro caso lo podeis llamar como queris, eso si, el cdigo que voy escribiendo siempre
estar enfocado para la base de datos PRUEBA1, tenedlo en cuenta.

Creamos tabla USUARIOS


En esta tabla daremos de alta a los usuarios finales que ya han activado su cuenta a travs del
enlace enviado por e-mail.

La tabla USUARIOS se compone de los siguientes campos:


id_usuario: Este campo es numrico y se autoincrementar cada vez que se inserte un registro en
la tabla. Con esto tendremos un identificador nico en cada Registro. Es un tipo campo que
recomiendo utilicis en todas las tablas.
usuario: Campo que definimos como nico para que no puedan registrarse usuarios con el mismo
nombre.
password: En este campo podramos hacer varias cosas como definirlo con una longitud de 32
para as poder guardar en la base de datos la contrasea encriptada con la funcin MD5 lo cual
recomiendo, pero esto lo intentaremos tratar mas adelante en prximos tutoriales anexos a este.
Mientras tanto puedes echarle un vistazo al siguiente enlace sobreEncriptacin en MySQL o a este
otro sobre MD5 en PHP para que te hagas una idea, aunque cuando llegue el momento lo haremos
desde PHP.
email: Este campo tambin lo definimos como nico para que un mismo usuario no se registre
mas veces con el mismo e-mail.
fecAlta: Fecha en la que el usuario se dio de alta.

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.

CREATE TABLE `usuarios` (

2.

`id_usuario` SMALLINT(4) NOT NULL AUTO_INCREMENT COMMENT 'Campo clave de


la tabla USUARIOS autoincrementable',

3.

`usuario` VARCHAR(50) NOT NULL COMMENT 'Usuario nico. No puede haber dos
usuarios iguales',

4.
5.

`password` VARCHAR(50) NOT NULL,


`email` VARCHAR(100) NOT NULL COMMENT 'E-mail nico. No puede haber dos
usuarios con el mimo e-mail',

6.

`nombre` VARCHAR(150) NOT NULL,

7.

`fecAlta` DATE NOT NULL COMMENT 'Fecha de alta en la tabla',

8.

PRIMARY KEY

9.

UNIQUE KEY `usuario` (`usuario`,`email`)

10.

(`id_usuario`),

) ENGINE=INNODB DEFAULT CHARSET=utf8 COMMENT='Tabla de Usuarios


finales' AUTO_INCREMENT=4 ;

Creamos la tabla USERS_TEMP


En esta tabla daremos de alta a los usuarios que aun no hayan activado su cuenta, donde
permanecern un lmite de tiempo (que definiremos nosotros), en caso de no ser activada en este
tiempo (es decir, que no hayan hecho clic en el enlace enviado por correo) sern borrados de la
tabla USERS_TEMP con lo que no llegaran a pertenecer a la tabla de usuarios final "USUARIOS".

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.

CREATE TABLE `users_temp` (

2.

`id_usersTemp` SMALLINT(4) NOT NULL AUTO_INCREMENT,

3.

`nombre` VARCHAR(40) NOT NULL,

4.

`usersTemp` VARCHAR(50) NOT NULL,

5.

`password` VARCHAR(50) NOT NULL,

6.

`email` VARCHAR(100) NOT NULL,

7.

`fecAlta` DATE NOT NULL,

8.

`txt_Activ` VARCHAR(50) NOT NULL,

9.

PRIMARY KEY

10.

UNIQUE KEY `usuario` (`usersTemp`,`email`)

11.

(`id_usersTemp`),

) ENGINE=INNODB

DEFAULT CHARSET=utf8 AUTO_INCREMENT=12 ;

En esta ocasin no voy a explicar cada campo puesto que lo nico que cambiar es el nombre
(aadiendole un temp al final).

Que hemos aprendido en este captulo?


Ya tenemos la base de datos lista para poder realizar con xito el proceso de registro de usuarios
en PHP con activacin por mail. En este momento podemos trastear con nuestra nueva base de
datos "PRUEBA1".
En el prximo capitulo crearemos el formulario de registro para que el usuario pueda darse de
alta en nuestras bases de datos.

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:

Nombre (class text)

Usuario (class text)

contrasea (class password)

contrasea2 (class password)

E-mail (class text)

Enviar Formulario (class submit)

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.

Nombre: Validamos que tenga como mnimo una longitud de 4 caracteres

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)

Empecemos por la creacin del formulario.


En la mayora de los casos, los desarrolladores suelen crear formularios con tablas o con labels.
Recomiendo utilizar labels en los formularios y controlar su aspecto mediante CSS.
Vamos a ir aadiendo cdigo segn vamos avanzando, para as entenderlo ms fcil asi que
intentar explicar el cdigo paso a paso.
A la pgina del formulario le llamaremos formulario.php
PLAINTEXT
HTML:

1.

<div class="wrapper">

2.

<div class="section">

3.

<h1>Formulario de Registro</h1>

4.

<form id="form1"><label for="name">Nombre</label>

5.
6.

<input class="text" name="name" type="text" tabindex="1" /><label for="us


ername">Nombre de usuario</label>

7.
8.

<input class="text" name="username" type="text" tabindex="2" /><label for


="password1">Contrasea</label>

9.
10.

<input class="text" name="password1" type="password" tabindex="3" /><labe


l for="password2">Repite Contrasea</label>

11.
12.

<input class="text" name="password2" type="password" tabindex="4" /><labe


l for="email">Email </label>

13.
14.
15.

<input class="text" name="email" type="text" tabindex="5" />


<div><input class="submit" name="send" type="submit" value="Enviar
formulario" tabindex="6" /></div>

16.

</form></div>

17.

<!-- Cerramos div section -->

18.
19.

</div>

20.

<!-- Cerramos div wrapper -->

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.

<link rel="stylesheet" href="main.css" type="text/css" media="screen" />

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.

Por ahora el formulario quedara de la siguiente manera:

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.

<form id="form1" action="formulario.php" method="post"></form>

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.

Validar longitud de un campo y carcteres permitidos


Las validaciones las vamos a crear con funciones en PHP. Estas funciones sern declaradas al
principio del archivo, antes de definir la etiquetaHTML.
Vamos a explicar este la validacin de la longitud de un campo y caracteres permitidos con el
campo Nombre, pero nos servir para cualquier otro en el que queramos hacer ese tipo de
validacin.
Nos vamos al archivo formulario.php y ponemos este cdigo justo antes de la linea donde
aparece DOCTYPE:
PLAINTEXT
PHP:

1.

//variables valores por defecto

2.

$name = "";

3.
4.

/*Validamos que el nombre no tenga caracteres extraos

5.

y que su longitud sea mayor que 4*/

6.

function validateName($name){

7.

//NO cumple longitud minima

8.

if(strlen($name) &lt;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; } ?&gt;

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).

La funcin validateName, se encarga de recoger el valor de la variablename que hemos pasado


mediante el mtodo POST por el formulario. Si os fijais, donde hacemos la llamada a la funcin,
le estamos pasando dicho valor (la variable que esta entre parntesis):
PLAINTEXT
PHP:

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:

Si variable status no est vaca


Mostramos el formulario con los errores correspondientes en rojo.

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.

<span style="color: green;"> Mnimo 4 carcteres (permitidos de la A a la


Z)</span>

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.

<!-- Antes teniamos esto:


<label for="name">Nombre <span style="color: green" mce_style="color:
green;"> Mnimo 4 carcteres (permitidos de la A a la Z)</span></label>

3.

-->

4.

<!-- hora ponemos lo siguiente: -->

5.

<label for="name">Nombre Mnimo 4 carcteres (permitidos de la A a la


Z)</label>

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.

//variables valores por defecto

2.

$name = "";

3.
4.

/*Validamos que el nombre no tenga caracteres extraos

5.

y que su longitud sea mayor que 4*/

6.

function validateName($name){

7.

//NO cumple longitud minima

8.

if(strlen($name) &lt;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; } ?&gt;

//Validamos si hay error

9.

<div class="wrapper">

10.

<div class="section">

11.

<h1>Formulario de Registro</h1>

if($name != "error")

$status =

12.

<!-- <label for="name">Nombre <span style="color: green" mce_style="color:


green;"> Mnimo 4 carcteres (permitidos de la A a la Z)</span></label> -->

13.

<label for="name">Nombre Mnimo 4 carcteres (permitidos de la A a la


Z)</label>

14.
15.

<input class="text" name="name" type="text" tabindex="1" /><label for="us


ername">Nombre de usuario</label>

16.
17.

<input class="text" name="username" type="text" tabindex="2" /><label for


="password1">Contrasea</label>

18.
19.

<input class="text" name="password1" type="password" tabindex="3" /><label


for="password2">Repite Contrasea</label>

20.
21.

<input class="text" name="password2" type="password" tabindex="4" /><label


for="email">Email </label>

22.
23.
24.

<input class="text" name="email" type="text" tabindex="5" />


<div><input class="submit" name="send" type="submit" value="Enviar
formulario" tabindex="6" /></div>

25.

<h1>Formulario enviado con xito!</h1>

26.

<!--

27.

<h1>El e-mail pasado es:

28.

-->

29.

Y el error es:</h1>

30.

</div>

31.

<!-- Cerramos div section -->

32.
33.

</div>

34.

<!-- Cerramos div wrapper -->

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:

Validar campos iguales


Para una mayor seguridad y sobre todo para que el usuario no cometa ningn error informando el
password de su cuenta de usuario, una forma muy aconsejable es obligar al visitante (futuro
usuario) a repetir la contrasea para no dar pie a equivocacin.
Lo primero que tenemos que hacer es inicializar la variable que vayamos a usar para los campos
password, al igual que en el campo Nombre, y adems crear la funcin que nos valida:
Asi que, nos vamos de nuevo al "formulario.php" y en la parte superior, lo primero que hacemos
es inicializar la variable password1 y password2:
PLAINTEXT
PHP:

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.

//NO tiene minimo de 5 caracteres o mas de 12 caracteres

3.

if(strlen($password1) &lt;5 || strlen($password1)&gt; 12)

4.

return false;

5.

// SI longitud, NO VALIDO numeros y letras

6.

else if(!preg_match("/^[0-9a-zA-Z]+$/", $password1))

7.

return false;

8.

// SI rellenado, SI email valido

9.

else

10.

return true;

11.

12.
13.

function validatePassword2($password1, $password2){

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.

//Aqu incluimos la validacin de los passwords

5.

if(!validatePassword1($_POST['password1']))

6.

$password1 = "error";

7.

if(!validatePassword2($_POST['password1'], $_POST['password2']))

8.

$password2 = "error";

9.

//Validamos si hay error

10.

If($name != "error" &amp;&amp; $password1 = error


&amp;&amp; $password2 = error)

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.

$password1 != "error" &amp;&amp; $password1 != "error"

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.

En el ejemplo de la imagen que se muestra a continuacin, hemos ingresado la primera


contrasea correctamente (caracteres permitidos y longitud igual o mayor que 5) y la segunda
contrasea distinta a la primera.

Tenemos que cambiar el cdigo de la siguiente manera:


PLAINTEXT
HTML:

1.

<!-- Antes teniamos esto:

2.

<label for="password1">Contrasea</label> -->

3.
4.
5.

<!-- Ahora ponemos esto: -->


<label for="password1">Contrasea Mnimo 5 caracteres, mximo 12
caracteres, Slo letras y nmeros</label>

6.
7.

<input class="text" name="password1" type="password" tabindex="3" /><!-Antes teniamos esto:

8.

<label for="password2">Repite Contrasea</label> -->

9.
10.
11.

<!-- Ahora ponemos esto: -->


<label for="password2">Repetir Contrasea Debe ser igual a la
anterior</label>

12.
13.

<input class="text" name="password2" type="password" tabindex="4" />

Validar si existe usuario en nuestra base de datos


Como es el caso del nombre de usuario, a parte de validar los caracteres introducidos, tenemos
que hacer una consulta a la base de datos para comprobar que no existe, ya que en caso de
existir, no se puede dar de alta.
Esto se consigue tambin utilizando cdigo PHP para acceder a nuestra base de datos (MySQL) y
en concreto a la tabla USERS_TEMP, que es donde en primera instancia se darn de alta los
usuario como ya explicamos en el tema anterior sobre como Crear la base de datos
Para validar si el usuario existe en la tabla USERS_TEMP de nuestra base de datos tenemos que
crear la funcin correspondiente (validateExistUsername):
Al igual que hemos hecho con el campo name y los campos password1 y 2, inicializamos la
variable existUsername:
PLAINTEXT
PHP:

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.

//$ilink = mysql_connect("localhost","root","") or die(mysql_error());

10.

mysql_select_db($sdb,$ilink);

11.

$consulta= "select usersTemp from users_temp where usersTemp =


'$username'";

12.

$resultado=mysql_query($consulta,$ilink) or die (mysql_error());

13.

if (mysql_num_rows($resultado)&gt;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.

//Validamos si hay error


if($name != "error" &amp;&amp; $password1 != "error" &amp;&amp; $password1
!= "error"){

13.

if($existusername == "error"){

14.

$existeU = 1;

15.

16.

/*si no hay ningn error de validacin

17.

y adems el usuario no existe en la base de datos

18.

el formulario es correcto*/

19.

if (!$existeU &amp;&amp; !$existeE){

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.

<!-- Antes teniamos esto:

2.

<label for="username">Nombre de usuario</label> -->

3.
4.

<label for="username">Nombre de usuario <span>

5.

if ($existusername == "error"):

6.

echo "<span style="color: red;">El usuario " . $usernameValue . " ya


existe</span>";

7.

endif; ?&gt;

8.

</span></label>

Hasta ahora hemos aprendido lo siguiente:


El cdigo finalmente completado (a espera de vuestro trabajo) queda de la siguiente manera:
Cdigo Fuente 2
Con esto, y modificando el archivo "formulario.php", podemos hacer las siguientes validaciones
que aun nos faltara por incluir y que os dejo a vuestra merced para que as podis aprender (que
se que a veces somos muy cmodos y acudimos al copia/pega).
Con esto tenis trabajo, pero estoy seguro que con vuestra capacidad y este tutorial podris
lograrlo. Ahhh y recordad que en los comentarios me podis dejar cualquier duda o sugerencia e
intentar resolver en la medida de lo posible.
De todas formas, aquellos que estis interesados en tener el archivo"formulario.php" tan slo
dejarme un comentario en este mismo post y os lo mandar sin ningn problema.
En el siguiente tutorial veremos el tema como insertar usuarios en MySql desde un formulario
PHP.

Registros de usuarios en Php y Mysql con validacin de campos y activacin por mail 5/6

Registrar Usuarios en PHP


En este tema vamos a aprender como insertar usuarios en nuestra base de datos desde
php despus de haber validado los datos introducidos por el usuario en el formulario.

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.

INSERT INTO nombretabla (campo1, campo2, campo3)

3.

VALUES(valor1,valor2,valor3);

4.

--Caso 2

5.

INSERT INTO nombretabla VALUES(valor1,valor2,valor3);

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.

//FUNCION PARA INSERTAR EL REGISTRO EN LA TABLA users_temp

2.

function insertarReg($name_, $username_, $password1_, $email_){

3.

/*Teneis que declarar las variables $servidor, $usuario,$password y

4.

$sdb (base de datos). En mi caso para Localhost tengo lo


siguiente:*/

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.

$inserta= "insert into users_temp


(nombre,usersTemp,password,email,fecAlta) values
('$name_','$username_','$password1_','$email_',CURDATE())";

14.

$resultado3=mysql_query($inserta,$ilink3) or die (mysql_error());

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.

$inserta= "insert into users_temp (nombre,usersTemp,password,email,fecAlta)


values ('$name_','$username_','$password1_','$email_',CURDATE())";

2.

$resultado3=mysql_query($inserta,$ilink3) or die (mysql_error());

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.

<?php if(!isset($status)): ?>

5.
6.

<!--resto de cdigo: Error en validacin


.

7.

8.

-->

9.

<?php else: <?>

10.
11.

<!--resto de cdigo: La validacin ha sido correcta


.

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.

<?php if(!isset($status)): ?>

5.
6.

<!--resto de cdigo: Error en validacin


.

7.

8.

-->

9.

<?php else: <?>

10.

<?php

11.

//INCLUIMOS LA LLAMADA A LA FUNCION

12.

//PARA INSERTAR EL REGISTRO.

13.

insertarReg($nameValue, $usernameValue, $passwordValue,


$emailValue); ?>

14.

<?php endif; ?>

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.

if(insertarReg($nameValue, $usernameValue, $passwordValue, $emailValue)):?>

3.
4.
5.
6.

7.

<h1>Registro introducido correctamente en la base de datos</h1>


<?php

else: ?>
<?php if ($respuesta == 1) ?>

<h1 style="font-color: red">No se ha podido insertar el


registro en nuestra base de datos</h1>
<?php endif; ?>

Hemos incluido en un if la funcin para insertar el Registro en la base de datos. Si la funcin


devuelve true entrar en el IF, por el contrario si devuelve false ir por el else. As que lo que
hemos hecho es, si todo ha ido bien, informar al usuario que el registro se ha introducido
correctamente y si ha ido mal, informar con color rojo que no se ha podido insertar el registro en
la base de datos.

Ahora ya tenemos completo el registro, informando al usuario tanto si se ha realizado


correctamente como si no, como podis ver en la imagen arriba.
El cdigo completo lo tenis en el siguiente enlace:
Cdigo Fuente 2
Qu hemos aprendido?
En este tutorial, hemos aprendido a realizar altas de usuarios en MySql desde PHP gracias a un
formulario.
En el siguiente tutorial que publicaremos en breve, veremos como mandar un mail desde PHP
para activar usuario con el mtodo GET.

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:

Crear un nuevo campo en la tabla users_temp


Crear funcin generar_txtAct que genera una clave la cual se insertar en el nuevo campo
txt_activ.

Incluir campo txt_activ en la funcin 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 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:

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

Si lo queris hacer mediante cdigo, incluiramos en la pestaa SQL la siguiente sentencia:


PLAINTEXT
MySQL:

1.

ALTER TABLE users_temp ADD txt_Activ VARCHAR( 20 ) NOT NULL AFTER


fecAlta ;

La estructura ahora quedara de la siguiente manera:

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.

// 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.

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.

// si puede contener caracteres especiales, aumentamos el array $semilla


if ($especiales) { $semilla[] = array('$','#','%','&amp;','@','-','?','','
!','','+','-','*'); }

13.
14.

// creamos la clave con la longitud indicada

15.

for ($bucle=0; $bucle &lt;$longitud; $bucle++)

16.

17.

// seleccionamos un subarray al azar

18.

$valor = mt_rand(0, count($semilla)-1);

19.

// selecccionamos una posicin al azar dentro del subarray

20.

$posicion = mt_rand(0,count($semilla[$valor])-1);

21.

// cogemos el carcter y lo agregamos a la clave

22.

$clave .= $semilla[$valor][$posicion];

23.

24.

// devolvemos la clave

25.

return $clave;

26.

La funcin, como podis ver, la hemos llamado generar_txtAct y si os fijis, le pasamos 2


parmetros:

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);

Incluir campo txt_activ en la funcin insertarReg


Ahora que ya tenemos la funcin para informar la clave a introducir en la tabla, hay que
modificar la funcin insertarReg para incluir este campo (la modificacin la sealo con el
comentario //MODIF NUMERO). As que la funcin quedara de la siguiente manera:
PLAINTEXT
PHP:

1.

function insertarReg($name_, $username_, $password1_, $email_){

2.
3.

/*Llamar a la funcin para generar el texto aleatorio para Activar Usuario.


Le pasamos como parmetro los caracteres que queremos generar y si los queremos
especiales o no*/

4.

//MODIF 1

5.

$clave = generar_txtAct(20,false);

6.
7.

/*Tenis 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.
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.

Paso a explicar cada una de las lneas que hemos modificado:


Modif1: Hacemos la llamada a la funcin 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 informacin:

Ya tenemos nuestro registro en la tabla users_temp con el nuevo campotxt_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 envo del correo electrnico haremos uso de la funcin mail que trae PHP desde su versin
4.
El envo del e-mail con la URL para activar la cuenta del usuario lo crearemos en una funcin
llamada mailActivacion. Esta funcin se encarga de enviar el correo electrnico al usuario con un
texto y un enlace de este tipo:
PLAINTEXT
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 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.

function mailActivacion($dir_correo, $usuario){

2.
3.

$destinatario = $dir_correo;

4.

$asunto = "COLORATE - Activar Usuario";

5.

$cuerpo = '

6.
7.

COLORATE - Activar usuario

8.

<h1>Hola';

9.

$cuerpo .= $usuario;

10.

$cuerpo .= '</h1>

11.

<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:

12.

<p style="text-align: center;">';

13.

$cuerpo .= $url;

14.

$cuerpo .= '</p>

15.

';

16.
17.

//para el envo en formato HTML

18.

$headers = "MIME-Version: 1.0\r\n";

19.

$headers .= "Content-type: text/html; charset=iso-8859-1\r\n";

20.
21.

//direccin del remitente

22.

$headers .= "From: Admin COLORATE \r\n";

23.
24.

//direccin de respuesta, si queremos que sea distinta que la del remitente

25.

$headers .= "Reply-To: direccion_respuesta@dominio.com \r\n";

26.
27.

//direcciones que recibin copia

28.

//$headers .= "Cc: correocopia@dominio.com\r\n";

29.
30.

//direcciones que recibirn copia oculta

31.

//$headers .= "Bcc: copiaocula1@dominio.com, copiaocula1@dominio.com \r\n";

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.

//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 aplicacin

6.

global $url;

7.

//LLamar a la funcin para generar el texto aleatorio para Activar Usuario.

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.

//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.

26.

$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());

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

Activacin de usuario en PHP y Mysql


Este es la parte 7 de 8 del tutorial sobre "Registros de usuarios en Php y Mysql con validacin
de campos y activacin por mail".
En el captulo anterior vimos como enviar un mail para activar un usuario en PHP, en cual
inclua un enlace del estilo "activar.php?id=textoaleatorio" donde hacer clic para que el
archivo activar.phpiniciara el siguiente proceso:

Recoger la variable pasada por GET.

Comprobar que esa clave existe en la tabla users_temp

Dar de alta en la tabla final USUARIO

Eliminar el registro en la tabla users_temp

Envio de correo electrnico informando del registro definitivo.

En esta pgina activar.php haremos todo el proceso, as que, vamos manos al a obra!!.

Recoger la variable pasada por GET


Al usuario le hemos enviado un mail con un enlace en el que tendr que hacer clic. Dicho enlace
tiene la siguiente estructura:
activar.php?id=textoaleatorio

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

Lo nico que se hace es aadir variables concatenndolas con el carcter&.


Siguiendo con nuestro caso, en el que slo nos hace falta recuperar la clave (es decir, la variable
ID), para lo que tendramos que crear es el archivo activar.php y recoger el valor con la
siguiente lnea:
PLAINTEXT
PHP:

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.

Comprobar que esa clave existe en la tabla users_temp


Por seguridad, vamos a comprobar que el ID pasado por URL (clave) existe en la base de datos,
realizando un acceso a MySQL y filtrando en la sentencia por txt_Activ.
PLAINTEXT
PHP:

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.

//Contruimos la sentencia para la cnsulta

11.

$sql = "select * from users_temp where txt_Activ = '$clave'";

12.
13.

//Comprobamos el resultado de la consulta

14.

$resultado=mysql_query($sql,$ienlace) or die (mysql_error());


Nota: Esto lo podramos completar (dndole ms segururidad), pasando por GET el mail del usuario y
despus comprobar que el ID y el mail existen en la base de datos users_temp.

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.

/*Recorremos los campos del registro que hemos recuperado de la tabla


users_temp*/

2.

while ($registro = mysql_fetch_array($resultado)) {

3.

$nombre = $registro['nombre'];

4.

$username = $registro['users_Temp'];

5.

$password = $registro['password'];

6.

$email = $registro['email'];

7.

} // fin del bucle de ordenes

8.
9.

//Liberamos los registros de la tabla

10.

mysql_free_result($resultado);

11.

//cierra la conexin con la base de datos

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.

Dar de alta en la tabla final USUARIO


Si habis seguido el tutorial completo, os acordaris que utilizamos unafuncin para dar de alta
el usuario en la tabla users_temp, la cual llamamos insertarRegiAct.
Vamos a aprovechar esta funcin para dar de alta el usuario en la nueva tabla USUARIO. As que
definiremos en este archivo otra funcin que llamaremos insertarRegiAct2:
PLAINTEXT
PHP:

1.

//Le pasamos los parmetros: name, username, password1, email.

2.

function insertarRegiAct2($name_, $username_, $password1_, $email_){

3.

4.

/*Teneis que declarar las variables $servidor, $usuario,$password y $sdb


(base de datos). En mi caso para Localhost tengo lo siguiente:*/
$servidor = "localhost";

5.

$usuario = "root";

6.

$password = "";

7.

$sdb = "prueba1";

8.
9.

//Conectamos

10.

$ilink4=mysql_connect($servidor,$usuario,$password) or die(mysql_error());

11.

//Seleccionamos la base de datos

12.

mysql_select_db($sdb,$ilink4);

13.
14.

//Sentencia para inserter el registro

15.

$inserta= "insert into usuarios (nombre,usuario,password,email,fecAlta)


values ('$name_','$username_','$password1_','$email_',CURDATE())";

16.

$resultado4=mysql_query($inserta,$ilink4) or die (mysql_error());

17.
18.

//Comprobamos si el resultado ha ido bien

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.

if(insertarRegiAct2($nombre, $username, $password, $email)){

3.

echo "

4.

<h1>Tu cuenta ha sido activada correctamente</h1>

5.

";

6.

7.

else

8.

echo "

9.

<h1 style="color: red;">Tu cuenta NO ha sido activada correctamente.</h1>

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.

Eliminar el registro en la tabla users_temp


Una vez el usuario se da de alta en la tabla definitiva USUARIOS, podramos crear un script para
eliminarlo de la tabla users_temp, pero como crearemos un proceso en el que pasados 4 das del
alta de un usuario se eliminar automticamente (esto lo hacemos seleccionando todos los
registros de la tabla users_temp cuya fecha actual menos fecha de alta (fecAlta) sea mayor a 3
das.

Envo de correo para activar usuario en PHP


Si todo ha ido correctamente y tenemos nuestro usuario dado de alta en la tabla USUARIOS, tan
slo nos queda mandarle un mail dando la bienvenida.
Esto lo podemos incluir la llamada a la funcin insertarRegAct2 de la siguiente manera:
PLAINTEXT
PHP:

1.

if(insertarRegiAct2($nombre, $username, $password, $email)){

2.

echo "

3.

<h1>Tu cuenta ha sido activada correctamente</h1>

4.

";

5.

//ENVIAR MAIL DE QUE LA CUENTA HA SIDO ACTIVADA

6.

//envioMail_regis();

7.

8.

else

9.

echo "

10.

<h1 style="color: red;">Tu cuenta NO ha sido activada correctamente</h1>

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 las funciones en un archivo externo.

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?

Vous aimerez peut-être aussi