En este artículo aprenderás cómo crear un sistema de login y registro usando PHP y MySQL, explicado línea por línea. Ideal para principiantes que quieren entender cómo funciona el backend de un sistema de autenticación.
1. Crear la base de datos
Primero, crea una base de datos llamada login_db
y dentro de ella la tabla users
.
CREATE TABLE users (
id INT AUTO_INCREMENT PRIMARY KEY,
username VARCHAR(50) NOT NULL UNIQUE,
email VARCHAR(100) NOT NULL UNIQUE,
password VARCHAR(255) NOT NULL,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
- username: Será el nombre que el usuario use para iniciar sesión
- email: También se podrá usar para iniciar sesión
- password: Se guarda encriptada con
password_hash()
- created_at: Guarda la fecha de creación automáticamente
2. Conexión a la base de datos (db.php)
<?php
$host = "localhost";
$user = "root";
$pass = "";
$dbname = "login_db";
$conn = new mysqli($host, $user, $pass, $dbname);
if ($conn->connect_error) {
die("Conexión fallida: " . $conn->connect_error);
}
?>
- $conn: Guarda el objeto de conexión
- new mysqli: Función de PHP para conectar a MySQL
- die: Detiene la ejecución si hay error
3. Formulario de registro (register.html)
<form action="register.php" method="POST">
Nombre de usuario: <input type=text name=username required><br>
Correo electrónico: <input type=email name=email required><br>
Contraseña: <input type=password name=password required><br>
Confirmar contraseña: <input type=password name=confirm_password required><br>
<input type=submit value="Registrarse">
</form>
- required: Hace que el campo sea obligatorio
- method="POST": Envía los datos al archivo PHP para procesarlos
Te puede interesar Como crear un formulario de contacto con HTML y PHP paso a paso
4. Código del registro (register.php)
<?php
include 'db.php';
if ($_SERVER["REQUEST_METHOD"] == "POST") {
$username = trim($_POST["username"]);
$email = trim($_POST["email"]);
$password = $_POST["password"];
$confirm_password = $_POST["confirm_password"];
if (empty($username) || empty($email) || empty($password) || empty($confirm_password)) {
echo "Todos los campos son obligatorios.";
exit;
}
if (!filter_var($email, FILTER_VALIDATE_EMAIL)) {
echo "Correo no válido.";
exit;
}
if ($password !== $confirm_password) {
echo "Las contraseñas no coinciden.";
exit;
}
$check = $conn->prepare("SELECT id FROM users WHERE username = ? OR email = ?");
$check->bind_param("ss", $username, $email);
$check->execute();
$check->store_result();
if ($check->num_rows > 0) {
echo "El usuario o correo ya están registrados.";
exit;
}
$hashed_password = password_hash($password, PASSWORD_DEFAULT);
$insert = $conn->prepare("INSERT INTO users (username, email, password) VALUES (?, ?, ?)");
$insert->bind_param("sss", $username, $email, $hashed_password);
if ($insert->execute()) {
echo "Registro exitoso.";
} else {
echo "Error al registrar: " . $conn->error;
}
}
?>
- trim: Elimina espacios al inicio y final
- password_hash: Encripta la contraseña
- prepare/bind_param: Protege contra inyecciones
5. Formulario de login (login.html)
<form action="login.php" method="POST">
Usuario o Email: <input type=text name=username_or_email required><br>
Contraseña: <input type=password name=password required><br>
<input type=submit value="Iniciar sesión">
</form>
6. Código del login (login.php)
<?php
include 'db.php';
if ($_SERVER["REQUEST_METHOD"] == "POST") {
$username_or_email = trim($_POST["username_or_email"]);
$password = $_POST["password"];
if (empty($username_or_email) || empty($password)) {
echo "Todos los campos son obligatorios.";
exit;
}
$stmt = $conn->prepare("SELECT id, username, password FROM users WHERE username = ? OR email = ?");
$stmt->bind_param("ss", $username_or_email, $username_or_email);
$stmt->execute();
$result = $stmt->get_result();
if ($result->num_rows === 1) {
$user = $result->fetch_assoc();
if (password_verify($password, $user["password"])) {
echo "Bienvenido, " . $user["username"];
} else {
echo "Contraseña incorrecta.";
}
} else {
echo "Usuario no encontrado.";
}
}
?>
- $result: Resultado de la consulta
- fetch_assoc: Obtiene los datos en array
- password_verify: Compara contraseñas
Y no tengo más que explicar. Gracias por leer
Ya tienes un sistema funcional de login y registro en PHP con validaciones básicas, protección contra SQL Injection y encriptación de contraseñas.
Opcionalmente, puedes mejorar este sistema agregando:
session_start()
para mantener sesiones iniciadasheader("Location: perfil.php")
para redirigir después del login- Un archivo
logout.php
para cerrar sesión - Diseño visual con CSS o Bootstrap