[TUTORIAL] Crear un sistema de usuarios básico completo 2.0

eZakto

Member
Messages
782
Reaction score
1
Points
18
Crear un sistema de usuarios básico completo 2.0

Holy Cow! Lo dices enserio?
Oh sí.
¿Por qué 2.0?
Este, con respecto al anterior, es mejor, más seguro, su código no da asco y utiliza buenos métodos.
¿Qué necesito para comenzar?
Hosting, una base de datos y ganas de leer.

1. Comencemos
Lo primero que vamos a hacer, es un archivo que llamaremos 'dbconf.php'. Ahí pondremos los datos necesarios para conectarnos a la base de datos y crearemos la conexión.

dbconf.php
PHP:
<?php
/*
# [Tutorial] Registro de Usuarios.
# Por eZakto.
#
# Archivo: Configuración de la db [dbconf.php]
*/

$db_user = 'cuenta_usuario';
$db_pass = 'password';
$db_host = 'localhost';
$db_name = 'cuenta_database';
$tablename = 'user_system';

$db_link = mysql_connect($db_host, $db_user, $db_pass);
mysql_select_db($db_name);
?>
2. Creando la tabla
Bien. Ahora debemos crear una tabla en nuestra base de datos. El nombre de ésta debe ser el mismo que el especificado en la variable '$tablename'.
Esta tabla constará de 4 campos: 'user_id', 'username', 'mail' y 'password'. La primera será int, unsigned y key y el resto tinytext. Puedes crearla manualmente o correr la siguiente sentencia SQL:
Code:
    CREATE  TABLE  `thaor3_zp3`.`user_system` ( `user_id` INT( 32  )  UNSIGNED NOT  NULL  AUTO_INCREMENT ,
 `username` TINYTEXT NOT  NULL ,
 `mail` TINYTEXT NOT  NULL ,
 `password` TINYTEXT NOT  NULL ,
 PRIMARY  KEY (  `user_id`  ) 
) ENGINE  =  MYISAM
3. El archivo 'register.php' y su formulario, 'register.html'
Ahora comenzamos con el código. Por favor, antes de hacer copy&paste puro y duro, lee los comentarios que he escrito... El objetivo es aprender. Primero el form, no tiene mucha ciencia. Luego, el php.

register.html
HTML:
<form method="POST" action="register.php">
    Usuario:<br />
    <input type="text" name="reg_user" /><br />
    Mail:<br />
    <input type="text" name="reg_mail" /><br />
    Contrase&ntilde;a:<br />
    <input type="password" name="reg_pass" /><br />
    Confirmar contraseña:<br />
    <input type="password" name="reg_cfrm" /><br />
    <br />
    <input type="submit" value="Registrarse" />
</form>
register.php
PHP:
<?php
/*
# [Tutorial] Registro de Usuarios.
# Por eZakto.
#
# Archivo: Registro [register.php]
*/

include('dbconf.php');

// Detenemos el script si no se han enviado datos.
if(empty($_POST)) die();

// Filtramos y asignamos variable a los datos obtenidos (PHP 5)
$user = filter_input(INPUT_POST, 'reg_user', FILTER_SANITIZE_SPECIAL_CHARS);
$mail = filter_input(INPUT_POST, 'reg_mail', FILTER_SANITIZE_SPECIAL_CHARS);
$pass = md5($_POST['reg_pass']); // En el caso de la contraseña, no filtramos, solo encriptamos
$cfrm = md5($_POST['reg_cfrm']);

// Comprobamos que el usuario tenga mas de 3 caracteres
if(strlen($user) <= 3) header('Location: error.html');

// Comprobamos que el mail sea valido (solo letras, numeros, guion, punto y arroba)
if(!preg_match('/^([a-z0-9._\-]+)@([a-z0-9._\-]+)\.([a-z]+)$/i', $mail)) header('Location: error.html');

// Comprobamos lo mismo para la contraseña y ademas que sea igual a la confirmación
if($pass != $cfrm) header('Location: error.html');

// Ahora comprobamos que el nombre de usuario no exista en la db
$sql_check_user = mysql_query("SELECT user_id FROM {$tablename} WHERE username='{$user}'");
if(mysql_num_rows($sql_check_user)) header('Location: error.html');

// Lo mismo con el mail
$sql_check_mail = mysql_query("SELECT mail FROM {$tablename} WHERE mail='{$mail}'");
if(mysql_num_rows($sql_check_mail)) header('Location: error.html');

