Merge para login y registro

This commit is contained in:
2026-09-25 09:43:12 +02:00
14 changed files with 1898 additions and 45 deletions
+137 -7
View File
@@ -4,8 +4,8 @@ if (session_status() === PHP_SESSION_NONE) {
} }
// Comprobación de sesión // Comprobación de sesión
$isLoggedIn = isset($_SESSION['usuario']) && !empty($_SESSION['usuario']); $isLoggedIn = isset($_SESSION['idUsuario']) && !empty($_SESSION['idUsuario']);
$username = $isLoggedIn ? $_SESSION['usuario'] : ''; $username = $isLoggedIn ? $_SESSION['nombreUsuario'] : '';
?> ?>
<!-- Bootstrap 5 CSS --> <!-- Bootstrap 5 CSS -->
@@ -15,6 +15,7 @@ $username = $isLoggedIn ? $_SESSION['usuario'] : '';
<!-- Google Fonts para estilo Kahoot --> <!-- Google Fonts para estilo Kahoot -->
<link href="https://fonts.googleapis.com/css2?family=Fredoka:wght@400;600;700&display=swap" rel="stylesheet"> <link href="https://fonts.googleapis.com/css2?family=Fredoka:wght@400;600;700&display=swap" rel="stylesheet">
<link rel="stylesheet" href="css/index.css"> <link rel="stylesheet" href="css/index.css">
<script src="js/jquery-4.0.0.min.js"></script>
<style> <style>
@@ -89,7 +90,7 @@ $username = $isLoggedIn ? $_SESSION['usuario'] : '';
<label for="loginEmail">Correo electrónico</label> <label for="loginEmail">Correo electrónico</label>
</div> </div>
<div class="form-floating mb-3"> <div class="form-floating mb-3">
<input type="password" class="form-control border-dark" id="loginPassword" name="password" placeholder="Contraseña" required> <input type="password" class="form-control border-dark" id="loginPassword" name="contrasena" placeholder="Contraseña" required>
<label for="loginPassword">Contraseña</label> <label for="loginPassword">Contraseña</label>
</div> </div>
<div class="form-check"> <div class="form-check">
@@ -121,7 +122,7 @@ $username = $isLoggedIn ? $_SESSION['usuario'] : '';
<div class="modal-body"> <div class="modal-body">
<form id="formRegistro"> <form id="formRegistro">
<div class="form-floating mb-3"> <div class="form-floating mb-3">
<input type="text" class="form-control border-dark" id="regNombre" name="nombre" placeholder="Nombre" required> <input type="text" class="form-control border-dark" id="regNombre" name="nombreUsuario" placeholder="Nombre" required>
<label for="regNombre">Nombre</label> <label for="regNombre">Nombre</label>
</div> </div>
<div class="form-floating mb-3"> <div class="form-floating mb-3">
@@ -129,11 +130,11 @@ $username = $isLoggedIn ? $_SESSION['usuario'] : '';
<label for="regEmail">Correo electrónico</label> <label for="regEmail">Correo electrónico</label>
</div> </div>
<div class="form-floating mb-3"> <div class="form-floating mb-3">
<input type="password" class="form-control border-dark" id="regPassword" name="password" placeholder="Contraseña" required> <input type="password" class="form-control border-dark" id="regPassword" name="contrasena" placeholder="Contraseña" required>
<label for="regPassword">Contraseña</label> <label for="regPassword">Contraseña</label>
</div> </div>
<div class="form-floating mb-3"> <div class="form-floating mb-3">
<input type="password" class="form-control border-dark" id="regPasswordConfirm" name="passwordConfirm" placeholder="Confirmar contraseña" required> <input type="password" class="form-control border-dark" id="regPasswordConfirm" name="contrasenaConfirm" placeholder="Confirmar contraseña" required>
<label for="regPasswordConfirm">Confirmar contraseña</label> <label for="regPasswordConfirm">Confirmar contraseña</label>
</div> </div>
<input type="hidden" name="orden" value="registrar"> <input type="hidden" name="orden" value="registrar">
@@ -146,4 +147,133 @@ $username = $isLoggedIn ? $_SESSION['usuario'] : '';
</div> </div>
</div> </div>
</div> </div>
</div> </div>
<script>
// Registro
$('#botonAceptarRegistro').click(function(event){
event.preventDefault();
console.log('hola');
let nombreUsuario = $('#regNombre').val().trim();
let email = $('#regEmail').val().trim();
let contrasena = $('#regPassword').val();
let contrasenaConfirmacion = $('#regPasswordConfirm').val();
// Limpiamos errores anteriores
$('#regNombre').removeClass('is-invalid');
$('#regEmail').removeClass('is-invalid');
$('#regPassword').removeClass('is-invalid');
$('#regPasswordConfirm').removeClass('is-invalid');
$('#errorRegistro').text('');
// Comprobamos que las contraseñas coincidan
if(contrasena !== contrasenaConfirmacion){
$('#regPassword').addClass('is-invalid');
$('#regPasswordConfirm').addClass('is-invalid');
$('#errorRegistro').text('Las contraseñas no coinciden.');
return;
}
$.ajax({
method: "POST",
url: "controladores/controladorUsuario.php",
data: {
'nombreUsuario': nombreUsuario,
'email': email,
'contrasena': contrasena,
'orden': 'registrarUsuario'
}
}).done(function(respuesta){
console.log(respuesta);
respuesta = JSON.parse(respuesta);
if(respuesta.error){
$('#errorRegistro').text(respuesta.error);
// Marcamos los campos si hay error
$('#regNombre').addClass('is-invalid');
$('#regEmail').addClass('is-invalid');
}else{
// Registro correcto
$('#errorRegistro')
.removeClass('text-danger')
.addClass('text-success')
.text(respuesta.exito);
// Limpiamos formulario
$('#formRegistro')[0].reset();
// Cerramos modal después de un segundo
setTimeout(function(){
location.reload();
}, 1000);
}
}); // Fin función ajax
});
// Login
$('#botonAceptarLogin').click(function(event){
event.preventDefault();
let email = $('#loginEmail').val().trim();
let contrasena = $('#loginPassword').val();
// Limpiamos errores anteriores
$('#loginEmail').removeClass('is-invalid');
$('#loginPassword').removeClass('is-invalid');
$('#errorLogin').text('');
// Comprobación básica
if(email === '' || contrasena === ''){
$('#errorLogin').text('Todos los campos son obligatorios.');
if(email === ''){
$('#loginEmail').addClass('is-invalid');
}
if(contrasena === ''){
$('#loginPassword').addClass('is-invalid');
}
return;
}
$.ajax({
method: "POST",
url: "controladores/controladorUsuario.php",
data: {
'email': email,
'contrasena': contrasena,
'orden': 'comprobarUsuario'
}
}).done(function(respuesta){
console.log(respuesta);
respuesta = JSON.parse(respuesta);
if(respuesta.error){
$('#loginEmail').addClass('is-invalid');
$('#loginPassword').addClass('is-invalid');
$('#errorLogin').text(respuesta.error);
}else{
location.reload();
}
}); // Fin función ajax
});
</script>
+2 -1
View File
@@ -1,5 +1,6 @@
<?php <?php
require_once '../includes/conexionBD.php'; require_once $_SERVER['DOCUMENT_ROOT'] . '/triviagmatico/includes/conexionBD.php';
class Categoria{ class Categoria{
+2 -1
View File
@@ -1,5 +1,6 @@
<?php <?php
require_once '../includes/conexionBD.php'; require_once __DIR__ . '/../includes/conexionBD.php';
class Equipo{ class Equipo{
+2 -1
View File
@@ -1,5 +1,6 @@
<?php <?php
require_once '../includes/conexionBD.php'; require_once __DIR__ . '/../includes/conexionBD.php';
class EquipoxUsuario { class EquipoxUsuario {
public $idEquipoxUsuario; public $idEquipoxUsuario;
+2 -1
View File
@@ -1,5 +1,6 @@
<?php <?php
require_once '../includes/conexionBD.php'; require_once __DIR__ . '/../includes/conexionBD.php';
class Pregunta { class Pregunta {
private ?int $idPregunta; private ?int $idPregunta;
+2 -1
View File
@@ -1,5 +1,6 @@
<?php <?php
require_once '../includes/conexionBD.php'; require_once __DIR__ . '/../includes/conexionBD.php';
class Respuesta{ class Respuesta{
public $idRespuesta; public $idRespuesta;
public $idPregunta; public $idPregunta;
+5 -8
View File
@@ -1,5 +1,5 @@
<?php <?php
require_once '../includes/conexionBD.php'; require_once __DIR__ . '/../includes/conexionBD.php';
// Clase encargada de registrar las respuestas de los jugadores en tiempo real durante la partida // Clase encargada de registrar las respuestas de los jugadores en tiempo real durante la partida
class RespuestaAlmacenada { class RespuestaAlmacenada {
@@ -7,14 +7,12 @@ class RespuestaAlmacenada {
public $idPartidaxPregunta; public $idPartidaxPregunta;
public $idUsuario; public $idUsuario;
public $idRespuesta; public $idRespuesta;
public $primero; // Indica con 1 o 0 si fue el más rápido en responder correctamente
public function __construct($idRespuestaAlmacenada = null, $idPartidaxPregunta = null, $idUsuario = null, $idRespuesta = null, $primero = 0) { public function __construct($idRespuestaAlmacenada = null, $idPartidaxPregunta = null, $idUsuario = null, $idRespuesta = null) {
$this->idRespuestaAlmacenada = $idRespuestaAlmacenada; $this->idRespuestaAlmacenada = $idRespuestaAlmacenada;
$this->idPartidaxPregunta = $idPartidaxPregunta; $this->idPartidaxPregunta = $idPartidaxPregunta;
$this->idUsuario = $idUsuario; $this->idUsuario = $idUsuario;
$this->idRespuesta = $idRespuesta; $this->idRespuesta = $idRespuesta;
$this->primero = $primero;
} }
/** /**
@@ -25,14 +23,13 @@ class RespuestaAlmacenada {
if (is_array($conexion)) return $conexion; if (is_array($conexion)) return $conexion;
try { try {
$sql = "INSERT INTO respuestaalmacenada (idPartidaxPregunta, idUsuario, idRespuesta, primero) $sql = "INSERT INTO respuestaalmacenada (idPartidaxPregunta, idUsuario, idRespuesta)
VALUES (:idPartidaxPregunta, :idUsuario, :idRespuesta, :primero)"; VALUES (:idPartidaxPregunta, :idUsuario, :idRespuesta)";
$consulta = $conexion->prepare($sql); $consulta = $conexion->prepare($sql);
$consulta->bindParam(':idPartidaxPregunta', $this->idPartidaxPregunta); $consulta->bindParam(':idPartidaxPregunta', $this->idPartidaxPregunta);
$consulta->bindParam(':idUsuario', $this->idUsuario); $consulta->bindParam(':idUsuario', $this->idUsuario);
$consulta->bindParam(':idRespuesta', $this->idRespuesta); $consulta->bindParam(':idRespuesta', $this->idRespuesta);
$consulta->bindParam(':primero', $this->primero, PDO::PARAM_INT);
$consulta->execute(); $consulta->execute();
return [ return [
@@ -76,4 +73,4 @@ class RespuestaAlmacenada {
]; ];
} }
} }
} }
+76 -2
View File
@@ -1,5 +1,5 @@
<?php <?php
require_once '../includes/conexionBD.php'; require_once __DIR__ . '/../includes/conexionBD.php';
class Usuario { class Usuario {
private ?int $idUsuario; private ?int $idUsuario;
@@ -139,4 +139,78 @@ class Usuario {
]; ];
} }
} }
}
public static function buscarPorEmail($email) {
$conexion = conexionBD();
if (is_array($conexion)) {
return $conexion;
}
try {
$sql = "SELECT * FROM usuario WHERE email = :email";
$stmt = $conexion->prepare($sql);
$stmt->execute([':email' => $email]);
$datos = $stmt->fetch(PDO::FETCH_ASSOC);
if ($datos) {
return new Usuario(
$datos['nombreUsuario'],
$datos['contrasena'],
$datos['email'],
$datos['avatar'],
$datos['cookie'],
(int)$datos['aciertos'],
(int)$datos['victorias'],
(int)$datos['derrotas'],
(int)$datos['idUsuario']
);
}
return null; // No existe usuario con ese email
} catch (PDOException $error) {
return [
'error' => 'Ocurrió un error al buscar el usuario por email.',
'error_tecnico' => $error->getMessage()
];
}
}
public static function login($email, $contrasena)
{
$usuario = self::buscarPorEmail($email);
// El usuario no existe
if (!($usuario instanceof Usuario)) {
// Limpiamos posibles datos de sesión anteriores
unset($_SESSION['idUsuario']);
unset($_SESSION['email']);
unset($_SESSION['nombreUsuario']);
return null;
}
// Comprobamos la contraseña
if (password_verify($contrasena, $usuario->getContrasena())) {
// Usuario validado correctamente
$_SESSION['idUsuario'] = $usuario->getIdUsuario();
$_SESSION['email'] = $usuario->getEmail();
$_SESSION['nombreUsuario'] = $usuario->getNombreUsuario();
// Devolvemos el usuario como hasta ahora
return $usuario;
}
// Contraseña incorrecta
unset($_SESSION['idUsuario']);
unset($_SESSION['email']);
unset($_SESSION['nombreUsuario']);
return null;
}
}
@@ -2,7 +2,7 @@
session_start(); session_start();
require_once '../clases/Usuario.php'; require_once '../clases/ClaseUsuario.php';
switch ($_POST['orden']) { switch ($_POST['orden']) {
@@ -54,10 +54,6 @@ switch ($_POST['orden']) {
if ($resultado instanceof Usuario) { if ($resultado instanceof Usuario) {
$_SESSION['idUsuario'] = $resultado->getIdUsuario();
$_SESSION['email'] = $resultado->getEmail();
$_SESSION['nombreUsuario'] = $resultado->getNombreUsuario();
echo json_encode([ echo json_encode([
'exito' => 'Login correcto', 'exito' => 'Login correcto',
'idUsuario' => $resultado->getIdUsuario(), 'idUsuario' => $resultado->getIdUsuario(),
@@ -74,6 +70,7 @@ switch ($_POST['orden']) {
break; break;
case 'cerrarSesion': case 'cerrarSesion':
session_destroy(); session_destroy();
@@ -83,4 +80,5 @@ switch ($_POST['orden']) {
]); ]);
break; break;
}
}
-7
View File
@@ -1,11 +1,4 @@
<?php <?php
session_start();
// Usuario logueado (CAMBIAR A NULL PARA CERRAR SESIÓN)
$_SESSION['usuario'] = "Alexis";
$isLoggedIn = isset($_SESSION['usuario']);
$username = $isLoggedIn ? $_SESSION['usuario'] : '';
include 'cabecera.php'; include 'cabecera.php';
?> ?>
+2
View File
File diff suppressed because one or more lines are too long
+7 -10
View File
@@ -27,18 +27,17 @@ SET time_zone = "+00:00";
-- Table structure for table `preguntas` -- Table structure for table `preguntas`
-- --
CREATE TABLE `preguntas` ( CREATE TABLE `pregunta` (
`idPregunta` int NOT NULL, `idPregunta` int NOT NULL,
`idDificultad` int DEFAULT NULL,
`idCategoria` int DEFAULT NULL, `idCategoria` int DEFAULT NULL,
`pregunta` varchar(200) DEFAULT NULL `nombrePregunta` varchar(255) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci; ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;
-- --
-- Dumping data for table `preguntas` -- Dumping data for table `preguntas`
-- --
INSERT INTO `preguntas` (`idPregunta`, `idDificultad`, `idCategoria`, `pregunta`) VALUES INSERT INTO `pregunta` (`idPregunta`, `idCategoria`, `nombrePregunta`) VALUES
(2140, 1, 4, '¿En qué año llegó Cristóbal Colón a América?'), (2140, 1, 4, '¿En qué año llegó Cristóbal Colón a América?'),
(2141, 1, 5, '¿Cuál es la capital de Francia?'), (2141, 1, 5, '¿Cuál es la capital de Francia?'),
(2142, 1, 6, '¿Qué planeta es conocido como el planeta rojo?'), (2142, 1, 6, '¿Qué planeta es conocido como el planeta rojo?'),
@@ -442,9 +441,8 @@ INSERT INTO `preguntas` (`idPregunta`, `idDificultad`, `idCategoria`, `pregunta`
-- --
-- Indexes for table `preguntas` -- Indexes for table `preguntas`
-- --
ALTER TABLE `preguntas` ALTER TABLE `pregunta`
ADD PRIMARY KEY (`idPregunta`), ADD PRIMARY KEY (`idPregunta`),
ADD KEY `idDificultad` (`idDificultad`),
ADD KEY `idCategoria` (`idCategoria`); ADD KEY `idCategoria` (`idCategoria`);
-- --
@@ -454,7 +452,7 @@ ALTER TABLE `preguntas`
-- --
-- AUTO_INCREMENT for table `preguntas` -- AUTO_INCREMENT for table `preguntas`
-- --
ALTER TABLE `preguntas` ALTER TABLE `pregunta`
MODIFY `idPregunta` int NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=2535; MODIFY `idPregunta` int NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=2535;
-- --
@@ -464,9 +462,8 @@ ALTER TABLE `preguntas`
-- --
-- Constraints for table `preguntas` -- Constraints for table `preguntas`
-- --
ALTER TABLE `preguntas` ALTER TABLE `pregunta`
ADD CONSTRAINT `preguntas_ibfk_1` FOREIGN KEY (`idDificultad`) REFERENCES `dificultades` (`idDificultad`), ADD CONSTRAINT `preguntas_ibfk_2` FOREIGN KEY (`idCategoria`) REFERENCES `categoria` (`idCategoria`);
ADD CONSTRAINT `preguntas_ibfk_2` FOREIGN KEY (`idCategoria`) REFERENCES `categorias` (`idCategoria`);
COMMIT; COMMIT;
/*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */; /*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */;
File diff suppressed because it is too large Load Diff