Login y creacion de sesiones con PHP y MySQL

Actualizado: Junio 9 2016

Login y creación de sesiones con PHP y MySQL es la continuación del post titulado  Formulario de Registro de Usuarios con PHP y MySQL

Recuerda que los usuarios primero se deben registrar antes de hacer login.

El código de los ejemplos aquí mostrados han sido actualizados y mejorados para beneficio de ustedes. Si has leído este post anteriormente notaras que es un poco diferente al anterior.

Por ejemplo; ahora el password es convertido en un hash (cifrado) y se usan las funciones mejoradas de PHP como: mysqli();

También fueron removidos los comentarios para hacer mas claro y legible el código. Pero al final doy una breve explicación de como funciona todo.

En el post anterior habías creado un directorio llamado phpLogin con un archivo llamado index.html y otro llamado registrar-usuario.php.

Ahora

  • Crea una pagina llamada login.html
  • Crea una pagina llamada checklogin.php
  • Crea una pagina llamada panel-control.php
  • Crea una pagina llamada logout.php
  • y colócalos dentro del directoro phpLogin.

En total vamos a tener 6 paginas, estas 4 mas las 2 del post Registro de Usuarios con PHP y MySQL

 

Código HTML:

login.html

<!DOCTYPE html>

<html lang="en">

<head>
 <title>Login</title>

 <meta charset = "utf-8">
</head>

<body>

<h1>Login de Usuarios</h1>
<hr />

<form action="checklogin.php" method="post" >

<label>Nombre Usuario:</label><br>
<input name="username" type="text" id="username" required>
<br><br>

<label>Password:</label><br>
<input name="password" type="password" id="password" required>
<br><br>

<input type="submit" name="Submit" value="LOGIN">

</form>
<hr />

<footer>
 &copy;2016 <a href="http://www.VelozityWeb.com">www.VelozityWeb.com</a>
</footer>

 </body>
</html>

 

Codigo PHP:

checklogin.php


<?php
session_start();
?>

<?php

$host_db = "localhost";
$user_db = "root";
$pass_db = "";
$db_name = "basedatosmaster";
$tbl_name = "Usuarios";

$conexion = new mysqli($host_db, $user_db, $pass_db, $db_name);

if ($conexion->connect_error) {
 die("La conexion falló: " . $conexion->connect_error);
}

$username = $_POST['username'];
$password = $_POST['password'];
 
$sql = "SELECT * FROM $tbl_name WHERE nombre_usuario = '$username'";

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


if ($result->num_rows > 0) {     
 }
 $row = $result->fetch_array(MYSQLI_ASSOC);
 if (password_verify($password, $row['password'])) { 
 
    $_SESSION['loggedin'] = true;
    $_SESSION['username'] = $username;
    $_SESSION['start'] = time();
    $_SESSION['expire'] = $_SESSION['start'] + (5 * 60);

    echo "Bienvenido! " . $_SESSION['username'];
    echo "<br><br><a href=panel-control.php>Panel de Control</a>"; 

 } else { 
   echo "Username o Password estan incorrectos.";

   echo "<br><a href='login.html'>Volver a Intentarlo</a>";
 }
 mysqli_close($conexion); 
 ?>

 

Explicación breve del codigo PHP:

La aplicación PHP comienza con la función session_start(); para comenzar la sesión del usuario.

Esta función debe ser lo primero en ejecutarse y debe comenzar exactamente en la primera linea, si hay algún código, espacio en blanco o alguna otra cosa antes de esta función se producirá un error.

 

Desde la linea 7 a la 17 están las variables y funciones típicas de conexión y verificación de error.

En la linea 19 y 20 están las variables que guardan el nombre de usuario y password entrados por el usuario en el formulario.

En la linea 22 la variable $sql guarda la consulta SQL que verifica si el nombre de usuario  ya existe en la base de datos.

En la linea 24 la variable $result guarda el resultado de la función query() usando como parámetro el resultado de la variable $sql.

En la linea 27 si (if) $result->num_rows  es mayor que  0. La condición se cumple y sigue con la linea 29.

En la linea 29 la variable $row guarda el resultado de la función fetch_array(MYSQLI_ASSOC); la cual se utiliza para extraer data de la base de datos en forma de arreglo (array). En este caso, solo extraerá el password.

En la linea 30 si (if) la verificación de la función password_verify(); es exitosa continua con el resto del programa. De lo contrario (else) quiere decir que el nombre de usuario o password están incorrectos.

La función password_verify(); lo que hace es descifrar el hash en la base de datos para compararlo con el password entrado en el formulario y verificar que sean iguales.

