Sistema de registro y login con PHP y MySQL

En este artículo vamos a mostrar cómo hacer un sistema básico de registro y un sistema de login mediante sesiones.

El ejemplo sigue los siguientes pasos:

  • 1º tabla de mysql y código general
  • 2º sistema de registro
  • 3º sistema de login
  • 4º ejemplo práctico del login

Para ello es necesario un hosting con soporte PHP, las sesiones activadas y una base de datos mysql.

Tabla de Mysql y código general

Este php irá en todos los .php que usemos porque contiene los datos para la conexión a la db:

config.php. Archivo de configuración donde almacenaremos los datos de conexión a la base de datos.

<?
$dbhost="localhost"; //Host del mysql
$dbuser="usuario"; //Usuario del mysql
$dbpass="password"; //Password del mysql
$db="db_usuarios"; //db donde se creará la tabla users

//conectamos y seleccionamos db
mysql_connect("$dbhost","$dbuser","$dbpass");
mysql_select_db("$db");

//Comenzamos la sesión, esto se explica despues en el Sistema de Login
session_start();
?>

Para llevar a cabo el proceso de registro deberemos crear una tabla llamada users con los campos: id,nick, pass,email,fecha,level,rollo .

SQL a ejecutar

CREATE TABLE `users` (
 `id` INT( 4 ) NOT NULL AUTO_INCREMENT,
 `nick` VARCHAR(30) NOT NULL ,
 `pass` VARCHAR(30) NOT NULL ,
 `email` VARCHAR(50) NOT NULL ,
 `fecha` INT(15) NOT NULL ,
 `level` INT(2) NOT NULL ,
  `rollo` LONGTEXT NOT NULL ,
INDEX ( `id` )
);

Sistema de registro

Primero comenzaremos con una pagina llamada form.php donde mostraremos un formulario donde introducir los datos de registro. Este formulario se enviará a registrar.php donde realizará las comprobaciones e introducirá los datos en la tabla users de nuestra base de datos.

form.php. Creamos el formulario que se enviará a registrar.php

<form action="registrar.php" method="POST">
  Nick: <input type="text" name="nick" size="30"><br>
  Password: <input type="password" name="pass" size="30" ><br>
  Repetir Password: <input type="password" name="pass1" size="30" ><br>
  Email: <input type="text" name="email" size="50"><br>
  Rollo: <textarea name="rollo" cols="30" rows="10"></textarea><br>
<input type="submit" name="submit" value="Enviar"></form>

registrar.php.

<?
//incluimos datos de la conexión a la db
include('config.php'); 

//Comprobamos que los campos nick, pass y pass1 se han rellenado en el formulario
if(($_POST[nick] == ' ') or ($_POST[pass] == ' ') or ($_POST[pass1] == ' ') )
{
   // redirigimos al formulario
    header("Location: form.php"); /
}else{

   //Comprobamos que la pass y pass1 
    if($_POST[pass] != $_POST[pass1])
    {
        echo 'Las passwords no son iguales';
     }else{
       //quitamos el codigo malicioso de $_POST[nick] y  $_POST[pass]
       $user = stripslashes($_POST["nick"]);
       $user = strip_tags($user);
       $pass = stripslashes($_POST["pass"]);
       $pass = strip_tags($pass);

       //comprobamos que el usuario no existe en la db
       $usuarios=mysql_query("SELECT nick FROM users WHERE nick='$user' ");
      if($user_ok=mysql_fetch_array($usuarios))
      {
         echo 'El usuario ya esta registrado';
          //liberamos la memoria del query a la db
         mysql_free_result($usuarios); 
      }else{
        //quitamos todo el codigo malicioso de las demas variables 
       $email = stripslashes($_POST["email"]);
       $email = strip_tags($email);

      $rollo = stripslashes($_POST["rollo"]);
      $rollo = strip_tags($rollo);

      $fecha = time();
       //usaremos level 1 para admins, level 2 para los demas  
      $level = "2"; 

      //introducimos el nuevo registro en la tabla users
      mysql_query("INSERT INTO users (nick,pass,email,fecha,level,rollo) values ('$user','$pass','$email','$fecha','$level','$rollo') ");
      echo 'Usuario registrado con éxito';
    }

 }

}
?>

Sistema de login

Una vez que ya tenemos el formulario de registro y la funcionalidad necesaria para dar de alta nuevos usuarios, procemos a realizar el módulo para que los usuarios puedan identificarse en el sistema.

Comenzaremos con un pequeño form en login.php donde se introduciran los datos de acceso (login/password) para ser comprobados posteriormente en autentificar.php.

Si los datos de acceso son correctos, crearemos una variable de sesión indicando que el usuario se encuentra identificado correctamente. Las sesiones nos permiten conservar valores relativos a un usuario entre diferentes páginas. Debemos recordar que para poder utilizar sesiones y acceder a los diferentes valores en cada página, deberemos llamar a la función session_start(), en cada página donde queramos acceder a la sesión del usuario.

  • Nota, siempre que se ponga session_start() debemos tener en cuenta que esta instrucción debe ir justo al principio del script, antes de lanzar ningún tipo de contenido al navegador. Tened especial cuidado con los espacios en blanco que pueden quedar antes de las etiquetas de apertura de PHP <? , o el script fallará.

