Formulario de Login con PHP y MySql

En este tutorial crearemos un formulario login utilizando php y mysql. Comenzemos!!!

En un post anterior había explicado algo del manejo de sesiones con PHP, y había prometido una clase que nos facilitara trabajar con sesiones, para este tutorial utilizaremos dicha clase.

Tabla: Usuario

La información del usuario y contraseña la obtendremos de la tabla usuarios.

CREATE TABLE `usuario` (  
`idusuario` INTEGER(11) UNSIGNED ZEROFILL NOT NULL AUTO_INCREMENT,  
`Nombre` VARCHAR(20) NOT NULL DEFAULT '',  
`nick` VARCHAR(20) NOT NULL DEFAULT '',  
`contrasenia` VARCHAR(20) NOT NULL DEFAULT '',  
PRIMARY KEY (`idusuario`),  UNIQUE KEY `idusuario` (`idusuario`)
) ENGINE=InnoDB CHARACTER SET 'latin1';

Archivo: sesion.class.php

<?php
  class sesion {
     function __construct() {
     session_start ();
  }
  public function set($nombre, $valor) {
     $_SESSION [$nombre] = $valor;
  }
  public function get($nombre) {
     if (isset ( $_SESSION [$nombre] )) {
        return $_SESSION [$nombre];
     } else {
         return false;
     }
  }
  public function elimina_variable($nombre) {
      unset ( $_SESSION [$nombre] );
  }
  public function termina_sesion() {
      $_SESSION = array();
      session_destroy ();
  }
}
?>

En todos los archivos que integren nuestra aplicación tenemos que iniciar la sesión y lo haremos con el siguiente código:

   require_once("sesion.class.php");

   $sesion = new sesion();

   if( $usuario == false ) {
      // si no se ha iniciado sesión redirecciona a la pagina login.php
      header("Location: login.php");
   } else {
      // Aquí va el contenido de la pagina qu se mostrara en caso de que se haya iniciado sesion
   }

Archivo: login.php

En el archivo login.php vamos a encontrar el formulario de logeo, en dicho formulario el usuario introducirá su nick y contraseña.

<form name="frmLogin" action="<?php echo $_SERVER['PHP_SELF']; ?>">
   <div>
      <label>Usuario: </label> <input name = "usuario"/>
      <label>Contraseña: </label> <input name = "contrasenia" />
      <input name ="btnIniciar" value="Iniciar Sesion"/>
   </div>
</form>

Una vez que el usuario haya introducido sus datos el script se procesara asi mismo. Mediante el siguiente código:

if( isset($_POST["iniciar"]) )	{
   $usuario = $_POST["usuario"];
   $password = $_POST["contrasenia"];
   if(validarUsuario($usuario,$password) == true){
      $sesion->set("usuario",$usuario);
      header("location: principal.php");
   } else {
     echo "Verifica tu nombre de usuario y contraseña";
   }
}

function validarUsuario($usuario, $password)	{
   $conexion = new mysqli("localhost","usuario","password","base");
   $consulta = "select contrasenia from usuario where nick = '$usuario';";
   $result = $conexion->query($consulta);
   if($result->num_rows > 0)	{
      $fila = $result->fetch_assoc();
      if( strcmp($password,$fila["contrasenia"]) == 0 )
         return true;
      else
         return false;
   }  else
       return false;
}

Se recogen los valores del formulario y se envían a la función validar usuario, dicha función hace la consulta a la base de datos y devuelve verdadero cuando el usuario y la contraseña sean correctos, en caso contrario devuelve falso.
Si la función devolvió verdadero se crea la variable de sesión usuario y se redirecciona hacia la página principal.php en caso contrario muestra un mensaje para que verifique la información de usuario y contraseña.

Archivo: principal.php

A esta página solo tendrán acceso los usuarios que se hayan logeado correctamente de lo contrario la pagina los enviara a login.php

