Está en la página 1de 8

Hola a todos, hace poco hice un sistema de usuarios y lo publiqu en un foro que modero y ahora

vengo y lo comparto tambin por ac, por si a alguien le sirve, no usa sesiones sino que utiliza
cookies.

El primer paso es crear una tabla en la base de datos en la que almacenaremos los usuarios que
se registren. Vayan a su phpmyadmin y creen una base de datos llamada "tutorial" (puede llamarse
de otra forma) y ejecuten esta consulta dentro de la pestaa SQL:

http://tny.cz/2a8b8025

CREATE TABLE IF NOT EXISTS `usuarios` (


`id` int(11) NOT NULL AUTO_INCREMENT,
`nick` varchar(16) COLLATE utf8_unicode_ci NOT NULL,
`password` varchar(35) COLLATE utf8_unicode_ci NOT NULL,
`email` varchar(100) COLLATE utf8_unicode_ci NOT NULL,
`telefono` varchar(100) COLLATE utf8_unicode_ci NOT NULL,
`ip` varchar(16) COLLATE utf8_unicode_ci NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci
AUTO_INCREMENT=1 ;

Una vez creada, procederemos a hacer el archivo de configuracin en el que pondremos nuestros
datos del host. Creen un archivo llamado config.php y pongan lo siguiente:

http://tny.cz/3434d1c9

?php
//Hecho por DjAlan98 para PHPost.net
error_reporting(E_ALL & ~E_NOTICE);
$server = 'localhost';
$password = '';
$usuario = 'root';
$database = 'tutorial';
$con = mysql_connect($server, $usuario, $password);
mysql_select_db($database, $con);
if(!$con){ die('Comprueba tus datos de conexin'); }
include('sesion.php');
?>

Les explicar un poco lo de arriba, lo de error_reporting es til si estamos en localhost para que no
muestre Notices que sinceramente no sirven de mucho. Dentro de la variable $server coloquen el
servidor de su host (casi siempre es localhost), en password coloquen la contrasea de su db, en
usuario coloquen el usuario de su db y en $database coloquen el nombre de su base de datos.
Todo lo dems no lo toquen. Guarden el archivo
2) Crear un archivo llamado sesion.php y colocar lo siguiente:
http://tny.cz/a00e6602

<?php
//Hecho por DjAlan98 para PHPost.net
$separar = explode('#', $_COOKIE['sesion']);
if($_COOKIE['sesion'] && mysql_num_rows($query = mysql_query('SELECT *
FROM `usuarios` WHERE `id` = \''.(int)$separar[0].'\' && `password`
= \''.mysql_real_escape_string($separar[1]).'\''))){
$user = mysql_fetch_assoc($query);
$currentip = $_SERVER['REMOTE_ADDR'] ? $_SERVER['REMOTE_ADDR'] :
$_SERVER['X_FORWARDER_FOR'];
mysql_query('UPDATE `usuarios` SET `ip`
= \''.mysql_real_escape_string($currentip).'\' WHERE `id` = \''.
$user['id'].'\'');
}else{
unset($_COOKIE['sesion']);
}
?>

La variable separar usa explode para separar el contenido de la cookie llamada sesion, en el que
se divide id#contrasea, en la segunda lnea comprobamos que la cookie y el usuario del contenido
de la cookie tambin, en la tercera asociamos toda la informacin de la consulta de la segunda
lnea para obtener los datos del usuario que est logueado, en la 4 linea evitamos spoofing en la ip
del visitante y en la 5 actualizamos los datos del usuario poniendo la ip actual dentro de la tabla ip,
en la ltima linea, en caso de no existir una cookie o que los datos sean incorrectos, eliminamos la
cookie.

3) Crear un archivo llamado login.php y colocar lo siguiente:

http://tny.cz/3fc6aba8

<?php
//Hecho por DjAlan98 para PHPost.net
//Diseo del formulario por NESTicle 8bit
include('config.php');
?>
<!DOCTYPE html>
<html lang="es"><head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Formulario de Registro</title>
<link href="images/estilos.css" type="text/css" rel="stylesheet" />
</head>

