Validar login de usuario

En este artículo explicaremos cómo validar el login de un usuario registrado en una base de datos MySQL y preparar su sesión con PHP. En artículos anteriores ya hemos visto cómo crear un formulario de login y cómo conectar PHP con una base de datos MySQL. Ahora llega el paso clave de todo el sistema: verificar si el usuario y la contraseña introducidos son correctos y, en ese caso, iniciar la sesión del usuario.

Este artículo forma parte de la serie Sistema de login con PHP, donde se explica paso a paso cómo construir un sistema completo de login de usuarios usando PHP y MySQL.

Validar usuario y crear sesión

El proceso de validar un login de usuario es fundamental, porque determina si alguien puede acceder a las secciones privadas de la web. A estas alturas asumimos que ya disponemos de los siguientes archivos explicados en artículos anteriores:

  • conexion.php: gestiona la conexión con la base de datos usando MySQLi procedural.
  • validar-login.php: el archivo donde validamos las credenciales del formulario de login.

El flujo del código para validar el login de un usuario es el siguiente:

  1. El usuario envía el formulario desde la web
  2. Los datos llegan por POST a validar-login.php.
  3. Comprobamos si el usuario existe en la base de datos.
  4. Si existe, verificamos la contraseña con password_verify().
  5. Si todo es correcto, creamos la sesión y redirigimos al área privada.
  6. Si no, mostramos un mensaje de error controlado.
<?php
session_start();
include("conexion.php"); // Datos de conexión -> $conn
include("validar-login.php"); // Datos validados del formulario -> $nombre, $email, $password

// Si llegamos aquí todo es correcto y buscamos el usuario por su email
$stmt = mysqli_prepare($conn, "SELECT id FROM usuarios WHERE email = ?");
mysqli_stmt_bind_param($stmt, "s", $email);
mysqli_stmt_execute($stmt);
$resultado = mysqli_stmt_get_result($stmt);

// Si el usuario existe
if (mysqli_num_rows($resultado) > 0) {
  $usuario = mysqli_fetch_assoc($resultado);

  // Verificamos la contraseña cifrada
  if (password_verify($password, $usuario['password'])) {
            
    // Creamos las variables de sesión
    $_SESSION['id'] = $usuario['id'];
    $_SESSION['nombre'] = $usuario['nombre'];
    $_SESSION['email'] = $usuario['email'];
    $_SESSION['nivel'] = $usuario['nivel'];

    // Redirigimos al área privada
    header("Location: perfil.php");
    exit;

  } else {
    echo "<p>Contraseña incorrecta</p>";
  }

} else {
  echo "<p>No existe ningún usuario con ese email</p>";
}

mysqli_stmt_close($stmt);
mysqli_close($conn);
?>

Explicación del código

Inicio de sesión e inclusión de archivos:

session_start();
include("conexion.php");
include("validar-login.php");

Preparamos PHP para iniciar sesiones e incluimos los archivos con la conexión a la base de datos y la validación del formulario. Este paso es muy importante al validar un login de usuario, ya que garantiza que disponemos de una conexión activa ($conn) y que los datos del formulario se han sanitizado de forma segura ($nombre, $email, $password) antes de ser utilizados en la base de datos.

Comprobación de usuario existente:

$stmt = mysqli_prepare($conn, "SELECT id FROM usuarios WHERE email = ?");
mysqli_stmt_bind_param($stmt, "s", $email);
mysqli_stmt_execute($stmt);
$resultado = mysqli_stmt_get_result($stmt);

Aquí se prepara una consulta segura para comprobar si ya existe un usuario registrado con el mismo email. Para ello, los placeholders (?) se reemplazan automáticamente con los valores reales de forma segura.
mysqli_stmt_bind_param() vincula las variables con los placeholders, define que son tipo string (s) e impide inyecciones SQL, aunque un atacante introduzca caracteres maliciosos. mysqli_stmt_execute() ejecuta la consulta y mysqli_stmt_get_result() obtiene las filas devueltas por la base de datos.

NOTA: A diferencia del artículo sobre registro de usuarios, aquí usamos mysqli_stmt_get_result() porque, además de saber el número de filas obtenidas, también queremos leer los datos del usuario.

Condicional: usuario existente

if (mysqli_num_rows($resultado) > 0) {
  $usuario = mysqli_fetch_assoc($resultado);

  // Verificamos la contraseña cifrada
  if (password_verify($password, $usuario['password'])) {
            
    // Creamos las variables de sesión
    $_SESSION['id'] = $usuario['id'];
    $_SESSION['nombre'] = $usuario['nombre'];
    $_SESSION['email'] = $usuario['email'];
    $_SESSION['nivel'] = $usuario['nivel'];

    // Redirigimos al área privada
    header("Location: perfil.php");
    exit;

  } else {
    echo "<p>Contraseña incorrecta</p>";
  }

} else {
  echo "<p>No existe ningún usuario con ese email</p>";
}

Si el usuario está registrado, comprobamos que la contraseña sea correcta con password_verify(). En caso afirmativo, procedemos a crear la sesión del usuario con los datos obtenidos de la base de datos. Estos datos identificarán al usuario en toda la web mientras dure la sesión. También redirigimos al usuario a su zona privada, donde podrá acceder a su perfil y configuración.

En caso de que no exista el usuario o la contraseña sea incorrecta, se muestra un mensaje de error y no se inicia la sesión.

Limpieza final:

mysqli_stmt_close($stmt);
mysqli_close($conn);

Finalmente, se cierran las sentencias y la conexión con la base de datos, liberando los recursos abiertos. Este paso, aunque simple, es importante para mantener un código limpio y eficiente.

Validar login de usuario

Validar un login de usuario no consiste solo en comprobar si un nombre y una contraseña coinciden, sino en hacerlo de forma segura y eficiente. Usar consultas preparadas con mysqli evita las inyecciones SQL y garantiza que los datos del formulario nunca se ejecuten directamente sobre la base de datos. Además, el uso de funciones como password_hash() y password_verify() añade una capa esencial de protección frente a ataques por fuerza bruta o filtraciones de contraseñas.

En este artículo hemos visto que validar un login de usuario requiere combinar varias técnicas y archivos. Comprender cómo funciona cada paso y aplicarlo correctamente es lo que convierte un sistema de autenticación en algo rápido, seguro y profesional. Saber cómo validar login de usuario con PHP y MySQL de manera adecuada es la base para construir cualquier sistema web moderno que gestione usuarios.

En el próximo artículo veremos cómo gestionar las sesiones y controlar los niveles de acceso, para que distintas partes de la web solo sean accesibles por ciertos tipos de usuarios (por ejemplo, admin o usuario estándar).

¡ Espero que este artículo sea de vuestro interés !

Deja un comentario