<?php
   require_once("sesion.class.php");
   $sesion = new sesion();
   $usuario = $sesion->get("usuario");
   if( $usuario == false )	{
      header("Location: login.php");
   }  else  {
?>
<HTML>
   <head>
      <title></title>
   </head>
   <body>
      <h1>Hola:  <?php echo $sesion->get("usuario"); ?> </h1>
      <a href="cerrarsesion.php"> Cerrar Sesion </a>
      <p> Aqui va el contenido de la pagina </p>
   </body>
</HTML>
<?php
   }
?>

Archivo: cerrarsesion.php

El archivo sesión.php se encarga de finalizar la sesión del usuario.


<?php
   require_once("sesion.class.php");
   $sesion = new sesion();
   $usuario = $sesion->get("usuario");
   if( $usuario == false )	{
      header("Location: login.php");
   }  else  {
      $usuario = $sesion->get("usuario");
      $sesion->termina_sesion();
      header("location: login.php");
   }
?>

Aca les dejo el link de descarga

47 comentarios en “Formulario de Login con PHP y MySql”

  1. Edward dice:

    Hola muchas gracias por tu trabajo es de mucha ayuda

    1. Jose dice:

      te funciono??

      1. edward dice:

        en eso estoy pero aun asi me tira un erro

  2. Jose dice:

    Donde coloco el codigo:

    if( isset($_POST[“iniciar”]) ) {
    $usuario = $_POST[“usuario”];

    ” en adelante…..

    ya que no me funciona….

  3. Jose dice:

    o si pudieras arreglar el link de descarga!!!

    1. denker dice:

      Ya quedo el link para descargar, saludos

  4. Andrey Villamarin dice:

    Hola! gracias por el tutorial, esta muy bueno. me gustaria saber mas sobre la creacion de la tabla y como se conecta a ella, es que no entendi muy bien esa parte . muchas gracias

  5. Oriol dice:

    Gracias por la aportación denker, pero en la página “principal.php” que codigo hay que poner para poner el nombre y no el nick.

    1. denker dice:

      Hola, podrias crear un consulta para obtener el nombre del usuario y lo agregas como variable de sesion

      if(validarUsuario($usuario,$password) == true){
      $conexion = new mysqli(“localhost”,”usuario”,”password”,”base”);
      $consulta = “SELECT Nombre FROM usuario WHERE nick = ‘”.$sesion->get(“usuario”).”‘”;
      $result = $conexion->query($consulta);
      $fila = $result->fetch_assoc();

      $sesion->set(“nombre”,$fila[‘Nombre’]);
      $sesion->set(“usuario”,$usuario);
      header(“location: principal.php”);
      }

      y el el archivo principal lo puedes imprimir de la siguiente forma
      $sesion->get(“usuario”);

      1. Oriol dice:

        Donde pongo este codigo:
        if(validarUsuario($usuario,$password) == true){
        $conexion = new mysqli(“localhost”,”usuario”,”password”,”base”);
        $consulta = “SELECT Nombre FROM usuario WHERE nick = ‘”.$sesion->get(“usuario”).”‘”;
        $result = $conexion->query($consulta);
        $fila = $result->fetch_assoc();

        $sesion->set(“nombre”,$fila[‘Nombre’]);
        $sesion->set(“usuario”,$usuario);
        header(“location: principal.php”);
        }

        1. denker dice:

          Eso va en el archivo login.php

          1. Oriol dice:

            Lo he puesto tal como has dicho pero no me funciona.

  6. pedro dice:

    Muchas gracias, me ha funcionado de maravilla

  7. JesusRomero dice:

    y como se puede crear usuarios y como lo administro??

  8. Javier dice:

    ¡Gracias! Ésta es una solución muy entendible y ha funcionado perfectamente. Una consulta: ¿Es necesario incluir la opción else en principal.php? Sin ella, podria usar un include en cada página y ahorrarme un poco de trabajo 😀

    1. denker dice:

      Hola amigo, el else si quieres lo puedes omitir porque si encuentra el header location inmediatamente lo redirecciona

      1. intente implementar tu sistema de login añadiendo niveles de usuarios :
        funciona bien pero en las paginas: director.php , docente.php , estudiante.php las que redirecciona c omo tendria que poner la seguridad para que no sea accesible con el solo cambiar la URL. que los usuarios ingresen segun el nivel de seguridad que se le registro. un docente no ingresar en la pagina de Director por ejemplo.
        set(“usuario”,$usuario);

        if ($cargo==’4′) {
        header(“location: http://localhost/entrar/director.php“);//index del director
        }
        if ($cargo==’3′) {//index de los docente
        header(“location: http://localhost/entrar/docente.php“);
        }
        if ($cargo==’2′) {//index de estudiantes
        header(“location: http://localhost/entrar/estudiante.php“);

        }
        }
        else
        {
        echo “”.””;
        echo “”.”Estimado Usuario “.””.””.”Verifica tu nombre de usuario, contraseña y el Cargo”.”“.””;
        echo “”.”query($consulta);

        if($result->num_rows > 0)
        {
        $fila = $result->fetch_assoc();
        if( strcmp($password,$fila[“contrasenia”]) == 0 )
        return true;
        else
        return false;
        }
        else
        return false;
        }
        ?>

  9. jose dice:

    todo ese codigo para unos cuantos caja de textos XS

  10. ceci dice:

    Hola, muchisimas gracias, estaba buscando algo asi durante semanas y por fin!, lo encontre!, me fue de mucha ayuda, aunque claro ahora lo estudiare para entenderle…

  11. Jhonaz dice:

    Funciona perfectamente. Gracias..

  12. Karla dice:

    Excelente publicación!! 🙂 Me funciono Perfectamente.

    Muchas Gracias

  13. esmeralda dice:

    muy buen ejemplo, solo en los campos de usuario y contraseña, q es lo q se pondra para iniciar la sesion?

    1. denker dice:

      Para iniciar sesión vas a poner los datos del usuario que estén almacenados en la base de datos

  14. eriks dice:

    bueno soy muy nuevo en esto me gustaria saber donde tengo que mter todos estos archivos para que me funcione

  15. rvmon dice:

    Muchas gracias por el ejemplo, funciona muy bien.

    Únicamente tengo una duda, una vez creada la sesión, si en un momento dado necesito hacer una conexión a la base de datos, ¿cómo puedo recuperar el usuario y la contraseña del login sin tener que volver a solicitarlos? Por lo que me ha parecido entender en el código, el usuario se queda en $_Session [‘nombre’], pero no tengo muy claro si se puede recuperar y la contraseña creo que no se queda guardada en ningún lado.

    Muchas gracias y disculpa mi ignorancia, es lo que tiene tener un mundo para aprender 😉

  16. Ichigogabo dice:

    Gracias me ayudastes mucho

  17. oscar dice:

    hola una pregunta como hago para integrar eso en mi web ? porfa lo necesito urgente

  18. joel dice:

    Hola, no comprendo para que es el campo de Id_user, no es mejor tener como identificador único el usuario ?¿

  19. Hola amigo, tu tutorial me parece genial, intente seguirlo, pero me sucede un problema, cuando pogo el codigo en el Login.php en lugar de realizar la interpretacion del codigo sucede que me imprime el codigo en pantalla como si tuviera un ECHO antes justo asi mira. , sucede justo en la llamada del metodo SET

    sesion->set(“usuario”,$usuario);

    header(“location: menu_principal.php”);
    }
    else
    {
    echo “Verifica tu nombre de usuario y contraseña”;
    }
    }

    function validarUsuario($usuario, $password)
    {
    $conexion = new mysqli(“localhost”, “ccsnet”, “chilaquiles51″,”ccsnet_coloquio”);
    $consulta = “SELECT * FROM usuarios WHERE login = ‘”.$usuario.”‘ AND password = ‘”.$psw.”‘ AND permisos=9″;

    $result = $conexion->query($consulta);

    if($result->num_rows > 0)
    {
    $fila = $result->fetch_assoc();
    if( strcmp($password,$fila[“contrasenia”]) == 0 )
    return true;
    else
    return false;
    }
    else
    return false;
    }

    ?>

  20. Que idiota soy, ya lo resolvi, tenia la extension .HTML en lugar de .PHP jajaja ahora me siento un poco torpe, gracias por el codigo amigo esta de lujo, saludos

    1. denker dice:

      Hola Hugo, es parte del aprendizaje, saludos

  21. julian dice:

    hola deker una duda me marca error aqui * $result = $conexion->query($consulta); *
    esta es mi consulta
    function validarUsuario($usuario, $password)
    {
    $conexion= mssql_connect (‘PROYECTOS\SQLEXPRESS’,’sa’,’contraseña’);

    mssql_select_db(“PortalCFDi”,$conexion);

    $consulta = “select Password from Usuarios where Usuario = ‘$usuario’;”;

    $result = $conexion->query($consulta);

    if($result->num_rows > 0)
    {
    $fila = $result->fetch_assoc();
    if( strcmp($password,$fila[“Password”]) == 0 )
    return true;
    else
    return false;
    }
    else
    return false;
    }

    1. denker dice:

      Hola Julian

      El problema es que estas trabajando con una conexión a ms sql server que no soporta la orientación a objetos y en el ejemplo del blog se esta trabajando con un servidor mysql utilizando mysqli que si permite utilizar la conexion orientada a objetos.

      Ya hiciste la conexión a la base, seleccionaste la base de datos solo en la consulta es donde esta incorrecto, te recomiendo que leas la información del siguiente enlace donde se explica como ejecutar tu consulta.
      http://www.php.net/manual/en/function.mssql-query.php

      Saludos

  22. julian dice:

    ya hice la consulta me podrias decir si esta bien como la deje porfa
    //Esta es la de login
    set(“Usuario”,$usuario);

    header(“location: index.php”);
    }
    else
    {
    echo “Verifica tu nombre de usuario y contrase�a”;
    }
    }

    function validarUsuario($usuario, $password)
    {
    $conexion= mssql_connect (‘PROYECTOS\SQLEXPRESS’,’sa’,’contraseña’);

    mssql_select_db(“PortalCFDi”,$conexion);

    $result = mssql_query(“select Password from Usuarios where Usuario = ‘$usuario'”,$conexion);

    if($result->num_rows > 0)
    {
    $fila = $result->fetch_assoc();
    if( strcmp($password,$fila[“Password”]) == 0 )
    return true;
    else
    return false;
    }
    else
    return false;
    }

    ?>

    <form name="frmLogin" action="” method=”POST”>

    Usuario:
    Password:

    me dice el login que el usuario y contrasña estan mal y ps le pongo los que tengo en mi base de datos de echo como acabo de crear la base de datos ps solo tiene un usuario y una contraseña

    los demas archivos asi los tengo

    //esta es la de principal

    get(“Usuario”);

    if( $usuario == false )
    {
    header(“Location: login.php”);
    }
    else
    {
    ?>

    Hola: get(“Usuario”); ?> Cerrar Sesion

    Fecha Inicial:

    Fecha Fecha Final:

         

    Aqui va el contenido de la pagina

    //cerrar secion
    get(“Usuario”);
    if( $usuario == false )
    {
    header(“Location: login.php”);
    }
    else
    {
    $usuario = $sesion->get(“Usuario”);
    $sesion->termina_sesion();
    header(“location: login.php”);
    }
    ?>

    y ps en la de sesion no le movi nada si me podrias ayudar te lo agradeceria mucho

    1. sun2012 dice:

      Hola Julian

      Debes remplazar todas las funciones de mysqli por sus correspondientes en mssql

      $result->num_rows por mssql_num_rows
      $result->fetch_assoc() por mssql_fetch_array

      La documentacion la puedes encontrar aqui en este enlace
      http://us2.php.net/manual/es/ref.mssql.php

  23. Laures dice:

    Me ha servido de gran ayuda, llevaba dias intentando crear un acceso a la bbdd en condiciones, muchas gracias

  24. HenryB dice:

    Denker una consulta, dónde debo poner el nombre de mi base de datos y mi password??? mil gracias,

    1. denker dice:

      en el archivo login.php

      $conexion = new mysqli(“localhost”,”usuario”,”password”,”base”);

      saludos

  25. sergio dice:

    hola, gracias por la ayuda con este ejemplo util, mira tengo este problema…

    Warning: main(sesion.class.php): failed to open stream: No such file or directory in c:\domains\chileansoftware.cl\wwwroot\demo\index.php on line 2

    Fatal error: main(): Failed opening required ‘sesion.class.php’ (include_path=’.;c:\php4\pear’) in c:\domains\chileansoftware.cl\wwwroot\demo\index.php on line 2

    la verdad quede sorprendido, no se que hacer, espero respuesta

    gracias!

    1. denker dice:

      Al parecer no encuentra tu archivo sesion.class.php, revisa que la ruta y el nombre esten correctos, saludos

  26. Juan dice:

    Hola excelente aportes tengo una duda sobre como hacer el inicio de sesión basado en roles ej administrador, editor etc. Creo que solo eso le falta al ejemplo para ser perfecto, crees que me puedas ayudar con eso?

  27. edwin garcia dice:

    buenas tardes descargue el codigo y lo subi a mi servidor cambie los datos de la base de datos pero no me funciona

    Iglesia Sendero Hacia La Luz, Montreal

    set(“usuario”,$usuario); header(“location: principal.php”); } else { echo “Verifica tu nombre de usuario y contrase�a”; } } function validarUsuario($usuario, $password) { $conexion = new mysqli(“localhost”,”jorgenavarre”,”Jorge**2526″,”jorgemysql”); $consulta = “select contrasenia from usuario where nick = ‘$usuario’;”; $result = $conexion->query($consulta); if($result->num_rows > 0) { $fila = $result->fetch_assoc(); if( strcmp($password,$fila[“contrasenia”]) == 0 ) return true; else return false; } else return false; } ?>
    Usuario:
    Contraseña:
    y me sale todo eso y cuando escribo los datos en usuario y contraseña no hace ninguna accion si me podrin ayudar muchisimas gracias

  28. norbelis dice:

    graaaaaaaciaaaaaaaaaaaaaaaaaaaaaaaaaaaassssssssssssssssssss……………….2:03 am

  29. Diana dice:

    Me ayudo mucho tu este tutorial, mi pregunta es cuando quiero validar los permisos de las páginas es decir, que cuando sea administrador le aparezca la página de administrador y cuando sea usuario solo le aparezca una página con ciertos privilegios. ¿Podrías ayudarme?

  30. zeta0 dice:

    muchisimas gracias

  31. M dice:

    Como puedo imprimir los datos de un usuario logueado que se encuentran en la base de datos, comun mente en un login solo imprimimos el nombre del usuario ” Bienvenido . a tu pagina. pero como imprimir sus datos personales como por ejemplo sus dos apellidos, su direccion, su email y su localidad?

  32. Mario dice:

    Como puedo imprimir los datos de un usuario logueado que se encuentran en la base de datos, comun mente en un login solo imprimimos el nombre del usuario ” Bienvenido . a tu pagina. pero como imprimir sus datos personales como por ejemplo sus dos apellidos, su direccion, su email y su localidad?

Deja un comentario