From 71b7337dbaf8e920efa41ea3352f73dc5ba0c61f Mon Sep 17 00:00:00 2001 From: dbvictor2002 Date: Thu, 1 Oct 2026 12:39:45 +0200 Subject: [PATCH] Subir archivos a "controladores" --- controladores/controladorResultados.php | 138 ++++++++++++++++++------ 1 file changed, 103 insertions(+), 35 deletions(-) diff --git a/controladores/controladorResultados.php b/controladores/controladorResultados.php index c952229..ec6071b 100644 --- a/controladores/controladorResultados.php +++ b/controladores/controladorResultados.php @@ -1,6 +1,6 @@ prepare(" SELECT COUNT(exu.idUsuario) AS total_jugadores FROM equipoxpartida exp @@ -38,7 +38,7 @@ switch ($orden) { $preguntasTotalesEsperadas = $totalJugadores * 10; - // Contar respuestas dadas en la partida + // 2. Contar cuántas respuestas reales se han guardado $stmtRespuestas = $conexion->prepare(" SELECT COUNT(*) FROM respuestaalmacenada ra @@ -50,17 +50,16 @@ switch ($orden) { $terminada = ($respuestasRespondidas >= $preguntasTotalesEsperadas && $preguntasTotalesEsperadas > 0); - // Cuando la partida finaliza, se actualizan los históricos + // 3. Si ha terminado, guardamos los datos históricos una sola vez if ($terminada && !isset($_SESSION['partidas_procesadas'][$idPartida])) { $conexion->beginTransaction(); - // CÁLCULO DE VELOCIDAD PREGUNTA A PREGUNTA EN SESIÓN + // --- CÁLCULO DE VELOCIDAD --- if (!isset($_SESSION['primeros_en_acertar'][$idPartida])) { $_SESSION['primeros_en_acertar'][$idPartida] = []; } - // Vemos quién fue el primero $stmtVelocidad = $conexion->prepare(" SELECT ra.idPartidaxPregunta, ra.idUsuario FROM respuestaalmacenada ra @@ -81,8 +80,7 @@ switch ($orden) { } } - // Actualizamos la base de datos - // Buscamos los aciertos de cada jugador en la partida actual + // Consulta de aciertos $stmtAciertos = $conexion->prepare(" SELECT ra.idUsuario, exu.idEquipo, COUNT(*) as aciertos_partida FROM respuestaalmacenada ra @@ -90,12 +88,12 @@ switch ($orden) { INNER JOIN respuesta r ON ra.idRespuesta = r.idRespuesta INNER JOIN equipoxusuario exu ON ra.idUsuario = exu.idUsuario WHERE pxp.idPartida = :idPartida AND r.correcta = 1 - GROUP BY ra.idUsuario + GROUP BY ra.idUsuario, exu.idEquipo "); $stmtAciertos->execute([':idPartida' => $idPartida]); $jugadoresPartida = $stmtAciertos->fetchAll(PDO::FETCH_ASSOC); - $updateAciertosGlobales = $conexion->prepare(" + $updateAciertos = $conexion->prepare(" UPDATE usuario SET aciertos = aciertos + :nuevos_aciertos WHERE idUsuario = :idUsuario @@ -107,7 +105,6 @@ switch ($orden) { $idE = (int)$jp['idEquipo']; $nuevosAciertos = (int)$jp['aciertos_partida']; - // Sumamos los aciertos al perfil del usuario $updateAciertos->execute([ ':nuevos_aciertos' => $nuevosAciertos, ':idUsuario' => $idU @@ -119,34 +116,42 @@ switch ($orden) { $puntosEquipos[$idE] += $nuevosAciertos; } - // Determinamos qué equipo ha obtenido más aciertos en la partida - arsort($puntosEquipos); - $idEquipoGanador = key($puntosEquipos); + if (!empty($puntosEquipos)) { + arsort($puntosEquipos); + $idEquipoGanador = key($puntosEquipos); - // Obtenemos todos los usuarios de la partida para asignar victorias/derrotas - $stmtMiembros = $conexion->prepare(" - SELECT exu.idUsuario, exu.idEquipo - FROM equipoxpartida exp - INNER JOIN equipoxusuario exu ON exp.idEquipo = exu.idEquipo - WHERE exp.idPartida = :idPartida - "); - $stmtMiembros->execute([':idPartida' => $idPartida]); - $todosLosMiembros = $stmtMiembros->fetchAll(PDO::FETCH_ASSOC); + $stmtMiembros = $conexion->prepare(" + SELECT exu.idUsuario, exu.idEquipo + FROM equipoxpartida exp + INNER JOIN equipoxusuario exu ON exp.idEquipo = exu.idEquipo + WHERE exp.idPartida = :idPartida + "); + $stmtMiembros->execute([':idPartida' => $idPartida]); + $todosLosMiembros = $stmtMiembros->fetchAll(PDO::FETCH_ASSOC); - $updateVictoria = $conexion->prepare("UPDATE usuario SET victorias = victorias + 1 WHERE idUsuario = :idUsuario"); - $updateDerrota = $conexion->prepare("UPDATE usuario SET derrotas = derrotas + 1 WHERE idUsuario = :idUsuario"); + $updateVictoria = $conexion->prepare("UPDATE usuario SET victorias = victorias + 1 WHERE idUsuario = :idUsuario"); + $updateDerrota = $conexion->prepare("UPDATE usuario SET derrotas = derrotas + 1 WHERE idUsuario = :idUsuario"); - foreach ($todosLosMiembros as $miembro) { - $idU = (int)$miembro['idUsuario']; - $idE = (int)$miembro['idEquipo']; + foreach ($todosLosMiembros as $miembro) { + $idU = (int)$miembro['idUsuario']; + $idE = (int)$miembro['idEquipo']; - if ($idE === $idEquipoGanador) { - $updateVictoria->execute([':idUsuario' => $idU]); - } else { - $updateDerrota->execute([':idUsuario' => $idU]); + if ($idE === $idEquipoGanador) { + $updateVictoria->execute([':idUsuario' => $idU]); + } else { + $updateDerrota->execute([':idUsuario' => $idU]); + } } } + // Marcar fecha fin de la partida para los históricos globales del grupo + $stmtFinalizar = $conexion->prepare(" + UPDATE partida + SET fechaFin = NOW() + WHERE idPartida = :idPartida AND fechaFin IS NULL + "); + $stmtFinalizar->execute([':idPartida' => $idPartida]); + $conexion->commit(); $_SESSION['partidas_procesadas'][$idPartida] = true; } @@ -160,7 +165,70 @@ switch ($orden) { } break; - default: - echo json_encode(['error' => 'Acción no permitida']); + case 'registrarSalidaUsuario': + try { + $idUsuario = (int)$_SESSION['idUsuario']; + $conexion->beginTransaction(); + + // A. LIBERACIÓN INMEDIATA DEL JUGADOR ACTUAL: Lo borramos de su equipo + $stmtSalir = $conexion->prepare("DELETE FROM equipoxusuario WHERE idUsuario = :idUsuario"); + $stmtSalir->execute([':idUsuario' => $idUsuario]); + + // B. CONTADOR DE ALUMNOS QUEDAN: Contamos cuántas personas quedan en los equipos de esta partida + $stmtContarQuedan = $conexion->prepare(" + SELECT COUNT(exu.idUsuario) + FROM equipoxpartida exp + INNER JOIN equipoxusuario exu ON exp.idEquipo = exu.idEquipo + WHERE exp.idPartida = :idPartida + "); + $stmtContarQuedan->execute([':idPartida' => $idPartida]); + $jugadoresRestantes = (int)$stmtContarQuedan->fetchColumn(); + + // C. DESTRUCCIÓN EN CADENA AUTOMÁTICA ATÓMICA (Si da 0, somos los últimos en salir) + if ($jugadoresRestantes === 0) { + // 1. Limpiar las respuestas almacenadas + $stmtBorrarRespuestas = $conexion->prepare(" + DELETE ra FROM respuestaalmacenada ra + INNER JOIN partidaxpregunta pxp ON ra.idPartidaxPregunta = pxp.idPartidaxPregunta + WHERE pxp.idPartida = :idPartida + "); + $stmtBorrarRespuestas->execute([':idPartida' => $idPartida]); + + // 2. Limpiar las preguntas vinculadas a la partida + $stmtBorrarPreguntas = $conexion->prepare("DELETE FROM partidaxpregunta WHERE idPartida = :idPartida"); + $stmtBorrarPreguntas->execute([':idPartida' => $idPartida]); + + // 3. NUEVO: Obtener los IDs de los dos equipos que jugaban en esta partida antes de borrar la relación + $stmtObtenerEquipos = $conexion->prepare("SELECT idEquipo FROM equipoxpartida WHERE idPartida = :idPartida"); + $stmtObtenerEquipos->execute([':idPartida' => $idPartida]); + $equiposDeLaPartida = $stmtObtenerEquipos->fetchAll(PDO::FETCH_COLUMN); + + // 4. Limpiar la relación de equipos de la partida (tabla intermedia) + $stmtBorrarEquiposPartida = $conexion->prepare("DELETE FROM equipoxpartida WHERE idPartida = :idPartida"); + $stmtBorrarEquiposPartida = $conexion->prepare("DELETE FROM equipoxpartida WHERE idPartida = :idPartida"); + $stmtBorrarEquiposPartida->execute([':idPartida' => $idPartida]); + + // 5. NUEVO: Borrar físicamente los equipos de la tabla 'equipo' si existen + if (!empty($equiposDeLaPartida)) { + // Creamos los marcadores (?, ?) de forma dinámica según los equipos que devuelva + $inQuery = implode(',', array_fill(0, count($equiposDeLaPartida), '?')); + $stmtBorrarEquiposFisicos = $conexion->prepare("DELETE FROM equipo WHERE idEquipo IN ($inQuery)"); + $stmtBorrarEquiposFisicos->execute($equiposDeLaPartida); + } + + // 6. Borrar físicamente la fila de la partida principal + $stmtBorrarSala = $conexion->prepare("DELETE FROM partida WHERE idPartida = :idPartida"); + $stmtBorrarSala->execute([':idPartida' => $idPartida]); + } + + $conexion->commit(); + echo json_encode(['exito' => true, 'usuarios_quedan' => $jugadoresRestantes]); + } catch (PDOException $e) { + if ($conexion->inTransaction()) { + $conexion->rollBack(); + } + echo json_encode(['error' => $e->getMessage()]); + } break; -} \ No newline at end of file + +}