// Todas las comprobaciones están hechas, ahora debemos guardar los datos en la db
$sql_save_data = "INSERT INTO {$tablename}(user_id, username, mail, password) VALUES (NULL, '{$user}', '{$mail}', '{$pass}')";
if(mysql_query($sql_save_data)) header('Location: success.html'); // Redirección al registrarse satisfactoriamente
?>
4. El archivo 'login.php' y 'login.html'
login.html
HTML:
<form method="POST" action="login.php">
    Usuario:<br />
    <input type="text" name="log_user" /><br />
    Contraseña:<br />
    <input type="password" name="log_pass" /><br />
    <input type="checkbox" name="log_remember" id="remember" /><label for="remember">Iniciar sesi&oacute;n autom&aacute;ticamente</label><br />
    <br />
    <input type="submit" value="Iniciar sesi&oacute;n" /><br />
    <a href="http://forums.x10hosting.com/tutoriales/register.html">Registrarse</a>
</form>
login.php
PHP:
<?php
/*
# [Tutorial] Registro de Usuarios.
# Por eZakto.
#
# Archivo: Login [login.php]
*/

include('dbconf.php');

// Detenemos el script si no se han enviado datos.
if(empty($_POST)) die();

// Filtramos y asignamos variable a los datos obtenidos. Para el login solo necesitamos usuario y contraseña
$user = filter_input(INPUT_POST, 'log_user', FILTER_SANITIZE_SPECIAL_CHARS);
$pass = md5($_POST['log_pass']); // La contraseña la encriptamos, si es igual a la de registro, el hash será el mismo

// Buscamos el nombre de usuario en la db
$sql_check_user = "SELECT username,password FROM {$tablename} WHERE username='{$user}'";
if(!mysql_num_rows($sql_check_user)) header('Location: error.html'); // Cuidado aquí, noten el '!' en la condición

// Con la misma sentencia SQL, comprobamos que el hash de la contraseña sea el mismo
while($row = mysql_fetch_array($sql_check_user)) {
    if($pass != $row['password']) header('Location: error.html');
}

// Insertartamos una cookie con la id del usuario y otra con un hash en base al usuario y el hash de la contraseña
while($row = mysql_fetch_array($sql_check_user)) {
    // Antes, definiremos la duracion de las cookies. Será una hora ó un año (si el usuario quiere recordar sus datos)
    $time = (!$_POST['log_remember']) ? time()+3600 : time()+31536000;
    // Ahora si, las cookies
    setcookie('user_id', $row['user_id'], $time);
    setcookie('user_hash', md5($row['username'] . $row['password']), $time);
}

header('Location: index.html'); // Redirección cuando el usuario se haya logeado satisfactoriamente
?>
5. El 'logout'
logout.php
PHP:
<?php
/*
# [Tutorial] Registro de Usuarios.
# Por eZakto.
#
# Archivo: Logout [logout.php]
*/

include('dbconf.php');

// Comprobamos que el usuario haya iniciado sesión antes
if($_COOKIE['user_hash']) {
    // Reescribimos las cookies con una fecha ya pasada, el navegador la eliminará
    setcookie('user_id', '', time()-3600);
    setcookie('user_hash', '', time()-3600);
}

header('Location: index.html'); // Redirección
?>

6. El corazón: la función "isOnline()"
isonline.php
PHP:
<?php
/*
# [Tutorial] Registro de Usuarios.
# Por eZakto.
#
# Archivo: isOnline [isonline.php]
*/

include('dbconf.php');

// Creamos la función que comprueba los datos
function isonline() {
    // Comprobamos que las cookies existan
    if(!$_COOKIE['user_id']) return false;
    if(!$_COOKIE['user_hash']) return false;
    // Filtramos las cookies
    $user_id = filter_input(INPUT_COOKIE, 'user_id', FILTER_SANITIZE_SPECIAL_CHARS);
    $user_hash = filter_input(INPUT_COOKIE, 'user_hash', FILTER_SANITIZE_SPECIAL_CHARS);
    // Con la id guardada, buscamos al usuario y obtenemos su información
    $sql_check_user = "SELECT username,password FROM {$tablename} WHERE user_id='{$user_id}'";
    while($row = mysql_fetch_array($sql_check_user)) {
        // Ahora rearmamos el user_hash con los datos guardados y comprobamos que sean iguales
        $real_hash = md5($row['username'] . $row['password']);
        if($user_hash != $real_hash) return false;
    }
    return true;
}
?>
7. Implementando
El login está termiando! Hurra!
Para implementarlo, sólo debes incluir el archivo isonline.php al principio del documento que quieras proteger. Luego, el contenido a proteger lo encierras en un condicional de php 'if(isonline()) {' y si quieres mostrar un mensaje en caso de no estar logueado, le agregas un 'else {'.