login.php. Formulario de identificación

<?
//incluimos datos de la conexión a la db
include('config.php'); 
?>


<?
// Comprobamos que el usuario no esté identificado ya
if(!isset($_SESSION[usuario]) ) {
?>

<form action="autentificar.php" method="POST">
Nick: <input type="text" name="nick" size="30"><br>
Password: <input type="password" name="pass" size="30" ><br>
<input type="submit" name="submit" value="Enviar"></form>

<? }else{

//SI ya está identificado, mostramos la opción para cerrar sesión

//Este sería el menú que saldría a la gente que esta logeada, se puede modificar y añadir cosas

//ej Bienvenido Juan
echo 'Bienvenido '.$_SESSION[usuario]; 

//mostramos el level del user
echo '<br>Tu level es '.$_SESSION[level]; 

if($_SESSION[level] == 1)
{
     // mostramos el link para ir a la pagina privada porque el user tiene level 1 (*Nota: el level por defecto es 2, por lo tanto no se le mostrará)
    // *Nota2: para cambiar el level a 1, se puede hacer manualmente desde un gestor como phpmyadmin
echo '<br><a href="paginaprivada.php">Ir a pagina privada</a>';
}

//link para hacer logout
echo '<br><a href="logout.php">Salir</a>'; 

}

?>

autentificar.php

<?
//incluimos datos de la conexión a la db
include('config.php'); 

if( ($_POST[nick] == ' ') or ($_POST[pass] == ' ') )//comprobamos que las variables enviadas por el form de login.php tienen contenido
{
Header("Location: login.php"); //estan vacías, volvemos al index
}else{

//comprobamos en la db si existe ese nick con esa pass
$usuarios=mysql_query("SELECT * FROM users WHERE nick='$_POST[nick]' and pass='$_POST[pass]' ");
if($user_ok = mysql_fetch_array($usuarios)) //si existe comenzamos con la sesion, si no, al index
{

session_register("usuario"); //registramos la variable usuario que contendrá el nick del user
session_register("idusuario"); //registramos la variable idusuario que contendrá la id del user
session_register("level"); //registramos la variable level que contendrá el level del user
//damos valores a las variables de la sesión
$_SESSION[usuario] = $user_ok["nick"]; //damos el nick a la variable usuario
$_SESSION[idusuario] = $user_ok["id"]; //damos la id del user a la variable idusuario
$_SESSION[level] = $user_ok["level"]; //damos el level del user a la variable level
Header("Location: login.php"); //volvemos al login donde nos saldrá nuestro menú de usuario

}else{
echo 'Nick y pass incorrectos';
}

}
?>

logout.php. Script que borrará los datos de la sesión, haciendo que el usuario deje de estar identificado.

<?
session_destroy(); //destruimos la sesion
header("Location: login.php"); //volvemos al login.php

?>

Ejemplos prácticos

  • Hacer una página privada donde solo puedan entrar los de level 1:

paginaprivada.php

<?
//incluimos datos de la conexión a la db
include('config.php'); 

if($_SESSION[level] == 1)
{
     echo 'Tienes level 1 y puedes ver esta página';
}else{
     header("Location: index.php");
}

?>

Hacer una página donde se muestre la información de un usuario, del tipo perfil.php?id=3, donde id sera el identificador del usuario.

perfil.php

<?
//incluimos datos de la conexión a la db
include('config.php'); 

if(!isset($id))
{
     //no han seleccionado ninguna id,
     echo 'no se ha seleccionado ninguna id'; 
}else{

    //comprobamos si esa id existe
    $user=mysql_query("SELECT * FROM users WHERE id='$id' ");
    if($user_ok=mysql_fetch_array($user) )
     {
    //todo comprobado, ahora solo falta mostrar los datos
     echo 'Usuario <b>'.$user_ok["nick"].'</b><br>';
     echo '<br>Email: <a href="mailto:'.$user_ok["email"].'">'.$user_ok["email"].'</a>  <br>';

     //sacamos la fecha de registro mediante la funcion date
     $fecha=date("d.m.Y - H:i", $user_ok["fecha"]);
     echo 'Fecha de registro: '.$fecha.'<br>';

     //por último mostramos el rollo
     echo 'Rollo:<br>'.$user_ok["rollo"];

   }else{
     echo 'La id seleccionada no existe';
   }

}
?>

Todos estos códigos y ejemplos son una guía de como se deben hacer o empezar a hacer las cosas. Pretende dar una idea general de funcionamiento, por lo que pueden mejorarse enormemente en cuanto a seguridad y a calidad. Sin embargo, creemos que son suficientes para poder hacerse una idea de cómo implementar un sistema de este tipo.

Si tenéis cualquier duda, podéis hacerla llegar a través de los foros de PHP-Hispano.

Un saludo.

rubenico & PHP-Hispano.net (porque al final, aprendemos todos)

Resumen

Guía paso a paso de como realizar un sistema básico de registro de usuarios con PHP y MySQL mediante el uso de sesiones. Cada paso viene acompañado con un código de ejemplo y bien explicado para principiantes.

Índice

  1. Sistema de usuarios y login en PHP

Otros artículos