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
+177 -120
View File
@@ -7,27 +7,17 @@ class Partida
public $idPartida;
public $nombrePartida;
public $idUsuario;
public $fechaCreacion;
public $fechaInicio;
public $fechaFin;
public function __construct(
$idPartida = null,
$nombrePartida = null,
$idUsuario = null,
$fechaCreacion = null,
$fechaInicio = null,
$fechaFin = null
$idUsuario = null
) {
$this->idPartida = $idPartida;
$this->nombrePartida = $nombrePartida;
$this->idUsuario = $idUsuario;
$this->fechaCreacion = $fechaCreacion;
$this->fechaInicio = $fechaInicio;
$this->fechaFin = $fechaFin;
}
public function insertar()
{
$conexion = conexionBD();
@@ -35,7 +25,12 @@ 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();
@@ -51,7 +46,8 @@ class Partida
}
}
public function listar(){
public function listar()
{
$conexion = conexionBD();
if (is_array($conexion)) {
return $conexion;
@@ -68,13 +64,18 @@ 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);
@@ -86,14 +87,20 @@ 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);
@@ -110,13 +117,17 @@ 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 [
@@ -131,36 +142,48 @@ class Partida
}
}
public function iniciarPartida(){
public function iniciar()
{
$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 = $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" => "La partida se inició correctamente.",
"exito_tecnico" => $this->idPartida
];
} catch (PDOException $error) {
return [
"error" => "Ocurrió un error al iniciar la partida.",
"error" => "No se pudo iniciar la partida.",
'error_tecnico' => $error->getMessage()
];
}
}
public function finalizar(){
public function finalizar()
{
$conexion = conexionBD();
if (is_array($conexion)) {
return $conexion;
}
try {
$consulta = $conexion->prepare("UPDATE partida SET fechaFin=NOW() WHERE idPartida=:idPartida AND fechaFin IS NULL");
$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->execute();
return [
@@ -169,83 +192,30 @@ class Partida
];
} catch (PDOException $error) {
return [
"error" => "Ocurrió un error al finalizar la partida.",
"error" => "No se pudo 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(){
public function getPreguntas()
{
$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 = $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);
@@ -258,13 +228,19 @@ class 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();
@@ -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?".
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);
@@ -299,14 +280,21 @@ 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();
@@ -321,11 +309,11 @@ class Partida
}
/**
* 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().)
* Sustituye al antiguo campo `terminada`: compara cuántas preguntas
* tiene la partida contra cuántas ha respondido este usuario.
*/
public function estaFinalizadaParaUsuario($idUsuario){
public function estaFinalizadaParaUsuario($idUsuario)
{
$totalPreguntas = $this->contarPreguntasAsignadas();
if (is_array($totalPreguntas)) {
return $totalPreguntas;
@@ -340,13 +328,19 @@ 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);
@@ -358,13 +352,22 @@ 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();
@@ -384,13 +387,24 @@ 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();
public function registrarEquipoEnPartida($idEquipo)
{
$conexion = conexionBD(); // Obtenemos la conexión modular del proyecto
if (is_array($conexion)) {
return $conexion;
return $conexion; // Si hay error en la conexión, lo devuelve
}
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(":idEquipo", $idEquipo);
$consulta->execute();
@@ -400,6 +414,7 @@ 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()
@@ -411,14 +426,28 @@ 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 {
$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");
// 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->execute();
@@ -435,26 +464,54 @@ 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()
];
+4 -7
View File
@@ -166,9 +166,6 @@ 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`)
@@ -181,10 +178,10 @@ CREATE TABLE `partida` (
LOCK TABLES `partida` WRITE;
/*!40000 ALTER TABLE `partida` DISABLE KEYS */;
INSERT INTO `partida` (idPartida, nombrePartida, idUsuario, fechaInicio, fechaFin) VALUES
(1,'Partida de prueba 1',1, NULL, NULL),
(2,'Partida de prueba 2',4, NULL, NULL),
(3,'Partida de prueba 3',9, NULL, NULL);
INSERT INTO `partida` VALUES
(1,'Partida de prueba 1',1),
(2,'Partida de prueba 2',4),
(3,'Partida de prueba 3',9);
/*!40000 ALTER TABLE `partida` ENABLE KEYS */;
UNLOCK TABLES;