1 Commits

Author SHA1 Message Date
margarita 04fe80946f añadir funcion iniciar y finalizar en la ClasePartida 2026-09-29 11:06:35 +02:00
2 changed files with 202 additions and 148 deletions
+198 -141
View File
@@ -7,27 +7,17 @@ class Partida
public $idPartida; public $idPartida;
public $nombrePartida; public $nombrePartida;
public $idUsuario; public $idUsuario;
public $fechaCreacion;
public $fechaInicio;
public $fechaFin;
public function __construct( public function __construct(
$idPartida = null, $idPartida = null,
$nombrePartida = null, $nombrePartida = null,
$idUsuario = null, $idUsuario = null
$fechaCreacion = null,
$fechaInicio = null,
$fechaFin = null
) { ) {
$this->idPartida = $idPartida; $this->idPartida = $idPartida;
$this->nombrePartida = $nombrePartida; $this->nombrePartida = $nombrePartida;
$this->idUsuario = $idUsuario; $this->idUsuario = $idUsuario;
$this->fechaCreacion = $fechaCreacion;
$this->fechaInicio = $fechaInicio;
$this->fechaFin = $fechaFin;
} }
public function insertar() public function insertar()
{ {
$conexion = conexionBD(); $conexion = conexionBD();
@@ -35,7 +25,12 @@ class Partida
return $conexion; return $conexion;
} }
try { 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(":nombrePartida", $this->nombrePartida);
$consulta->bindParam(":idUsuario", $this->idUsuario); $consulta->bindParam(":idUsuario", $this->idUsuario);
$consulta->execute(); $consulta->execute();
@@ -51,7 +46,8 @@ class Partida
} }
} }
public function listar(){ public function listar()
{
$conexion = conexionBD(); $conexion = conexionBD();
if (is_array($conexion)) { if (is_array($conexion)) {
return $conexion; return $conexion;
@@ -68,13 +64,18 @@ class Partida
} }
} }
public function buscar(){ public function buscar()
{
$conexion = conexionBD(); $conexion = conexionBD();
if (is_array($conexion)) { if (is_array($conexion)) {
return $conexion; return $conexion;
} }
try { 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->bindParam(":idPartida", $this->idPartida);
$consulta->execute(); $consulta->execute();
return $consulta->fetch(PDO::FETCH_ASSOC); return $consulta->fetch(PDO::FETCH_ASSOC);
@@ -86,14 +87,20 @@ class Partida
} }
} }
public function editar()
public function editar(){ {
$conexion = conexionBD(); $conexion = conexionBD();
if (is_array($conexion)) { if (is_array($conexion)) {
return $conexion; return $conexion;
} }
try { 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(":idPartida", $this->idPartida);
$consulta->bindParam(":nombrePartida", $this->nombrePartida); $consulta->bindParam(":nombrePartida", $this->nombrePartida);
$consulta->bindParam(":idUsuario", $this->idUsuario); $consulta->bindParam(":idUsuario", $this->idUsuario);
@@ -110,13 +117,17 @@ class Partida
} }
} }
public function eliminar(){ public function eliminar()
{
$conexion = conexionBD(); $conexion = conexionBD();
if (is_array($conexion)) { if (is_array($conexion)) {
return $conexion; return $conexion;
} }
try { 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->bindParam(":idPartida", $this->idPartida);
$consulta->execute(); $consulta->execute();
return [ return [
@@ -131,36 +142,48 @@ class Partida
} }
} }
public function iniciar()
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(); $conexion = conexionBD();
if (is_array($conexion)) { if (is_array($conexion)) {
return $conexion; return $conexion;
} }
try { try {
$consulta = $conexion->prepare("UPDATE partida SET fechaFin=NOW() WHERE idPartida=:idPartida AND fechaFin IS NULL"); $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 se inició correctamente.",
"exito_tecnico" => $this->idPartida
];
} catch (PDOException $error) {
return [
"error" => "No se pudo iniciar la partida.",
'error_tecnico' => $error->getMessage()
];
}
}
public function finalizar()
{
$conexion = conexionBD();
if (is_array($conexion)) {
return $conexion;
}
try {
$consulta = $conexion->prepare("
UPDATE partida
SET fechaFin = NOW()
WHERE idPartida = :idPartida
AND fechaInicio IS NOT NULL
AND fechaFin IS NULL
");
$consulta->bindParam(":idPartida", $this->idPartida); $consulta->bindParam(":idPartida", $this->idPartida);
$consulta->execute(); $consulta->execute();
return [ return [
@@ -169,83 +192,30 @@ class Partida
]; ];
} catch (PDOException $error) { } catch (PDOException $error) {
return [ return [
"error" => "Ocurrió un error al finalizar la partida.", "error" => "No se pudo finalizar la partida.",
'error_tecnico' => $error->getMessage() '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;
}
public function getPreguntas()
//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(); $conexion = conexionBD();
if (is_array($conexion)) { if (is_array($conexion)) {
return $conexion; return $conexion;
} }
try { try {
$consulta = $conexion->prepare("SELECT * FROM partida WHERE idUsuario=:idUsuario AND fechaFin IS NULL ORDER BY idPartida DESC LIMIT 1"); $consulta = $conexion->prepare("
$consulta->bindParam(":idUsuario", $this->idUsuario); SELECT
$consulta->execute(); pxp.idPartidaxPregunta,
return $consulta->fetch(PDO::FETCH_ASSOC); p.*
} catch (PDOException $error) { FROM partidaxpregunta pxp
return [ INNER JOIN pregunta p
"error" => "Ocurrió un error al buscar la partida en curso.", ON pxp.idPregunta=p.idPregunta
'error_tecnico' => $error->getMessage() WHERE pxp.idPartida=:idPartida
]; ORDER BY pxp.idPartidaxPregunta
} ");
}
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->bindParam(":idPartida", $this->idPartida);
$consulta->execute(); $consulta->execute();
return $consulta->fetchAll(PDO::FETCH_ASSOC); return $consulta->fetchAll(PDO::FETCH_ASSOC);
@@ -257,14 +227,20 @@ class Partida
} }
} }
public function asignarPregunta($idPregunta) { public function asignarPregunta($idPregunta)
{
$conexion = conexionBD(); $conexion = conexionBD();
if (is_array($conexion)) { if (is_array($conexion)) {
return $conexion; return $conexion;
} }
try { 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(":idPartida", $this->idPartida);
$consulta->bindParam(":idPregunta", $idPregunta); $consulta->bindParam(":idPregunta", $idPregunta);
$consulta->execute(); $consulta->execute();
@@ -280,13 +256,18 @@ 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?". //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(); $conexion = conexionBD();
if (is_array($conexion)) { if (is_array($conexion)) {
return $conexion; return $conexion;
} }
try { 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->bindParam(":idPartida", $this->idPartida);
$consulta->execute(); $consulta->execute();
$fila = $consulta->fetch(PDO::FETCH_ASSOC); $fila = $consulta->fetch(PDO::FETCH_ASSOC);
@@ -299,14 +280,21 @@ class Partida
} }
} }
public function contarRespuestasUsuario($idUsuario){ public function contarRespuestasUsuario($idUsuario)
{
$conexion = conexionBD(); $conexion = conexionBD();
if (is_array($conexion)) { if (is_array($conexion)) {
return $conexion; return $conexion;
} }
try { try {
$consulta = $conexion->prepare("SELECT COUNT(*) AS total FROM respuestaalmacenada ra INNER JOIN partidaxpregunta pxp $consulta = $conexion->prepare("
ON ra.idPartidaxPregunta=pxp.idPartidaxPregunta WHERE pxp.idPartida=:idPartida AND ra.idUsuario=:idUsuario"); 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(":idPartida", $this->idPartida);
$consulta->bindParam(":idUsuario", $idUsuario); $consulta->bindParam(":idUsuario", $idUsuario);
$consulta->execute(); $consulta->execute();
@@ -321,11 +309,11 @@ class Partida
} }
/** /**
* Indica si ESTE usuario ya ha respondido todas las preguntas: * Sustituye al antiguo campo `terminada`: compara cuántas preguntas
* compara cuántas preguntas tiene la partida contra cuántas ha * tiene la partida contra cuántas ha respondido este usuario.
* respondido él. (La partida completa se marca con finalizar().)
*/ */
public function estaFinalizadaParaUsuario($idUsuario){ public function estaFinalizadaParaUsuario($idUsuario)
{
$totalPreguntas = $this->contarPreguntasAsignadas(); $totalPreguntas = $this->contarPreguntasAsignadas();
if (is_array($totalPreguntas)) { if (is_array($totalPreguntas)) {
return $totalPreguntas; return $totalPreguntas;
@@ -340,13 +328,19 @@ class Partida
/** /**
* Partidas creadas por un usuario, de más reciente a más antigua. * Partidas creadas por un usuario, de más reciente a más antigua.
*/ */
public function listarDelUsuario(){ public function listarDelUsuario()
{
$conexion = conexionBD(); $conexion = conexionBD();
if (is_array($conexion)) { if (is_array($conexion)) {
return $conexion; return $conexion;
} }
try { 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->bindParam(":idUsuario", $this->idUsuario);
$consulta->execute(); $consulta->execute();
return $consulta->fetchAll(PDO::FETCH_ASSOC); return $consulta->fetchAll(PDO::FETCH_ASSOC);
@@ -358,13 +352,22 @@ class Partida
} }
} }
public function preguntaAsignada($idPregunta) { public function preguntaAsignada($idPregunta)
{
$conexion = conexionBD(); $conexion = conexionBD();
if (is_array($conexion)) { if (is_array($conexion)) {
return $conexion; return $conexion;
} }
try { 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(":idPartida", $this->idPartida);
$consulta->bindParam(":idPregunta", $idPregunta); $consulta->bindParam(":idPregunta", $idPregunta);
$consulta->execute(); $consulta->execute();
@@ -384,13 +387,24 @@ class Partida
* Vincula un equipo a esta partida en la tabla intermedia 'equipoxpartida'. * Vincula un equipo a esta partida en la tabla intermedia 'equipoxpartida'.
* Permite registrar qué grupos están participando en este torneo. * Permite registrar qué grupos están participando en este torneo.
*/ */
public function registrarEquipoEnPartida($idEquipo){ public function registrarEquipoEnPartida($idEquipo)
$conexion = conexionBD(); {
$conexion = conexionBD(); // Obtenemos la conexión modular del proyecto
if (is_array($conexion)) { if (is_array($conexion)) {
return $conexion; return $conexion; // Si hay error en la conexión, lo devuelve
} }
try { try {
$consulta = $conexion->prepare("INSERT INTO equipoxpartida (idPartida, idEquipo) VALUES (:idPartida, :idEquipo)"); // 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->bindParam(":idPartida", $this->idPartida); $consulta->bindParam(":idPartida", $this->idPartida);
$consulta->bindParam(":idEquipo", $idEquipo); $consulta->bindParam(":idEquipo", $idEquipo);
$consulta->execute(); $consulta->execute();
@@ -400,6 +414,7 @@ class Partida
"exito_tecnico" => $conexion->lastInsertId() "exito_tecnico" => $conexion->lastInsertId()
]; ];
} catch (PDOException $error) { } catch (PDOException $error) {
// Capturamos el error extrayendo solo el mensaje de texto limpio
return [ return [
"error" => "Ocurrió un error al asignar el equipo a la partida.", "error" => "Ocurrió un error al asignar el equipo a la partida.",
"error_tecnico" => $error->getMessage() "error_tecnico" => $error->getMessage()
@@ -411,14 +426,28 @@ class Partida
* Obtiene todos los equipos que están compitiendo en esta 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. * Es útil para mostrar la lista de rivales antes de empezar a responder.
*/ */
public function getEquiposParticipantes(){ public function getEquiposParticipantes()
{
$conexion = conexionBD(); $conexion = conexionBD();
if (is_array($conexion)) { if (is_array($conexion)) {
return $conexion; return $conexion;
} }
try {
$consulta = $conexion->prepare("SELECT exp.idEquipoxPartida, e.idEquipo, e.nombreEquipo FROM equipoxpartida exp try {
INNER JOIN equipo e ON exp.idEquipo = e.idEquipo WHERE exp.idPartida = :idPartida ORDER BY e.nombreEquipo ASC"); // 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
");
$consulta->bindParam(":idPartida", $this->idPartida); $consulta->bindParam(":idPartida", $this->idPartida);
$consulta->execute(); $consulta->execute();
@@ -435,29 +464,57 @@ class Partida
* Obtiene todos los jugadores reales (Usuarios) que están jugando en esta partida. * Obtiene todos los jugadores reales (Usuarios) que están jugando en esta partida.
* Utiliza la tabla 'equipoxusuario' en SQL para cruzar los datos. * Utiliza la tabla 'equipoxusuario' en SQL para cruzar los datos.
*/ */
public function getJugadoresDeLaPartida(){ public function getJugadoresDeLaPartida()
{
$conexion = conexionBD(); $conexion = conexionBD();
if (is_array($conexion)) { if (is_array($conexion)) {
return $conexion; return $conexion;
} }
try { 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 $consulta = $conexion->prepare("
ON exu.idUsuario = u.idUsuario INNER JOIN equipo e ON exu.idEquipo = e.idEquipo WHERE exp.idPartida = :idPartida SELECT DISTINCT
ORDER BY e.nombreEquipo ASC, u.nombreUsuario ASC"); 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( $consulta->bindParam(
":idPartida", ":idPartida",
$this->idPartida $this->idPartida
); );
$consulta->execute(); $consulta->execute();
return $consulta->fetchAll(PDO::FETCH_ASSOC); return $consulta->fetchAll(PDO::FETCH_ASSOC);
} catch (PDOException $error) { } catch (PDOException $error) {
return [ return [
"error" => "error" =>
"Ocurrió un error al obtener la lista de jugadores.", "Ocurrió un error al obtener la lista de jugadores.",
"error_tecnico" => "error_tecnico" =>
$error->getMessage() $error->getMessage()
]; ];
} }
} }
} }
+4 -7
View File
@@ -166,9 +166,6 @@ CREATE TABLE `partida` (
`idPartida` int(11) NOT NULL AUTO_INCREMENT, `idPartida` int(11) NOT NULL AUTO_INCREMENT,
`nombrePartida` varchar(100) NOT NULL, `nombrePartida` varchar(100) NOT NULL,
`idUsuario` int(11) NOT NULL, `idUsuario` int(11) NOT NULL,
`fechaCreacion` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
`fechaInicio` DATETIME NULL,
`fechaFin` DATETIME NULL,
PRIMARY KEY (`idPartida`), PRIMARY KEY (`idPartida`),
KEY `FK idUsuario tabla usuario` (`idUsuario`), KEY `FK idUsuario tabla usuario` (`idUsuario`),
CONSTRAINT `FK idUsuario tabla usuario` FOREIGN KEY (`idUsuario`) REFERENCES `usuario` (`idUsuario`) CONSTRAINT `FK idUsuario tabla usuario` FOREIGN KEY (`idUsuario`) REFERENCES `usuario` (`idUsuario`)
@@ -181,10 +178,10 @@ CREATE TABLE `partida` (
LOCK TABLES `partida` WRITE; LOCK TABLES `partida` WRITE;
/*!40000 ALTER TABLE `partida` DISABLE KEYS */; /*!40000 ALTER TABLE `partida` DISABLE KEYS */;
INSERT INTO `partida` (idPartida, nombrePartida, idUsuario, fechaInicio, fechaFin) VALUES INSERT INTO `partida` VALUES
(1,'Partida de prueba 1',1, NULL, NULL), (1,'Partida de prueba 1',1),
(2,'Partida de prueba 2',4, NULL, NULL), (2,'Partida de prueba 2',4),
(3,'Partida de prueba 3',9, NULL, NULL); (3,'Partida de prueba 3',9);
/*!40000 ALTER TABLE `partida` ENABLE KEYS */; /*!40000 ALTER TABLE `partida` ENABLE KEYS */;
UNLOCK TABLES; UNLOCK TABLES;