protected.php
HTML:
<?php
include('isonline.php');
?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
    <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
    <title>P&aacute;gina protegida</title>
</head>
<body>
<?php
// Compruebo si el usuario está logueado
if(isonline()) {
?>

Bienvenido a la p&aacute;gina protegida.<br />
<a href="http://forums.x10hosting.com/tutoriales/logout.php">Cerrar sesi&oacute;n</a>

<?php
// Si no lo está...
} else {
?>

Debes iniciar sesión para ver esta página<br /><br />
<?php include('login.html'); ?>

<?php
}
?>
</body>
</html>

------------

No he probado nada, si encuentran algún error, por favor, avisenme.
-> Descarga los archivos de ejemplo
 
Last edited by a moderator:

hezuo

New Member
Messages
174
Reaction score
0
Points
0
gracias por el tuto, se nota que me va a servir mucho, que recién he comenzado a aprender php... :happysad:
 

Amadis

New Member
Messages
31
Reaction score
0
Points
0
No es por nada, pero creo que le faltan algunas cositas. Por ejemplo, un pequeño panel después de hacer login y, además, adaptarlo a un portal dinámico (?id=xxx)
 

eZakto

Member
Messages
782
Reaction score
1
Points
18
Es un tutorial para crear un sistema de usuarios básico. Su uso lo eliges tu.
 

jyatrave

New Member
Messages
12
Reaction score
0
Points
0
Está perfecto, ya logre colocar un sistema en una de mis creaciones.

Se agracede!!!
 

TonnyORG

I Code Things
Community Support
Messages
5,914
Reaction score
16
Points
38
muy bueno y me gusta las explikaciones paso a paso ke vas dando tanto dentra como fuera del codigo ;)
estos aportes valla ke se agradecen :)


salu2
 
Last edited:

Arcadio

New Member
Messages
7
Reaction score
0
Points
0
El tuto esta bueno pero es solo para php o html

El sistema está hecho para PHP, el cual es un lenguaje de programación.
No lo confundas con HTML, que es el lenguaje de etiquetas por excelencia en Internet :nuts:
 

PatricioAsencio

New Member
Messages
3
Reaction score
0
Points
0
Entoces eso significa que no se puede ocupar para una pagina html??.
Mira yo lei tu tuto es muy bueno, de echo lo comprendí muy bien. Pero no se como implementarlo para mi web(html).
No se en que parte debo decirle que se dirija a mi pagina web privada(indexp.html).
Si tuvieses la amabilidad de explicarme.

Se te agradece.
 

evigra

New Member
Messages
244
Reaction score
3
Points
0
Entoces eso significa que no se puede ocupar para una pagina html??.
Mira yo lei tu tuto es muy bueno, de echo lo comprendí muy bien. Pero no se como implementarlo para mi web(html).
No se en que parte debo decirle que se dirija a mi pagina web privada(indexp.html).
Si tuvieses la amabilidad de explicarme.

Se te agradece.

Hermano...
Todo este tuto es para almacenar informacion en una DB (MySQL) y es necesario que la programacion sea dinamica (PHP) para mostrar la informacion dentro de tu bd

necesitas programar php
 

PatricioAsencio

New Member
Messages
3
Reaction score
0
Points
0
Hola, mira ya lo hice me funciona todo a la perfección, tuve que hacer unos cambios de programación pero me resulto. Eso si tengo un problema, cuando no ingreso la clave y retrosedo con la flecha me direcciona a la pagina en privada. otra cosa al parecer te falta un archivo(sucess.html, o algo por el estilo)

Si puedes contestame ya que eso me tiene bastante preocupado.
 

eZakto

Member
Messages
782
Reaction score
1
Points
18
Este tutorial tiene fines didácticos. Sería un pecado usarlo tal cual en una web abierta al público.

Saludos.
 

PatricioAsencio

New Member
Messages
3
Reaction score
0
Points
0
Como te dije comprendi el codigo y lo perfeccione a mi modo. El tema anterior ya lo solucione, lo que pasa es que me pasaba eso pero lo direccione a otra pagina y listo, santo remedio. Ahora lo que pasaba es que en la pagina de aquí aparecen los codigos pero distintos que al del que se baja, y en los que se bajan existen dos condiciones que se direccionan a dos archivos que no vienen (error.html y succes.html) por ese motivo me confundí. Lo importante es que ya lo solucione.

Muchas gracias. Se agradece por la orientación.
 
Top