From d28fbc7160479309cee03405be9aaf24217cf38c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?V=C3=ADctor?= Date: Tue, 29 Sep 2026 10:13:25 +0200 Subject: [PATCH] Mofificar base de datos y clase Partida --- clases/ClasePartida.php | 326 +++++++++++++------------- mysqulito/triviagmagicoDEFINITIVO.sql | 3 + 2 files changed, 163 insertions(+), 166 deletions(-) diff --git a/clases/ClasePartida.php b/clases/ClasePartida.php index b765afe..57f1df0 100644 --- a/clases/ClasePartida.php +++ b/clases/ClasePartida.php @@ -7,17 +7,27 @@ class Partida public $idPartida; public $nombrePartida; public $idUsuario; + public $fechaCreacion; + public $fechaInicio; + public $fechaFin; public function __construct( $idPartida = null, $nombrePartida = null, - $idUsuario = null + $idUsuario = null, + $fechaCreacion = null, + $fechaInicio = null, + $fechaFin = null ) { $this->idPartida = $idPartida; $this->nombrePartida = $nombrePartida; $this->idUsuario = $idUsuario; + $this->fechaCreacion = $fechaCreacion; + $this->fechaInicio = $fechaInicio; + $this->fechaFin = $fechaFin; } + public function insertar() { $conexion = conexionBD(); @@ -25,12 +35,7 @@ class Partida return $conexion; } try { - $consulta = $conexion->prepare(" - INSERT INTO partida - (nombrePartida,idUsuario) - VALUES - (:nombrePartida,:idUsuario) - "); + $consulta = $conexion->prepare("INSERT INTO partida (nombrePartida,idUsuario) VALUES (:nombrePartida,:idUsuario)"); $consulta->bindParam(":nombrePartida", $this->nombrePartida); $consulta->bindParam(":idUsuario", $this->idUsuario); $consulta->execute(); @@ -46,8 +51,7 @@ class Partida } } - public function listar() - { + public function listar(){ $conexion = conexionBD(); if (is_array($conexion)) { return $conexion; @@ -64,18 +68,13 @@ class Partida } } - public function buscar() - { + public function buscar(){ $conexion = conexionBD(); if (is_array($conexion)) { return $conexion; } try { - $consulta = $conexion->prepare(" - SELECT * - FROM partida - WHERE idPartida=:idPartida - "); + $consulta = $conexion->prepare("SELECT * FROM partida WHERE idPartida=:idPartida"); $consulta->bindParam(":idPartida", $this->idPartida); $consulta->execute(); return $consulta->fetch(PDO::FETCH_ASSOC); @@ -87,20 +86,14 @@ class Partida } } - public function editar() - { + + public function editar(){ $conexion = conexionBD(); if (is_array($conexion)) { return $conexion; } try { - $consulta = $conexion->prepare(" - UPDATE partida - SET - nombrePartida=:nombrePartida, - idUsuario=:idUsuario - WHERE idPartida=:idPartida - "); + $consulta = $conexion->prepare("UPDATE partida SET nombrePartida=:nombrePartida, idUsuario=:idUsuario WHERE idPartida=:idPartida"); $consulta->bindParam(":idPartida", $this->idPartida); $consulta->bindParam(":nombrePartida", $this->nombrePartida); $consulta->bindParam(":idUsuario", $this->idUsuario); @@ -117,17 +110,13 @@ class Partida } } - public function eliminar() - { + public function eliminar(){ $conexion = conexionBD(); if (is_array($conexion)) { return $conexion; } try { - $consulta = $conexion->prepare(" - DELETE FROM partida - WHERE idPartida=:idPartida - "); + $consulta = $conexion->prepare("DELETE FROM partida WHERE idPartida=:idPartida"); $consulta->bindParam(":idPartida", $this->idPartida); $consulta->execute(); return [ @@ -142,27 +131,121 @@ class Partida } } - /** - * Devuelve las preguntas asignadas a la partida, junto con el - * idPartidaxPregunta (necesario para guardar respuestas después). - */ - public function getPreguntas() - { + + public function iniciarPartida(){ + $conexion = conexionBD(); + if (is_array($conexion)){ + return $conexion; + } + try { + $consulta = $conexion->prepare("UPDATE partida SET fechaInicio=NOW() WHERE idPartida=:idPartida AND fechaInicio IS NULL"); + $consulta->bindParam(":idPartida", $this->idPartida); + $consulta->execute(); + return [ + "exito" => "La partida ha comenzado.", + "exito_tecnico" => $this->idPartida + ]; + } catch (PDOException $error) { + return [ + "error" => "Ocurrió un error al iniciar la partida.", + 'error_tecnico' => $error->getMessage() + ]; + } + } + + + public function finalizar(){ $conexion = conexionBD(); if (is_array($conexion)) { return $conexion; } try { - $consulta = $conexion->prepare(" - SELECT - pxp.idPartidaxPregunta, - p.* - FROM partidaxpregunta pxp - INNER JOIN pregunta p - ON pxp.idPregunta=p.idPregunta - WHERE pxp.idPartida=:idPartida - ORDER BY pxp.idPartidaxPregunta - "); + $consulta = $conexion->prepare("UPDATE partida SET fechaFin=NOW() WHERE idPartida=:idPartida AND fechaFin IS NULL"); + $consulta->bindParam(":idPartida", $this->idPartida); + $consulta->execute(); + return [ + "exito" => "La partida se finalizó correctamente.", + "exito_tecnico" => $this->idPartida + ]; + } catch (PDOException $error) { + return [ + "error" => "Ocurrió un error al finalizar la partida.", + 'error_tecnico' => $error->getMessage() + ]; + } + } + + + //true si la partida ya tiene fecha de fin (fechaFin no es NULL) + //Devuelve false si la partida no existe + + public function estaFinalizada() { + $datos = $this->buscar(); + if (is_array($datos) && isset($datos["error"])) { + return $datos; + } + if (!$datos) { + return false; + } + return $datos["fechaFin"] !== null; + } + + + //Devuelve la partida más reciente del usuario que aún no ha + //terminado (fechaFin NULL), o false si no tiene ninguna. + //Incluye también las salas que todavía no han empezado. + + public function partidaEnCursoDeUsuario(){ + $conexion = conexionBD(); + if (is_array($conexion)) { + return $conexion; + } + try { + $consulta = $conexion->prepare("SELECT * FROM partida WHERE idUsuario=:idUsuario AND fechaFin IS NULL ORDER BY idPartida DESC LIMIT 1"); + $consulta->bindParam(":idUsuario", $this->idUsuario); + $consulta->execute(); + return $consulta->fetch(PDO::FETCH_ASSOC); + } catch (PDOException $error) { + return [ + "error" => "Ocurrió un error al buscar la partida en curso.", + 'error_tecnico' => $error->getMessage() + ]; + } + } + + + public function listarSalasAbiertas() { + $conexion = conexionBD(); + if (is_array($conexion)) { + return $conexion; + } + try { + $consulta = $conexion->prepare("SELECT p.idPartida, p.nombrePartida, e.idEquipo, e.nombreEquipo, u.idUsuario, u.nombreUsuario + FROM partida p INNER JOIN equipoxpartida exp ON exp.idPartida=p.idPartida INNER JOIN equipo e ON e.idEquipo=exp.idEquipo + LEFT JOIN equipoxusuario exu ON exu.idEquipo=e.idEquipo LEFT JOIN usuario u ON u.idUsuario=exu.idUsuario WHERE p.fechaInicio IS NULL + AND p.fechaFin IS NULL ORDER BY p.idPartida DESC, e.idEquipo ASC"); + $consulta->execute(); + return $consulta->fetchAll(PDO::FETCH_ASSOC); + } catch (PDOException $error) { + return [ + "error" => "Ocurrió un error al recuperar las salas abiertas.", + 'error_tecnico' => $error->getMessage() + ]; + } + } + + /** + * Devuelve las preguntas asignadas a la partida, junto con el + * idPartidaxPregunta (necesario para guardar respuestas después). + */ + public function getPreguntas(){ + $conexion = conexionBD(); + if (is_array($conexion)) { + return $conexion; + } + try { + $consulta = $conexion->prepare("SELECT pxp.idPartidaxPregunta, p.* FROM partidaxpregunta pxp INNER JOIN pregunta p ON pxp.idPregunta=p.idPregunta + WHERE pxp.idPartida=:idPartida ORDER BY pxp.idPartidaxPregunta"); $consulta->bindParam(":idPartida", $this->idPartida); $consulta->execute(); return $consulta->fetchAll(PDO::FETCH_ASSOC); @@ -174,22 +257,14 @@ class Partida } } - /** - * Asocia una pregunta ya existente a esta partida. - */ - public function asignarPregunta($idPregunta) - { + + public function asignarPregunta($idPregunta) { $conexion = conexionBD(); if (is_array($conexion)) { return $conexion; } try { - $consulta = $conexion->prepare(" - INSERT INTO partidaxpregunta - (idPartida,idPregunta) - VALUES - (:idPartida,:idPregunta) - "); + $consulta = $conexion->prepare("INSERT INTO partidaxpregunta (idPartida,idPregunta) VALUES (:idPartida,:idPregunta)"); $consulta->bindParam(":idPartida", $this->idPartida); $consulta->bindParam(":idPregunta", $idPregunta); $consulta->execute(); @@ -205,18 +280,13 @@ class Partida } } //Cuenta cuántas preguntas tiene la partida en total. Es la primera mitad de la comprobación "¿ha terminado el usuario de jugar?". - public function contarPreguntasAsignadas() - { + public function contarPreguntasAsignadas() { $conexion = conexionBD(); if (is_array($conexion)) { return $conexion; } try { - $consulta = $conexion->prepare(" - SELECT COUNT(*) AS total - FROM partidaxpregunta - WHERE idPartida=:idPartida - "); + $consulta = $conexion->prepare("SELECT COUNT(*) AS total FROM partidaxpregunta WHERE idPartida=:idPartida"); $consulta->bindParam(":idPartida", $this->idPartida); $consulta->execute(); $fila = $consulta->fetch(PDO::FETCH_ASSOC); @@ -229,21 +299,14 @@ class Partida } } - public function contarRespuestasUsuario($idUsuario) - { + public function contarRespuestasUsuario($idUsuario){ $conexion = conexionBD(); if (is_array($conexion)) { return $conexion; } try { - $consulta = $conexion->prepare(" - SELECT COUNT(*) AS total - FROM respuestaalmacenada ra - INNER JOIN partidaxpregunta pxp - ON ra.idPartidaxPregunta=pxp.idPartidaxPregunta - WHERE pxp.idPartida=:idPartida - AND ra.idUsuario=:idUsuario - "); + $consulta = $conexion->prepare("SELECT COUNT(*) AS total FROM respuestaalmacenada ra INNER JOIN partidaxpregunta pxp + ON ra.idPartidaxPregunta=pxp.idPartidaxPregunta WHERE pxp.idPartida=:idPartida AND ra.idUsuario=:idUsuario"); $consulta->bindParam(":idPartida", $this->idPartida); $consulta->bindParam(":idUsuario", $idUsuario); $consulta->execute(); @@ -258,11 +321,11 @@ class Partida } /** - * Sustituye al antiguo campo `terminada`: compara cuántas preguntas - * tiene la partida contra cuántas ha respondido este usuario. + * Indica si ESTE usuario ya ha respondido todas las preguntas: + * compara cuántas preguntas tiene la partida contra cuántas ha + * respondido él. (La partida completa se marca con finalizar().) */ - public function estaFinalizadaParaUsuario($idUsuario) - { + public function estaFinalizadaParaUsuario($idUsuario){ $totalPreguntas = $this->contarPreguntasAsignadas(); if (is_array($totalPreguntas)) { return $totalPreguntas; @@ -277,19 +340,13 @@ class Partida /** * Partidas creadas por un usuario, de más reciente a más antigua. */ - public function listarDelUsuario() - { + public function listarDelUsuario(){ $conexion = conexionBD(); if (is_array($conexion)) { return $conexion; } try { - $consulta = $conexion->prepare(" - SELECT * - FROM partida - WHERE idUsuario=:idUsuario - ORDER BY idPartida DESC - "); + $consulta = $conexion->prepare("SELECT * FROM partida WHERE idUsuario=:idUsuario ORDER BY idPartida DESC"); $consulta->bindParam(":idUsuario", $this->idUsuario); $consulta->execute(); return $consulta->fetchAll(PDO::FETCH_ASSOC); @@ -301,22 +358,13 @@ class Partida } } - public function preguntaAsignada($idPregunta) - { + public function preguntaAsignada($idPregunta) { $conexion = conexionBD(); - if (is_array($conexion)) { return $conexion; } - try { - $consulta = $conexion->prepare(" - SELECT COUNT(*) AS total - FROM partidaxpregunta - WHERE idPartida=:idPartida - AND idPregunta=:idPregunta - "); - + $consulta = $conexion->prepare("SELECT COUNT(*) AS total FROM partidaxpregunta WHERE idPartida=:idPartida AND idPregunta=:idPregunta"); $consulta->bindParam(":idPartida", $this->idPartida); $consulta->bindParam(":idPregunta", $idPregunta); $consulta->execute(); @@ -336,24 +384,13 @@ class Partida * Vincula un equipo a esta partida en la tabla intermedia 'equipoxpartida'. * Permite registrar qué grupos están participando en este torneo. */ - public function registrarEquipoEnPartida($idEquipo) - { - $conexion = conexionBD(); // Obtenemos la conexión modular del proyecto - + public function registrarEquipoEnPartida($idEquipo){ + $conexion = conexionBD(); if (is_array($conexion)) { - return $conexion; // Si hay error en la conexión, lo devuelve + return $conexion; } - try { - // Preparamos la consulta para insertar la relación en la tabla intermedia real - $consulta = $conexion->prepare(" - INSERT INTO equipoxpartida - (idPartida, idEquipo) - VALUES - (:idPartida, :idEquipo) - "); - - // Vinculamos los parámetros con el objeto de la partida actual y el equipo recibido + $consulta = $conexion->prepare("INSERT INTO equipoxpartida (idPartida, idEquipo) VALUES (:idPartida, :idEquipo)"); $consulta->bindParam(":idPartida", $this->idPartida); $consulta->bindParam(":idEquipo", $idEquipo); $consulta->execute(); @@ -363,7 +400,6 @@ class Partida "exito_tecnico" => $conexion->lastInsertId() ]; } catch (PDOException $error) { - // Capturamos el error extrayendo solo el mensaje de texto limpio return [ "error" => "Ocurrió un error al asignar el equipo a la partida.", "error_tecnico" => $error->getMessage() @@ -375,28 +411,14 @@ class Partida * Obtiene todos los equipos que están compitiendo en esta partida. * Es útil para mostrar la lista de rivales antes de empezar a responder. */ - public function getEquiposParticipantes() - { + public function getEquiposParticipantes(){ $conexion = conexionBD(); - if (is_array($conexion)) { return $conexion; } - - try { - // Hacemos un INNER JOIN para traer los nombres de los equipos desde la tabla intermedia - $consulta = $conexion->prepare(" - SELECT - exp.idEquipoxPartida, - e.idEquipo, - e.nombreEquipo - FROM equipoxpartida exp - INNER JOIN equipo e - ON exp.idEquipo = e.idEquipo - WHERE exp.idPartida = :idPartida - ORDER BY e.nombreEquipo ASC - "); - + try { + $consulta = $conexion->prepare("SELECT exp.idEquipoxPartida, e.idEquipo, e.nombreEquipo FROM equipoxpartida exp + INNER JOIN equipo e ON exp.idEquipo = e.idEquipo WHERE exp.idPartida = :idPartida ORDER BY e.nombreEquipo ASC"); $consulta->bindParam(":idPartida", $this->idPartida); $consulta->execute(); @@ -413,57 +435,29 @@ class Partida * Obtiene todos los jugadores reales (Usuarios) que están jugando en esta partida. * Utiliza la tabla 'equipoxusuario' en SQL para cruzar los datos. */ - public function getJugadoresDeLaPartida() - { + public function getJugadoresDeLaPartida(){ $conexion = conexionBD(); - if (is_array($conexion)) { return $conexion; } - try { - - $consulta = $conexion->prepare(" - SELECT DISTINCT - u.idUsuario, - u.nombreUsuario, - u.email, - e.idEquipo, - e.nombreEquipo - FROM equipoxpartida exp - - INNER JOIN equipoxusuario exu - ON exp.idEquipo = exu.idEquipo - - INNER JOIN usuario u - ON exu.idUsuario = u.idUsuario - - INNER JOIN equipo e - ON exu.idEquipo = e.idEquipo - - WHERE exp.idPartida = :idPartida - - ORDER BY e.nombreEquipo ASC, - u.nombreUsuario ASC - "); - + $consulta = $conexion->prepare("SELECT DISTINCT u.idUsuario, u.nombreUsuario, u.email, e.idEquipo, e.nombreEquipo + FROM equipoxpartida exp INNER JOIN equipoxusuario exu ON exp.idEquipo = exu.idEquipo INNER JOIN usuario u + ON exu.idUsuario = u.idUsuario INNER JOIN equipo e ON exu.idEquipo = e.idEquipo WHERE exp.idPartida = :idPartida + ORDER BY e.nombreEquipo ASC, u.nombreUsuario ASC"); $consulta->bindParam( ":idPartida", $this->idPartida ); - $consulta->execute(); - return $consulta->fetchAll(PDO::FETCH_ASSOC); } catch (PDOException $error) { - return [ "error" => "Ocurrió un error al obtener la lista de jugadores.", - "error_tecnico" => $error->getMessage() ]; } } -} +} \ No newline at end of file diff --git a/mysqulito/triviagmagicoDEFINITIVO.sql b/mysqulito/triviagmagicoDEFINITIVO.sql index 8a01585..eb838c2 100644 --- a/mysqulito/triviagmagicoDEFINITIVO.sql +++ b/mysqulito/triviagmagicoDEFINITIVO.sql @@ -166,6 +166,9 @@ CREATE TABLE `partida` ( `idPartida` int(11) NOT NULL AUTO_INCREMENT, `nombrePartida` varchar(100) NOT NULL, `idUsuario` int(11) NOT NULL, + `fechaCreacion` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP, + `fechaInicio` DATETIME NULL, + `fechaFin` DATETIME NULL, PRIMARY KEY (`idPartida`), KEY `FK idUsuario tabla usuario` (`idUsuario`), CONSTRAINT `FK idUsuario tabla usuario` FOREIGN KEY (`idUsuario`) REFERENCES `usuario` (`idUsuario`)