De la linea 32 a la 35 se crea la sesión para un usuario en particular. En la linea 35 se establece el tiempo de duración de la sesión en este caso 5 minutos.

Una vez el usuario hace login con éxito, le muestra un mensaje de bienvenida con un enlace al Panel de Control.

panel-control.php


<?php
session_start();

if (isset($_SESSION['loggedin']) && $_SESSION['loggedin'] == true) {

} else {
   echo "Esta pagina es solo para usuarios registrados.<br>";
   echo "<br><a href='login.html'>Login</a>";
   echo "<br><br><a href='index.html'>Registrarme</a>";

exit;
}

$now = time();

if($now > $_SESSION['expire']) {
session_destroy();

echo "Su sesion a terminado,
<a href='login.html'>Necesita Hacer Login</a>";
exit;
}
?>

<!DOCTYPE html>
<html lang="en">

<head>
<title>Panel de Control</title>
</head>

<body>
<h1>Panel de Control</h1>
<p>Aqui hirian los enlaces que le permitirian al usuario
editar su perfil o cualquier otra cosa que desees.</p>

<ul>
  <li>Editar Perfil</li>
  <li>Editar Preferencias</li>
  <li>Editar Configuracion</li>
  <li>etc.</li>
</ul>

<br><br>
<a href=logout.php>Cerrar Sesion X </a>
</body>
</html>

 

Código para verificar y expirar la sesión cuando esta llegue al tiempo establecido.

El bloque de código de la linea 1 a la 23, es el código que va en cada una de las paginas que solamente pueden ver o editar los usuarios registrados.

Por ejemplo: Si creaste una pagina PHP donde los usuarios puedan editar su perfil,  tienes que colocar ese bloque de código al principio de la pagina y antes de cualquier otro código PHP.

Sin este código cualquier usuario podría tener acceso a las paginas con acceso restringido.

 

Código para cerrar la sesión

logout.php

<?php

session_start();
unset ($SESSION['username']);
session_destroy();

header('Location: http://localhost:8079/phpLogin/login.html');

?>

 

Espero les sea de utilidad. Gracias por leer y compartir!

Que sean bendecidos!

18 Respuestas

  1. Buenisimo trabajo para el mundo gracias

  2. EXCELENTE LO FELICITO POR TAN BUEN TRABAJO. SALUDOS

  3. al aplicar el código redactado por usted y aplicarlo a mi proyecto me aparece un error en la linea 27 de checklogin.php haciendo una condición de comparación “if ($result->num_rows === 1)”, por favor resuelva me la duda

    • velozity

      Hola gracias por tus comentarios. Tienes razón hay un error del cual no me había percatado.

      • En la linea 27 cambia num_rows === 1 por num_rows > 0
      • Añade debajo de: $row = $result->fetch_array(MYSQLI_ASSOC); una llave de cierre (})
      • Y elimina la llave de cierre (}) que esta antes de: mysqli_close($conexion);

      Se supone que ahora te debe funcionar. Gracias!

      Te debe quedar algo asi…

      Screen Shoot Codigo Login Creacion de sesiones con PHP MySQL

  4. Mil gracias el mejor tutorial que encontré para hacer esto, Dios te bendiga!

    • velozity

      Muchas Gracias a ti! No sabes la alegría que me da saber eso. 🙂

  5. Gracias por tu aporte !!

    • velozity

      De nada, es un honor.

  6. Con que BD lo estas manejando seria muy bueno que pusieras la creación de ella, Saludos y gracias de antemano

    • velozity

      Hola y gracias por tus comentarios. Para no hacer el post muy complicado y largo la base de datos la cree previamente con PHPMyAdmin. No la hice con un script de PHP.

  7. Gracias por el aporte

  8. es la explicacion mas clara que he encontrado… gracias!!!!!!!!!!

  9. Nice!!! Gracias por el aporte…

  10. neo

    Será “su sesión Ha terminado’.

  11. Gracias, eso fue una gran ayuda, se te agradece amigo.

  12. Hola gracias por tomarte el tiempo de explicar estos pasos, mira segui tus consejo todo bien al momento pero quiero saber sobre el archivo “checklogin.php” como puede ubicar que en vez de que me imprima el usuario logueado me redirija a una pagina nueva en donde puede mostrar estos datos de session

  13. buenisimo…gacias por compartirlo…

  14. oyes despues qu la paginas ya estan bloqueadas. como le hago para desbloquearlas…. utilize tu codigo de restriccion de paginas . como le hago para despues de loguearme poder verlas

Agregar comentario