<body id="login-page">
<div class="login-wrap">
<div class="mensaje">
<h2>Bienvenido al registro</h2>
</div>
<form id="form-logeo" class="generic" method="post">
<div id="login-user" class="field">
<label>Nombre de Usuario (Nick)</label>
<input id="login-username" type="text" class="text" name="username"
placeholder="Nombre de Usuario" tabindex="1" maxlength="200">
</div>

<div id="login-pass" class="field">


<label>Contrasea</label>
<input id="login-password" type="password" class="text" name="password"
placeholder="Contrasea" tabindex="3" maxlength="32">
</div>

<div id="login-user" class="field">


<label>EMail</label>
<input id="login-username" type="text" class="text" name="email"
placeholder="EMail" tabindex="1" maxlength="200">
</div>

<div id="login-user" class="field">


<label>Telfono</label>
<input id="login-username" type="text" class="text" name="telefono"
placeholder="Telfono" tabindex="1" maxlength="200">
</div>

<div class="btnlogeo">
<input id="login-submit" type="submit" value="Listo!">
</div>
<?php
if($_POST){
if(!$_POST['username'] || !$_POST['password'] || !$_POST['email'] || !
$_POST['telefono']) { die('<span style="color:red;">Por favor, compruebe
que haya ingresado TODOS los datos</span>'); }
if(!preg_match('/^[a-z0-9\_\-]{4,16}$/i', $_POST['username'])) {
die('<span style="color:red;">El nick contiene carcteres incorrectos o
es menor a 4 carcteres o mayor a 16</span>'); }
if(strlen($_POST['password']) < 4 || strlen($_POST['password']) > 35) {
die('<span style="color:red;">La contrasea debe tener entre 4 y 35
carcteres</span>'); }
if(!filter_var($_POST['email'], FILTER_VALIDATE_EMAIL)) { die('<span
style="color:red;">EMail incorrecto</span>'); }
if(!ctype_digit($_POST['telefono']) || strlen($_POST['telefono']) < 5 ||
strlen($_POST['telefono']) > 100) { die('<span
style="color:red;">Realmente existen telfonos que lleven letras?
increble!. Ah, y el mximo es 100 carcteres y el mnimo de 5</span>');
}
if(mysql_num_rows(mysql_query('SELECT id FROM usuarios WHERE nick
= \''.mysql_real_escape_string($_POST['username']).'\' LIMIT 1'))) {
die('<span style="color:red;">El usuario ya existe.</span>'); }
mysql_query('INSERT INTO `usuarios` (nick, password, email, telefono)
VALUES
(\''.htmlspecialchars($_POST['username']).'\', \''.htmlspecialchars(md5($
_POST['password'])).'\', \''.htmlspecialchars($_POST['email']).'\', \''.
(int)$_POST['telefono'].'\')');
die('<span style="color:green;">Registrado correctamente</span> <a
href="login.php">Loguearme</a>');
}
?>
</form>
</div>
</body></html>

Con if($_POST) comprobamos que se hayan envado datos via post, con las otras 2 lneas
comprobamos que se haya ingresado algo en usuario y contrasea. En la 4 lnea hacemos una
consulta para comprobar que el usuario con el nick ingresado exista y si existe, obtener los datos
del mismo. El setcookie(); sirve para insertar la cookie de sesin en la PC del usuario, en la
penltima lnea actualizamos la IP del visitante guardada en la base de datos, y en la ltima lnea
redireccionamos al usuario al index de la web en caso de que los datos estn todos correctos.

4) Crear un archivo llamado registro.php y colocar lo siguiente:

http://tny.cz/4343ee75
<?php
//Hecho por DjAlan98 para PHPost.net
//Diseo del formulario por NESTicle 8bit
include('config.php');
?>
<!DOCTYPE html>
<html lang="es"><head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Formulario de Registro</title>
<link href="images/estilos.css" type="text/css" rel="stylesheet" />
</head>

<body id="login-page">
<div class="login-wrap">
<div class="mensaje">
<h2>Bienvenido al registro</h2>
</div>

<form id="form-logeo" class="generic" method="post">


<div id="login-user" class="field">
<label>Nombre de Usuario (Nick)</label>
<input id="login-username" type="text" class="text" name="username"
placeholder="Nombre de Usuario" tabindex="1" maxlength="200">
</div>
<div id="login-pass" class="field">
<label>Contrasea</label>
<input id="login-password" type="password" class="text" name="password"
placeholder="Contrasea" tabindex="3" maxlength="32">
</div>

<div id="login-user" class="field">


<label>EMail</label>
<input id="login-username" type="text" class="text" name="email"
placeholder="EMail" tabindex="1" maxlength="200">
</div>

<div id="login-user" class="field">


<label>Telfono</label>
<input id="login-username" type="text" class="text" name="telefono"
placeholder="Telfono" tabindex="1" maxlength="200">
</div>

<div class="btnlogeo">
<input id="login-submit" type="submit" value="Listo!">
</div>
<?php
if($_POST){
if(!$_POST['username'] || !$_POST['password'] || !$_POST['email'] || !
$_POST['telefono']) { die('<span style="color:red;">Por favor, compruebe
que haya ingresado TODOS los datos</span>'); }
if(!preg_match('/^[a-z0-9\_\-]{4,16}$/i', $_POST['username'])) {
die('<span style="color:red;">El nick contiene carcteres incorrectos o
es menor a 4 carcteres o mayor a 16</span>'); }
if(strlen($_POST['password']) < 4 || strlen($_POST['password']) > 35) {
die('<span style="color:red;">La contrasea debe tener entre 4 y 35
carcteres</span>'); }
if(!filter_var($_POST['email'], FILTER_VALIDATE_EMAIL)) { die('<span
style="color:red;">EMail incorrecto</span>'); }
if(!ctype_digit($_POST['telefono']) || strlen($_POST['telefono']) < 5 ||
strlen($_POST['telefono']) > 100) { die('<span
style="color:red;">Realmente existen telfonos que lleven letras?
increble!. Ah, y el mximo es 100 carcteres y el mnimo de 5</span>');
}
if(mysql_num_rows(mysql_query('SELECT id FROM usuarios WHERE nick
= \''.mysql_real_escape_string($_POST['username']).'\' LIMIT 1'))) {
die('<span style="color:red;">El usuario ya existe.</span>'); }
mysql_query('INSERT INTO `usuarios` (nick, password, email, telefono)
VALUES
(\''.htmlspecialchars($_POST['username']).'\', \''.htmlspecialchars(md5($
_POST['password'])).'\', \''.htmlspecialchars($_POST['email']).'\', \''.
(int)$_POST['telefono'].'\')');
die('<span style="color:green;">Registrado correctamente</span> <a
href="login.php">Loguearme</a>');
}
?>
</form>
</div>
</body></html>

Comprobamos que se hayan envado datos por POST y que se hayan ingresado todos los datos,
con una pequea expresin regular hecha con preg_match comprobamos que el nick no contenga
carcteres especiales y tenga un tamao especfico. Comprobamos que el tamao de la
contrasea sea el correcto, que el email tambin sea correcto con un filtro (filter_validate_email),
con ctype_digit comprobamos que los valores ingresados en el campo telefno sean numricos y
que no sobrepasen un determinado tamao. Por ltimo insertamos todos los datos ingresados
dentro de la tabla usuarios que acabamos de crear.
5) Crear un archivo llamado index.php y colocar lo siguiente:

http://tny.cz/ed9c8551

<?php
//Hecho por DjAlan98 para PHPost.net
include('config.php');
?>
<!DOCTYPE html>
<html lang="es"><head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Index</title>
<link href="images/estilos.css" type="text/css" rel="stylesheet" />
</head>

<body id="login-page">
<div class="login-wrap">
<div class="mensaje">
<?php
if(!$user){
?>
<h2>Al parecer usted no est logueado o registrado, para registrarse haga
click <a href="registro.php">Aqu</a> o para loguearse, click <a
href="login.php">Aqu</a></h2>
<?php
} else { ?> <h2>Bienvenido a la web <?=$user['nick'];?>, su EMail es <?
=$user['email'];?> y su telfono es <?=$user['telefono'];?></h2> <a
href="logout.php">Para desloguearse haga click aqu</a> <br /> <a
href="/perfil/<?=$user['nick'];?>">Para ir a su perfil haga click
aqu</a>
<?
}
?>
</div>
</div>
</body>
</html>

Incluimos los datos importantes (conexin a la db y archivo de sesin de usuario), comprobamos


que exista una sesin, en caso de no existir mostrar el mensaje para llevar al registro o login. Si
existe una sesin, se muestran los datos del usuario logueado:

6) Crear un archivo llamado logout.php e ingresar lo siguiente:

http://tny.cz/ca36045a
<?php
//Hecho por DjAlan98 para PHPost.net
include('config.php');
if(!$user) { die('Usted no est logueado'); }
setcookie('sesion', 'nada', time()+1, '/');
header('location: index.php');
?>

Inclumos lo ms importante, comprobamos que el usuario est logueado y en caso de estarlo


destruir la cookie y redireccionar al index.

7) Crear un archivo llamado perfil.php e ingresar lo siguiente:


http://tny.cz/f4c8a3c2
<?php
include('config.php');
if(!$_GET['user']) { die('El nick es requerido'); }
if(!mysql_num_rows($query = mysql_query('SELECT nick, email, telefono
FROM usuarios WHERE nick
= \''.mysql_real_escape_string($_GET['user']).'\''))) { die('Usuario
inexistente'); }
$u = mysql_fetch_row($query);
?>
<!DOCTYPE html>
<html lang="es"><head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Perfil de <?=$u[0];?></title>
<link href="/images/estilos.css" type="text/css" rel="stylesheet" />
</head>
<body>
<div class="login-wrap">
<div class="mensaje">
<h2 style="color:green">Perfil de <?=$u[0];?></h2>
<h2 style="color:blue">Su email:<?=$u[1];?></h2>
<h2 style="color:red">Su telfono:<?=$u[2];?></h2>
</div>
<center><input id="login-submit" onclick="location.href='/'"
type="button" value="Ir al inicio"></center>
</div>
</body></html>

Inclumos el archivo de conexin a la base de datos, si no se ha recibido el nick mostrar un


mensaje de error; comprobar que el nick ingresado en la URL exista y si existe se recuperan los
datos de ese usuario con mysql_fetch_row(); que retorna una asociacin numrica de los datos
comenzando con 0.

8) Crear un archivo .htaccess (sin extensin) para poder acceder a los perfiles de esta forma:
perfil/nick y agregar lo siguiente:

RewriteEngine On
RewriteRule ^(.*)/$ /$1 [L]
RewriteRule ^perfil/([a-z0-9_-]+)$ perfil.php?user=$1 [NC,L]

En caso de querer agregar una nueva funcin, siempre incluir el config.php ya que contiene lo ms
importante.
Por cierto, mysql_real_escape_string(); es para evitar inyeccin SQL y htmlspecialchars(); es para
evitar ataques XSS.

Crditos a NESTicle 8-bit por el diseo del registro y el login.

Como pueden ver es todo bastante simple, es ms para que lo puedan usar de base y cambiarle el
diseo y ponerle algo mejor, entre otras cosas.

Tuve que poner todo en pastes porque taringa quita las barritas del cdigo ._.

Link del topic, tambin hay un adjunto con todo lo de


arriba: http://www.phpost.net/foro/topic/16543-sistema-de-login-hecho-por-mi-en-php-mysql/

También podría gustarte