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
$isLoggedIn = isset($_SESSION['usuario']) && !empty($_SESSION['usuario']);
$username = $isLoggedIn ? $_SESSION['usuario'] : '';
$isLoggedIn = isset($_SESSION['idUsuario']) && !empty($_SESSION['idUsuario']);
$username = $isLoggedIn ? $_SESSION['nombreUsuario'] : '';
?>
<!-- Bootstrap 5 CSS -->
@@ -15,6 +15,7 @@ $username = $isLoggedIn ? $_SESSION['usuario'] : '';
<!-- Google Fonts para estilo Kahoot -->
<link href="https://fonts.googleapis.com/css2?family=Fredoka:wght@400;600;700&display=swap" rel="stylesheet">
<link rel="stylesheet" href="css/index.css">
<script src="js/jquery-4.0.0.min.js"></script>
<style>
@@ -89,7 +90,7 @@ $username = $isLoggedIn ? $_SESSION['usuario'] : '';
<label for="loginEmail">Correo electrónico</label>
</div>
<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>
</div>
<div class="form-check">
@@ -121,7 +122,7 @@ $username = $isLoggedIn ? $_SESSION['usuario'] : '';
<div class="modal-body">
<form id="formRegistro">
<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>
</div>
<div class="form-floating mb-3">
@@ -129,11 +130,11 @@ $username = $isLoggedIn ? $_SESSION['usuario'] : '';
<label for="regEmail">Correo electrónico</label>
</div>
<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>
</div>
<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>
</div>
<input type="hidden" name="orden" value="registrar">
@@ -146,4 +147,133 @@ $username = $isLoggedIn ? $_SESSION['usuario'] : '';
</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
require_once '../includes/conexionBD.php';
require_once $_SERVER['DOCUMENT_ROOT'] . '/triviagmatico/includes/conexionBD.php';
class Categoria{
+2 -1
View File
@@ -1,5 +1,6 @@
<?php
require_once '../includes/conexionBD.php';
require_once __DIR__ . '/../includes/conexionBD.php';
class Equipo{
+2 -1
View File
@@ -1,5 +1,6 @@
<?php
require_once '../includes/conexionBD.php';
require_once __DIR__ . '/../includes/conexionBD.php';
class EquipoxUsuario {
public $idEquipoxUsuario;
+2 -1
View File
@@ -1,5 +1,6 @@
<?php
require_once '../includes/conexionBD.php';
require_once __DIR__ . '/../includes/conexionBD.php';
class Pregunta {
private ?int $idPregunta;
+2 -1
View File
@@ -1,5 +1,6 @@
<?php
require_once '../includes/conexionBD.php';
require_once __DIR__ . '/../includes/conexionBD.php';
class Respuesta{
public $idRespuesta;
public $idPregunta;
+5 -8
View File
@@ -1,5 +1,5 @@
<?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
class RespuestaAlmacenada {
@@ -7,14 +7,12 @@ class RespuestaAlmacenada {
public $idPartidaxPregunta;
public $idUsuario;
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->idPartidaxPregunta = $idPartidaxPregunta;
$this->idUsuario = $idUsuario;
$this->idRespuesta = $idRespuesta;
$this->primero = $primero;
}
/**
@@ -25,14 +23,13 @@ class RespuestaAlmacenada {
if (is_array($conexion)) return $conexion;
try {
$sql = "INSERT INTO respuestaalmacenada (idPartidaxPregunta, idUsuario, idRespuesta, primero)
VALUES (:idPartidaxPregunta, :idUsuario, :idRespuesta, :primero)";
$sql = "INSERT INTO respuestaalmacenada (idPartidaxPregunta, idUsuario, idRespuesta)
VALUES (:idPartidaxPregunta, :idUsuario, :idRespuesta)";
$consulta = $conexion->prepare($sql);
$consulta->bindParam(':idPartidaxPregunta', $this->idPartidaxPregunta);
$consulta->bindParam(':idUsuario', $this->idUsuario);
$consulta->bindParam(':idRespuesta', $this->idRespuesta);
$consulta->bindParam(':primero', $this->primero, PDO::PARAM_INT);
$consulta->execute();
return [
@@ -76,4 +73,4 @@ class RespuestaAlmacenada {
];
}
}
}
}
+76 -2
View File
@@ -1,5 +1,5 @@
<?php
require_once '../includes/conexionBD.php';
require_once __DIR__ . '/../includes/conexionBD.php';
class Usuario {
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();
require_once '../clases/Usuario.php';
require_once '../clases/ClaseUsuario.php';
switch ($_POST['orden']) {
@@ -54,10 +54,6 @@ switch ($_POST['orden']) {
if ($resultado instanceof Usuario) {
$_SESSION['idUsuario'] = $resultado->getIdUsuario();
$_SESSION['email'] = $resultado->getEmail();
$_SESSION['nombreUsuario'] = $resultado->getNombreUsuario();
echo json_encode([
'exito' => 'Login correcto',
'idUsuario' => $resultado->getIdUsuario(),
@@ -74,6 +70,7 @@ switch ($_POST['orden']) {
break;
case 'cerrarSesion':
session_destroy();
@@ -83,4 +80,5 @@ switch ($_POST['orden']) {
]);
break;
}
}
-7
View File
@@ -1,11 +1,4 @@
<?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';
?>
+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`
--
CREATE TABLE `preguntas` (
CREATE TABLE `pregunta` (
`idPregunta` int NOT NULL,
`idDificultad` 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;
--
-- 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?'),
(2141, 1, 5, '¿Cuál es la capital de Francia?'),
(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`
--
ALTER TABLE `preguntas`
ALTER TABLE `pregunta`
ADD PRIMARY KEY (`idPregunta`),
ADD KEY `idDificultad` (`idDificultad`),
ADD KEY `idCategoria` (`idCategoria`);
--
@@ -454,7 +452,7 @@ ALTER TABLE `preguntas`
--
-- AUTO_INCREMENT for table `preguntas`
--
ALTER TABLE `preguntas`
ALTER TABLE `pregunta`
MODIFY `idPregunta` int NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=2535;
--
@@ -464,9 +462,8 @@ ALTER TABLE `preguntas`
--
-- Constraints for table `preguntas`
--
ALTER TABLE `preguntas`
ADD CONSTRAINT `preguntas_ibfk_1` FOREIGN KEY (`idDificultad`) REFERENCES `dificultades` (`idDificultad`),
ADD CONSTRAINT `preguntas_ibfk_2` FOREIGN KEY (`idCategoria`) REFERENCES `categorias` (`idCategoria`);
ALTER TABLE `pregunta`
ADD CONSTRAINT `preguntas_ibfk_2` FOREIGN KEY (`idCategoria`) REFERENCES `categoria` (`idCategoria`);
COMMIT;
/*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */;
File diff suppressed because it is too large Load Diff