17 Commits

Author SHA1 Message Date
Isaac ab26f5fa9a Merge para login y registro 2026-09-25 09:43:12 +02:00
Isaac 5c1fa24ebf Merge branch 'main' of https://git.desarrolloalcala.com/jorge/triviagmatico 2026-09-25 09:41:34 +02:00
Isaac 35611746a6 Login y registro funcionales 2026-09-25 09:41:29 +02:00
v.rodriguezcamacho 9515a1e923 Merge branch 'main' of https://git.desarrolloalcala.com/jorge/triviagmatico 2026-09-25 09:29:00 +02:00
v.rodriguezcamacho 3ed1a747f7 add respuestas.sql to mysqulito 2026-09-25 09:28:51 +02:00
dbvictor2002 c95bc19155 Actualizar includes/conexionBD.php 2026-09-25 09:21:44 +02:00
dbvictor2002 b96a18b88b Actualizar includes/ConexionBD.php 2026-09-25 09:13:34 +02:00
dbvictor2002 c8f2f86364 Actualizar controladores/ControladorUsuario.php 2026-09-25 09:12:42 +02:00
dbvictor2002 5eccd108ef Actualizar controladores/ControladorEquipoxUsuario.php 2026-09-25 09:12:30 +02:00
v.rodriguezcamacho 6a72c7cafe Merge branch 'main' of https://git.desarrolloalcala.com/jorge/triviagmatico 2026-09-25 09:05:59 +02:00
dbvictor2002 8c5684aedc Actualizar controladores/controladorUsuario.php 2026-09-25 09:00:39 +02:00
v.rodriguezcamacho 8646f18782 Hecho merge de backend a main de claseUsuario y controladorUsuario 2026-09-25 08:58:53 +02:00
dbvictor2002 9fc1f6be24 Subir archivos a "clases" 2026-09-25 08:53:56 +02:00
margarita 0caa264961 actualizar ClaseUsuario y controladorUsuario 2026-09-25 08:52:12 +02:00
dbvictor2002 3d5aff18f4 Subir archivos a "clases" 2026-09-25 08:49:49 +02:00
dbvictor2002 17f3058ec7 Subir archivos a "clases" 2026-09-25 08:49:35 +02:00
dbvictor2002 08131b46e4 Subir archivos a "mysqulito" 2026-09-25 08:47:37 +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