27 Commits

Author SHA1 Message Date
v.rodriguezcamacho c52fab2d6c Merge branch 'backend' 2026-09-24 14:10:27 +02:00
margarita 22f86c2d6d añadir carpeta controlador y controladorUsuario 2026-09-24 14:00:24 +02:00
Isaac cb3b00fba3 Merge branch 'frontend'
Traemos resultados.php (pantalla final) a la main
2026-09-24 13:36:32 +02:00
v.rodriguezcamacho 9df7bd9d45 add controladorEquipoxUsuario.php 2026-09-24 13:27:11 +02:00
profesor fdd0712cd5 Actualizar README.md 2026-09-24 13:06:11 +02:00
dbvictor2002 52a97dfd01 Subir archivos a "clases" 2026-09-24 12:52:42 +02:00
dbvictor2002 63e9c3ceab Subir archivos a "clases" 2026-09-24 12:52:32 +02:00
dbvictor2002 87fdf7285f Subir archivos a "clases" 2026-09-24 12:37:39 +02:00
dbvictor2002 9bcb06a651 Subir archivos a "clases" 2026-09-24 12:37:28 +02:00
dbvictor2002 b9dea2a3ca Actualizar clases/ClasePartida.php 2026-09-24 12:35:42 +02:00
dbvictor2002 cab040aaa1 Actualizar clases/ClaseEquipo.php 2026-09-24 12:35:28 +02:00
dbvictor2002 a3cd770956 Actualizar clases/ClaseCategoria.php 2026-09-24 12:35:15 +02:00
daniel b2f8a6c8d5 Actualizar requisitos.md 2026-09-24 12:25:23 +02:00
dbvictor2002 3348188d44 Subir archivos a "clases" 2026-09-24 11:21:34 +02:00
dbvictor2002 e102298961 Subir archivos a "clases" 2026-09-24 11:13:44 +02:00
dbvictor2002 d1c381d7ac Subir archivos a "clases" 2026-09-24 11:02:48 +02:00
dbvictor2002 ee781cb1e7 Subir archivos a "clases" 2026-09-24 10:49:38 +02:00
v.rodriguezcamacho f784c7bfff puesto de la misma manera los require en todas las clases 2026-09-24 10:43:11 +02:00
v.rodriguezcamacho 29a11a8514 añadido el BD en conexion.php en algunas clases 2026-09-24 10:39:45 +02:00
v.rodriguezcamacho a62d888953 meter claseUsuario en la carpeta clases 2026-09-24 10:12:19 +02:00
dbvictor2002 93ac0e9ec2 Subir archivos a "clases" 2026-09-24 10:07:25 +02:00
victordiamar8 467a861873 claseVictorDiaz 2026-09-24 10:05:39 +02:00
Juanjo 39d0ef51be cambios en conexion base de datos 2026-09-24 09:56:18 +02:00
margarita e257527321 renombrar clase 2026-09-24 09:53:43 +02:00
margarita 42c4785d98 clase Marga 2026-09-24 09:45:16 +02:00
Juanjo dd810ed2cb clases Juanjo 2026-09-24 09:40:09 +02:00
v.rodriguezcamacho 8d767e61e8 carpeta includes con conexionBD.php 2026-09-24 09:30:38 +02:00
13 changed files with 1482 additions and 4 deletions
+7
View File
@@ -52,4 +52,11 @@ Equipos de Backend y Frontend.
# Notas sueltas
## Publicación en el servidor
Here are information to log into the database:
- Type: mysql
- Database user: my_webapp
- Database name: my_webapp
- Password: 07tCqBO3B6Q3cncKMF2FHcpgsLjFTx
+148
View File
@@ -0,0 +1,148 @@
<?php
require_once '../includes/conexionBD.php';
class Categoria{
public $idCategoria;
public $nombreCategoria;
function __construct($idCategoria=null, $nombreCategoria=null){
$this->idCategoria = $idCategoria;
$this->nombreCategoria = $nombreCategoria;
}
function crear(){
$conexion = conexionBD();
if(is_array($conexion)){
return $conexion;
}else{
try{
$consulta = $conexion->prepare("INSERT INTO categoria (nombreCategoria) VALUES (:nombreCategoria)");
$consulta->bindParam(':nombreCategoria', $this->nombreCategoria);
$consulta->execute();
$respuesta = [
'exito' => 'Categoría creada correctamente',
'exito_tecnico' => $this->nombreCategoria
];
return $respuesta;
}catch(PDOException $error){
$respuesta = [
'error' => 'Ocurrió un error al guardar la categoría.',
'error_tecnico' => $error->getMessage()
];
$conexion = null;
return $respuesta;
}
}
}
function listar(){
$conexion = conexionBD();
if(is_array($conexion)){
return $conexion;
}else{
try{
$sql = 'SELECT * FROM categoria';
$consulta = $conexion->prepare($sql);
$consulta->execute();
$resultado = $consulta->fetchAll(PDO::FETCH_ASSOC);
return $resultado;
}catch(PDOException $error){
$respuesta = [
'error' => 'Ocurrió un error al obtener el listado de categorías.',
'error_tecnico' => $error->getMessage()
];
$conexion = null;
return $respuesta;
}
}
}
function buscar(){
$conexion = conexionBD();
if(is_array($conexion)){
return $conexion;
}else{
try{
$consulta = $conexion->prepare("SELECT * FROM categoria WHERE idCategoria = :idCategoria");
$consulta->bindParam(':idCategoria', $this->idCategoria);
$consulta->execute();
$resultado = $consulta->fetch(PDO::FETCH_ASSOC);
return $resultado;
}catch(PDOException $error){
$respuesta = [
'error' => 'Ocurrió un error al buscar la categoría.',
'error_tecnico' => $error->getMessage()
];
$conexion = null;
return $respuesta;
}
}
}
function borrar(){
$conexion = conexionBD();
if(is_array($conexion)){
return $conexion;
}else{
try{
$consulta = $conexion->prepare("DELETE FROM categoria WHERE idCategoria = :idCategoria");
$consulta->bindParam(':idCategoria', $this->idCategoria);
$consulta->execute();
if($consulta->rowCount() > 0){
$respuesta = [
'exito' => 'Se eliminó correctamente la categoría',
'exito_tecnico' => $this->idCategoria
];
}else{
$respuesta = [
'error' => 'No existe ninguna categoría con ese ID.',
'error_tecnico' => $this->idCategoria
];
}
return $respuesta;
}catch(PDOException $error){
$respuesta = [
'error' => 'Ocurrió un error al eliminar la categoría.',
'error_tecnico' => $error->getMessage()
];
$conexion = null;
return $respuesta;
}
}
}
}
?>
+148
View File
@@ -0,0 +1,148 @@
<?php
require_once '../includes/conexionBD.php';
class Equipo{
public $idEquipo;
public $nombreEquipo;
function __construct($idEquipo=null, $nombreEquipo=null){
$this->idEquipo = $idEquipo;
$this->nombreEquipo = $nombreEquipo;
}
function crear(){
$conexion = conexionBD();
if(is_array($conexion)){
return $conexion;
}else{
try{
$consulta = $conexion->prepare("INSERT INTO equipo (nombreEquipo) VALUES (:nombreEquipo)");
$consulta->bindParam(':nombreEquipo', $this->nombreEquipo);
$consulta->execute();
$respuesta = [
'exito' => 'Equipo creado correctamente',
'exito_tecnico' => $this->nombreEquipo
];
return $respuesta;
}catch(PDOException $error){
$respuesta = [
'error' => 'Ocurrió un error al guardar el equipo.',
'error_tecnico' => $error->getMessage()
];
$conexion = null;
return $respuesta;
}
}
}
function listar(){
$conexion = conexionBD();
if(is_array($conexion)){
return $conexion;
}else{
try{
$sql = 'SELECT * FROM equipo';
$consulta = $conexion->prepare($sql);
$consulta->execute();
$resultado = $consulta->fetchAll(PDO::FETCH_ASSOC);
return $resultado;
}catch(PDOException $error){
$respuesta = [
'error' => 'Ocurrió un error al obtener el listado de equipos.',
'error_tecnico' => $error->getMessage()
];
$conexion = null;
return $respuesta;
}
}
}
function buscar(){
$conexion = conexionBD();
if(is_array($conexion)){
return $conexion;
}else{
try{
$consulta = $conexion->prepare("SELECT * FROM equipo WHERE idEquipo = :idEquipo");
$consulta->bindParam(':idEquipo', $this->idEquipo);
$consulta->execute();
$resultado = $consulta->fetch(PDO::FETCH_ASSOC);
return $resultado;
}catch(PDOException $error){
$respuesta = [
'error' => 'Ocurrió un error al buscar el equipo.',
'error_tecnico' => $error->getMessage()
];
$conexion = null;
return $respuesta;
}
}
}
function borrar(){
$conexion = conexionBD();
if(is_array($conexion)){
return $conexion;
}else{
try{
$consulta = $conexion->prepare("DELETE FROM equipo WHERE idEquipo = :idEquipo");
$consulta->bindParam(':idEquipo', $this->idEquipo);
$consulta->execute();
if($consulta->rowCount() > 0){
$respuesta = [
'exito' => 'Se eliminó correctamente el equipo',
'exito_tecnico' => $this->idEquipo
];
}else{
$respuesta = [
'error' => 'No existe ningún equipo con ese ID.',
'error_tecnico' => $this->idEquipo
];
}
return $respuesta;
}catch(PDOException $error){
$respuesta = [
'error' => 'Ocurrió un error al eliminar el equipo.',
'error_tecnico' => $error
];
$conexion = null;
return $respuesta;
}
}
}
}
?>
+58
View File
@@ -0,0 +1,58 @@
<?php
require_once '../includes/conexionBD.php';
class EquipoxUsuario {
public $idEquipoxUsuario;
public $idUsuario;
public $idEquipo;
public function __construct($idEquipoxUsuario = null, $idUsuario = null, $idEquipo = null) {
$this->idEquipoxUsuario = $idEquipoxUsuario;
$this->idUsuario = $idUsuario;
$this->idEquipo = $idEquipo;
}
public function registrarUsuarioEnEquipo() {
$conexion = conexionBD();
if (is_array($conexion)) return $conexion;
try {
$sql = "INSERT INTO equipoxusuario (idUsuario, idEquipo) VALUES (:idUsuario, :idEquipo)";
$consulta = $conexion->prepare($sql);
$consulta->bindParam(':idUsuario', $this->idUsuario);
$consulta->bindParam(':idEquipo', $this->idEquipo);
$consulta->execute();
return [
'exito' => 'Usuario vinculado al equipo correctamente.',
'exito_tecnico' => $conexion->lastInsertId()
];
} catch (PDOException $error) {
return [
'error' => 'Ocurrió un error al unir al usuario con el equipo.',
'error_tecnico' => $error->getMessage()
];
}
}
public static function listarUsuariosPorEquipo($idEquipo) {
$conexion = conexionBD();
if (is_array($conexion)) return $conexion;
try {
$sql = "SELECT u.* FROM equipoxusuario exu
INNER JOIN usuario u ON exu.idUsuario = u.idUsuario
WHERE exu.idEquipo = :idEquipo";
$consulta = $conexion->prepare($sql);
$consulta->bindParam(':idEquipo', $idEquipo);
$consulta->execute();
return $consulta->fetchAll(PDO::FETCH_ASSOC);
} catch (PDOException $error) {
return [
'error' => 'Ocurrió un error al obtener los miembros del equipo.',
'error_tecnico' => $error->getMessage()
];
}
}
}
+452
View File
@@ -0,0 +1,452 @@
<?php
require_once '../includes/conexionBD.php';
class Partida
{
public $idPartida;
public $nombrePartida;
public $idUsuario;
public function __construct(
$idPartida = null,
$nombrePartida = null,
$idUsuario = null
) {
$this->idPartida = $idPartida;
$this->nombrePartida = $nombrePartida;
$this->idUsuario = $idUsuario;
}
public function insertar()
{
$conexion = conexionBD();
if (is_array($conexion)) {
return $conexion;
}
try {
$consulta = $conexion->prepare("
INSERT INTO partida
(nombrePartida,idUsuario)
VALUES
(:nombrePartida,:idUsuario)
");
$consulta->bindParam(":nombrePartida", $this->nombrePartida);
$consulta->bindParam(":idUsuario", $this->idUsuario);
$consulta->execute();
return [
"exito" => "La partida se creó correctamente.",
"exito_tecnico" => $conexion->lastInsertId()
];
} catch (PDOException $error) {
return [
"error" => "Ocurrió un error al guardar la partida.",
'error_tecnico' => $error->getMessage()
];
}
}
public function listar()
{
$conexion = conexionBD();
if (is_array($conexion)) {
return $conexion;
}
try {
$consulta = $conexion->prepare("SELECT * FROM partida");
$consulta->execute();
return $consulta->fetchAll(PDO::FETCH_ASSOC);
} catch (PDOException $error) {
return [
"error" => "Ocurrió un error al obtener el listado.",
'error_tecnico' => $error->getMessage()
];
}
}
public function buscar()
{
$conexion = conexionBD();
if (is_array($conexion)) {
return $conexion;
}
try {
$consulta = $conexion->prepare("
SELECT *
FROM partida
WHERE idPartida=:idPartida
");
$consulta->bindParam(":idPartida", $this->idPartida);
$consulta->execute();
return $consulta->fetch(PDO::FETCH_ASSOC);
} catch (PDOException $error) {
return [
"error" => "Ocurrió un error al buscar la partida.",
'error_tecnico' => $error->getMessage()
];
}
}
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->bindParam(":idPartida", $this->idPartida);
$consulta->bindParam(":nombrePartida", $this->nombrePartida);
$consulta->bindParam(":idUsuario", $this->idUsuario);
$consulta->execute();
return [
"exito" => "La partida se editó correctamente.",
"exito_tecnico" => $this->idPartida
];
} catch (PDOException $error) {
return [
"error" => "Ocurrió un error al editar la partida.",
'error_tecnico' => $error->getMessage()
];
}
}
public function eliminar()
{
$conexion = conexionBD();
if (is_array($conexion)) {
return $conexion;
}
try {
$consulta = $conexion->prepare("
DELETE FROM partida
WHERE idPartida=:idPartida
");
$consulta->bindParam(":idPartida", $this->idPartida);
$consulta->execute();
return [
"exito" => "La partida se eliminó correctamente.",
"exito_tecnico" => $this->idPartida
];
} catch (PDOException $error) {
return [
"error" => "No se pudo eliminar la partida.",
'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);
} catch (PDOException $error) {
return [
"error" => "Ocurrió un error al recuperar las preguntas de la partida.",
'error_tecnico' => $error->getMessage()
];
}
}
/**
* Asocia una pregunta ya existente a esta partida.
*/
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->bindParam(":idPartida", $this->idPartida);
$consulta->bindParam(":idPregunta", $idPregunta);
$consulta->execute();
return [
"exito" => "La pregunta se asignó correctamente.",
"exito_tecnico" => $conexion->lastInsertId()
];
} catch (PDOException $error) {
return [
"error" => "Ocurrió un error al asignar la pregunta.",
'error_tecnico' => $error->getMessage()
];
}
}
//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()
{
$conexion = conexionBD();
if (is_array($conexion)) {
return $conexion;
}
try {
$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);
return (int)$fila["total"];
} catch (PDOException $error) {
return [
"error" => "Ocurrió un error al contar las preguntas.",
'error_tecnico' => $error->getMessage()
];
}
}
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->bindParam(":idPartida", $this->idPartida);
$consulta->bindParam(":idUsuario", $idUsuario);
$consulta->execute();
$fila = $consulta->fetch(PDO::FETCH_ASSOC);
return (int)$fila["total"];
} catch (PDOException $error) {
return [
"error" => "Ocurrió un error al contar las respuestas del usuario.",
'error_tecnico' => $error->getMessage()
];
}
}
/**
* Sustituye al antiguo campo `terminada`: compara cuántas preguntas
* tiene la partida contra cuántas ha respondido este usuario.
*/
public function estaFinalizadaParaUsuario($idUsuario)
{
$totalPreguntas = $this->contarPreguntasAsignadas();
if (is_array($totalPreguntas)) {
return $totalPreguntas;
}
$totalRespondidas = $this->contarRespuestasUsuario($idUsuario);
if (is_array($totalRespondidas)) {
return $totalRespondidas;
}
return $totalPreguntas > 0 && $totalPreguntas === $totalRespondidas;
}
/**
* Partidas creadas por un usuario, de más reciente a más antigua.
*/
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->bindParam(":idUsuario", $this->idUsuario);
$consulta->execute();
return $consulta->fetchAll(PDO::FETCH_ASSOC);
} catch (PDOException $error) {
return [
"error" => "Ocurrió un error al recuperar las partidas del usuario.",
'error_tecnico' => $error->getMessage()
];
}
}
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->bindParam(":idPartida", $this->idPartida);
$consulta->bindParam(":idPregunta", $idPregunta);
$consulta->execute();
$fila = $consulta->fetch(PDO::FETCH_ASSOC);
return (int)$fila["total"] > 0;
} catch (PDOException $error) {
return [
"error" => "Ocurrió un error al comprobar la pregunta.",
'error_tecnico' => $error->getMessage()
];
}
}
/**
* 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
if (is_array($conexion)) {
return $conexion; // Si hay error en la conexión, lo devuelve
}
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->bindParam(":idPartida", $this->idPartida);
$consulta->bindParam(":idEquipo", $idEquipo);
$consulta->execute();
return [
"exito" => "El equipo se vinculó a la partida correctamente.",
"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()
];
}
}
/**
* 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() {
$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
");
$consulta->bindParam(":idPartida", $this->idPartida);
$consulta->execute();
return $consulta->fetchAll(PDO::FETCH_ASSOC); // Devuelve el array con los equipos rivales
} catch (PDOException $error) {
return [
"error" => "Ocurrió un error al recuperar los equipos de la partida.",
"error_tecnico" => $error->getMessage()
];
}
}
/**
* 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() {
$conexion = conexionBD();
if (is_array($conexion)) {
return $conexion;
}
try {
// Cruza la partida con los equipos, y luego los equipos con los usuarios
// para saber los nombres de todas las personas que están jugando el torneo.
$consulta = $conexion->prepare("
SELECT DISTINCT
u.idUsuario,
u.nombreUsuario,
u.email,
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
");
$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()
];
}
}
}
+112
View File
@@ -0,0 +1,112 @@
<?php
require_once '../includes/conexionBD.php';
class Pregunta {
private ?int $idPregunta;
private int $idCategoria;
private string $nombrePregunta;
private array $respuestas;
public function __construct(int $idCategoria = 0, string $nombrePregunta = "", ?int $idPregunta = null) {
$this->idPregunta = $idPregunta;
$this->idCategoria = $idCategoria;
$this->nombrePregunta = $nombrePregunta;
$this->respuestas = [];
}
public function getIdPregunta(): ?int { return $this->idPregunta; }
public function getIdCategoria(): int { return $this->idCategoria; }
public function setIdCategoria(int $idCategoria): void { $this->idCategoria = $idCategoria; }
public function getNombrePregunta(): string { return $this->nombrePregunta; }
public function setNombrePregunta(string $nombrePregunta): void { $this->nombrePregunta = $nombrePregunta; }
public function getRespuestas(): array { return $this->respuestas; }
public function guardar() {
$conexion = conexionBD();
if (is_array($conexion)) {
return $conexion;
}
try {
$sql = "INSERT INTO pregunta (idCategoria, nombrePregunta) VALUES (:idCat, :texto)";
$stmt = $conexion->prepare($sql);
$stmt->execute([
':idCat' => $this->idCategoria,
':texto' => $this->nombrePregunta
]);
$this->idPregunta = (int)$conexion->lastInsertId();
return [
'exito' => 'Pregunta guardada correctamente',
'exito_tecnico' => $this->idPregunta
];
} catch (PDOException $error) {
return [
'error' => 'Ocurrió un error al guardar la pregunta.',
'error_tecnico' => $error->getMessage()
];
}
}
public function cargarRespuestas() {
if ($this->idPregunta === null) return;
$conexion = conexionBD();
if (is_array($conexion)) {
return $conexion;
}
try {
$sql = "SELECT idRespuesta, nombreRespuesta, correcta FROM respuesta WHERE idPregunta = :idPreg";
$stmt = $conexion->prepare($sql);
$stmt->execute([':idPreg' => $this->idPregunta]);
$this->respuestas = $stmt->fetchAll(PDO::FETCH_ASSOC);
} catch (PDOException $error) {
return [
'error' => 'Ocurrió un error al cargar las respuestas.',
'error_tecnico' => $error->getMessage()
];
}
}
public static function obtenerPorCategoria(int $idCategoria, int $limite = 10) {
$conexion = conexionBD();
if (is_array($conexion)) {
return $conexion;
}
try {
$sql = "SELECT * FROM pregunta WHERE idCategoria = :idCat ORDER BY RAND() LIMIT :limite";
$stmt = $conexion->prepare($sql);
$stmt->bindValue(':idCat', $idCategoria, PDO::PARAM_INT);
$stmt->bindValue(':limite', $limite, PDO::PARAM_INT);
$stmt->execute();
$preguntas = [];
while ($datos = $stmt->fetch(PDO::FETCH_ASSOC)) {
$preg = new Pregunta((int)$datos['idCategoria'], $datos['nombrePregunta'], (int)$datos['idPregunta']);
$preg->cargarRespuestas();
$preguntas[] = $preg;
}
return $preguntas;
} catch (PDOException $error) {
return [
'error' => 'Ocurrió un error al obtener las preguntas aleatorias.',
'error_tecnico' => $error->getMessage()
];
}
}
}
+168
View File
@@ -0,0 +1,168 @@
<?php
require_once '../includes/conexionBD.php';
class Respuesta{
public $idRespuesta;
public $idPregunta;
public $nombreRespuesta;
public $correcta;
public function __construct($idRespuesta=null, $idPregunta=null, $nombreRespuesta=null, $correcta=null){
$this->idRespuesta=$idRespuesta;
$this->idPregunta=$idPregunta;
$this->nombreRespuesta=$nombreRespuesta;
$this->correcta=$correcta;
}//fin constructor
public function insertar(){
$conexion = conexionBD();
if(is_array($conexion)){
return $conexion;
}else{
try{
$consulta = $conexion->prepare("INSERT INTO respuesta (idPregunta, nombreRespuesta, correcta) VALUES (:idPregunta, :nombreRespuesta, :correcta)");
$consulta->bindParam(':idPregunta', $this->idPregunta);
$consulta->bindParam(':nombreRespuesta', $this->nombreRespuesta);
$consulta->bindParam(':correcta', $this->correcta);
$consulta->execute();
$respuesta = [
'exito' => 'La respuesta se guardó correctamente.',
'exito_tecnico' => $conexion->lastInsertId()
];
return $respuesta;
}catch(PDOException $error){
$respuesta = [
'error' => 'Ocurrió un error al guardar la respuesta.',
'error_tecnico' => $error->getMessage()
];
$conexion = null;
return $respuesta;
}
}
}//fin método insertar
public function listar(){
$conexion = conexionBD();
if(is_array($conexion)){
return $conexion;
}else{
try{
$consulta = $conexion->prepare("SELECT * FROM respuesta");
$consulta->execute();
return $consulta->fetchAll(PDO::FETCH_ASSOC);
}catch(PDOException $error){
$respuesta = [
'error' => 'Ocurrió un error al obtener el listado.',
'error_tecnico' => $error->getMessage()
];
$conexion = null;
return $respuesta;
}
}
}//fin método listar
public function eliminar(){
$conexion = conexionBD();
if(is_array($conexion)){
return $conexion;
}else{
try{
$consulta = $conexion->prepare("DELETE FROM respuesta WHERE idRespuesta=:idRespuesta");
$consulta->bindParam(':idRespuesta', $this->idRespuesta);
$consulta->execute();
$respuesta = [
'exito' => 'La respuesta se eliminó correctamente.',
'exito_tecnico' => $this->idRespuesta
];
return $respuesta;
}catch(PDOException $error){
$respuesta = [
'error' => 'No se pudo eliminar la respuesta.',
'error_tecnico' => $error->getMessage()
];
$conexion = null;
return $respuesta;
}
}
}//fin método eliminar
public function editar(){
$conexion = conexionBD();
if(is_array($conexion)){
return $conexion;
}else{
try{
$consulta = $conexion->prepare("UPDATE respuesta SET idPregunta=:idPregunta, nombreRespuesta=:nombreRespuesta, correcta=:correcta WHERE idRespuesta=:idRespuesta");
$consulta->bindParam(':idRespuesta', $this->idRespuesta);
$consulta->bindParam(':idPregunta', $this->idPregunta);
$consulta->bindParam(':nombreRespuesta', $this->nombreRespuesta);
$consulta->bindParam(':correcta', $this->correcta);
$consulta->execute();
$respuesta = [
'exito' => 'La respuesta se editó correctamente.',
'exito_tecnico' => $this->idRespuesta
];
return $respuesta;
}catch(PDOException $error){
$respuesta = [
'error' => 'Ocurrió un error al editar la respuesta.',
'error_tecnico' => $error->getMessage()
];
$conexion = null;
return $respuesta;
}
}
}//fin método editar
public function buscar(){
$conexion = conexionBD();
if(is_array($conexion)){
return $conexion;
}else{
try{
$consulta = $conexion->prepare("SELECT * FROM respuesta WHERE idRespuesta=:idRespuesta");
$consulta->bindParam(':idRespuesta', $this->idRespuesta);
$consulta->execute();
return $consulta->fetchAll(PDO::FETCH_ASSOC);
}catch(PDOException $error){
$respuesta = [
'error' => 'Ocurrió un error al buscar la respuesta.',
'error_tecnico' => $error->getMessage()
];
$conexion = null;
return $respuesta;
}
}
}//fin método buscar
public function listarPorPregunta(){//trae todas las respuestas posibles de una pregunta
$conexion = conexionBD();
if(is_array($conexion)){
return $conexion;
}else{
try{
$consulta = $conexion->prepare("SELECT * FROM respuesta WHERE idPregunta=:idPregunta");
$consulta->bindParam(':idPregunta', $this->idPregunta);
$consulta->execute();
$resultado = $consulta->fetchAll(PDO::FETCH_ASSOC);
if(!isset($resultado[0])){
$respuesta = [
'error' => 'La pregunta no tiene respuestas.'
];
return $respuesta;
}else{
return $resultado;
}
}catch(PDOException $error){
$respuesta = [
'error' => 'Ocurrió un error al obtener las respuestas de la pregunta.',
'error_tecnico' => $error->getMessage()
];
$conexion = null;
return $respuesta;
}
}
}//fin método listarPorPregunta
}//fin clase
?>
+79
View File
@@ -0,0 +1,79 @@
<?php
require_once '../includes/conexionBD.php';
// Clase encargada de registrar las respuestas de los jugadores en tiempo real durante la partida
class RespuestaAlmacenada {
public $idRespuestaAlmacenada;
public $idPartidaxPregunta;
public $idUsuario;
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) {
$this->idRespuestaAlmacenada = $idRespuestaAlmacenada;
$this->idPartidaxPregunta = $idPartidaxPregunta;
$this->idUsuario = $idUsuario;
$this->idRespuesta = $idRespuesta;
$this->primero = $primero;
}
/**
* Guarda la respuesta que ha seleccionado un usuario en una pregunta de la partida.
*/
public function guardarRespuesta() {
$conexion = conexionBD();
if (is_array($conexion)) return $conexion;
try {
$sql = "INSERT INTO respuestaalmacenada (idPartidaxPregunta, idUsuario, idRespuesta, primero)
VALUES (:idPartidaxPregunta, :idUsuario, :idRespuesta, :primero)";
$consulta = $conexion->prepare($sql);
$consulta->bindParam(':idPartidaxPregunta', $this->idPartidaxPregunta);
$consulta->bindParam(':idUsuario', $this->idUsuario);
$consulta->bindParam(':idRespuesta', $this->idRespuesta);
$consulta->bindParam(':primero', $this->primero, PDO::PARAM_INT);
$consulta->execute();
return [
'exito' => 'Respuesta del usuario almacenada correctamente.',
'exito_tecnico' => $conexion->lastInsertId()
];
} catch (PDOException $error) {
return [
'error' => 'Ocurrió un error al guardar la respuesta del jugador.',
'error_tecnico' => $error->getMessage()
];
}
}
/**
* Obtiene los aciertos totales de un usuario en una partida específica.
* Útil para calcular las estadísticas individuales al terminar el juego.
*/
public static function obtenerAciertosUsuarioEnPartida($idPartida, $idUsuario) {
$conexion = conexionBD();
if (is_array($conexion)) return $conexion;
try {
$sql = "SELECT COUNT(*) AS aciertos
FROM respuestaalmacenada ra
INNER JOIN partidaxpregunta pxp ON ra.idPartidaxPregunta = pxp.idPartidaxPregunta
INNER JOIN respuesta r ON ra.idRespuesta = r.idRespuesta
WHERE pxp.idPartida = :idPartida AND ra.idUsuario = :idUsuario AND r.correcta = 1";
$consulta = $conexion->prepare($sql);
$consulta->bindParam(':idPartida', $idPartida);
$consulta->bindParam(':idUsuario', $idUsuario);
$consulta->execute();
$resultado = $consulta->fetch(PDO::FETCH_ASSOC);
return (int)$resultado['aciertos'];
} catch (PDOException $error) {
return [
'error' => 'Ocurrió un error al calcular los aciertos.',
'error_tecnico' => $error->getMessage()
];
}
}
}
+142
View File
@@ -0,0 +1,142 @@
<?php
require_once '../includes/conexionBD.php';
class Usuario {
private ?int $idUsuario;
private string $nombreUsuario;
private string $contrasena;
private string $email;
private ?string $avatar;
private ?string $cookie;
private int $aciertos;
private int $victorias;
private int $derrotas;
public function __construct(
string $nombreUsuario = "",
string $contrasena = "",
string $email = "",
?string $avatar = null,
?string $cookie = null,
int $aciertos = 0,
int $victorias = 0,
int $derrotas = 0,
?int $idUsuario = null
) {
$this->idUsuario = $idUsuario;
$this->nombreUsuario = $nombreUsuario;
$this->contrasena = $contrasena;
$this->email = $email;
$this->avatar = $avatar;
$this->cookie = $cookie;
$this->aciertos = $aciertos;
$this->victorias = $victorias;
$this->derrotas = $derrotas;
}
public function getIdUsuario(): ?int { return $this->idUsuario; }
public function getNombreUsuario(): string { return $this->nombreUsuario; }
public function setNombreUsuario(string $nombreUsuario): void { $this->nombreUsuario = $nombreUsuario; }
public function getContrasena(): string { return $this->contrasena; }
public function setContrasena(string $contrasena): void { $this->contrasena = $contrasena; }
public function getEmail(): string { return $this->email; }
public function setEmail(string $email): void { $this->email = $email; }
public function getAvatar(): ?string { return $this->avatar; }
public function setAvatar(?string $avatar): void { $this->avatar = $avatar; }
public function getCookie(): ?string { return $this->cookie; }
public function setCookie(?string $cookie): void { $this->cookie = $cookie; }
public function getAciertos(): int { return $this->aciertos; }
public function setAciertos(int $aciertos): void { $this->aciertos = $aciertos; }
public function getVictorias(): int { return $this->victorias; }
public function setVictorias(int $victorias): void { $this->victorias = $victorias; }
public function getDerrotas(): int { return $this->derrotas; }
public function setDerrotas(int $derrotas): void { $this->derrotas = $derrotas; }
public function registrar() {
$conexion = conexionBD();
if (is_array($conexion)) {
return $conexion;
}
try {
$sql = "INSERT INTO usuario (nombreUsuario, contrasena, email, avatar, cookie, aciertos, victorias, derrotas)
VALUES (:nombre, :pass, :email, :avatar, :cookie, :aciertos, :victorias, :derrotas)";
$stmt = $conexion->prepare($sql);
$passHash = password_hash($this->contrasena, PASSWORD_BCRYPT);
$stmt->execute([
':nombre' => $this->nombreUsuario,
':pass' => $passHash,
':email' => $this->email,
':avatar' => $this->avatar,
':cookie' => $this->cookie,
':aciertos' => $this->aciertos,
':victorias' => $this->victorias,
':derrotas' => $this->derrotas
]);
$this->idUsuario = (int)$conexion->lastInsertId();
return [
'exito' => 'Usuario registrado correctamente',
'exito_tecnico' => $this->idUsuario
];
} catch (PDOException $error) {
return [
'error' => 'Ocurrió un error al registrar el usuario.',
'error_tecnico' => $error->getMessage()
];
}
}
public static function buscarPorId($id) {
$conexion = conexionBD();
if (is_array($conexion)) {
return $conexion;
}
try {
$sql = "SELECT * FROM usuario WHERE idUsuario = :id";
$stmt = $conexion->prepare($sql);
$stmt->execute([':id' => $id]);
$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 [
'error' => 'No se encontró ningún usuario con ese ID.'
];
} catch (PDOException $error) {
return [
'error' => 'Ocurrió un error al buscar el usuario.',
'error_tecnico' => $error->getMessage()
];
}
}
}
@@ -0,0 +1,47 @@
<?php
session_start();
require_once '../clases/ClaseEquipoxUsuario.php';
switch($_POST['orden']){
case 'registrarUsuarioEnEquipo':
if (!isset($_SESSION['idUsuario'])) {
echo json_encode([
'error' => 'No hay una sesión activa de usuario. Por favor, inicie sesión.'
]);
break;
}
$idUsuario = $_SESSION['idUsuario'];
$idEquipo = intval($_POST['idEquipo'] ?? 0);
break;
if ($idEquipo <= 0) {
echo json_encode([
'error' => 'El ID del equipo proporcionado no es válido.'
]);
break;
}
$equipoxusuario = new EquipoxUsuario();
$resultado = $equipoxusuario->registrarUsuarioEnEquipo($idEquipo, $idUsuario);
echo json_encode($resultado);
break;
case 'listarUsuariosPorEquipo':
$idEquipo = intval($_POST['idEquipo'] ?? 0);
if ($idEquipo <= 0) {
echo json_encode(['error' => 'ID de equipo no válido']);
break;
}
$equipoxusuario = new EquipoxUsuario();
$listado = $equipoxusuario->listarUsuariosPorEquipo($idEquipo);
break;
echo json_encode($listado);
break;
}
?>
+86
View File
@@ -0,0 +1,86 @@
<?php
session_start();
require_once '../clases/Usuario.php';
switch ($_POST['orden']) {
case 'registrarUsuario':
$nombreUsuario = trim($_POST['nombreUsuario'] ?? '');
$email = trim($_POST['email'] ?? '');
$contrasena = $_POST['contrasena'] ?? '';
if ($nombreUsuario == '' || $email == '' || $contrasena == '') {
echo json_encode([
'error' => 'Todos los campos son obligatorios'
]);
break;
}
$usuarioExistente = Usuario::buscarPorEmail($email);
if ($usuarioExistente instanceof Usuario) {
echo json_encode([
'error' => 'Ya existe una cuenta con ese correo electrónico'
]);
break;
}
$usuario = new Usuario(
$nombreUsuario,
$contrasena,
$email
);
$resultado = $usuario->registrar();
echo json_encode($resultado);
break;
case 'comprobarUsuario':
$email = trim($_POST['email'] ?? '');
$contrasena = $_POST['contrasena'] ?? '';
$resultado = Usuario::login($email, $contrasena);
if ($resultado instanceof Usuario) {
$_SESSION['idUsuario'] = $resultado->getIdUsuario();
$_SESSION['email'] = $resultado->getEmail();
$_SESSION['nombreUsuario'] = $resultado->getNombreUsuario();
echo json_encode([
'exito' => 'Login correcto',
'idUsuario' => $resultado->getIdUsuario(),
'nombreUsuario' => $resultado->getNombreUsuario()
]);
} else {
echo json_encode([
'error' => 'Usuario o contraseña incorrectos'
]);
}
break;
case 'cerrarSesion':
session_destroy();
echo json_encode([
'exito' => 'Sesión cerrada'
]);
break;
}
+29
View File
@@ -0,0 +1,29 @@
<?php
function conexionBD() {
// Configuración para Laragon
$servidor = "localhost";
$bd = "triviagmatico"; // Asegúrate de que este sea el nombre de tu BD en HeidiSQL / phpMyAdmin
$usuario = "root";
$pass = ""; // Laragon deja la contraseña de root vacía por defecto
$puerto = "3306";
try {
$dsn = "mysql:host=$servidor;port=$puerto;dbname=$bd;charset=utf8mb4";
$opciones = [
PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC,
PDO::ATTR_EMULATE_PREPARES => false,
];
return new PDO($dsn, $usuario, $pass, $opciones);
} catch (PDOException $error) {
return [
'error' => 'No se pudo conectar a la base de datos.',
'error_tecnico' => $error->getMessage()
];
}
}
?>
+6 -4
View File
@@ -1,29 +1,31 @@
REQUISITOS CONTROLADORES
Orden “RegistrarUsuario“
registrarUsuario(nombre, email, password) inserta un usuario en la bbdd, hay que comprobar que en la tabla usuario no hay una cuenta con el correo electronico
Orden “ComprobarUsuario“
comprobarUsuario(email, password) comprueba si el usuario introducido se encuentra en la bbdd para poder iniciar sesion, hay que actualizar las variables de sesion para guardar su email y su id de la bbdd.
Orden “RankingGlobal“
rankingGlobal() recupera los 5 usuarios con mas puntos ordenados por el maximo de puntos
Orden "CrearSala"
crearSala(nombreSala, nombreEquipo1, nombreEquipo2) inserta en la bbdd una sala y asigna al usuario que la crea a equipo 1
Orden “BuscarSalas“
buscarSala() recupera todas las salas activas a las que el usuario se puede unir, devuelve nombre de sala, nombre de equipo, **id equipo**(todos los equipos), nombre usuarios.
Orden “AsignarUsuario“
asignarUsuario(**id equipo**, id usuario(variable de sesion)) cuando el usuario pulsa el boton de unirse asigna al equipo dicho usuario
Orden “BuscarSalaUsuarioActivo“
buscarSalaUsuarioActivo(**id equipo)** recarga la pagina para solo mostrar la sala en la que se encuentra el usuario
Orden “CargarPreguntasyRespuestas“
cargarPreguntasyRespuestas() recupera todas las preguntas de la partida (10 preguntas por partida), devuelve un json con las preguntas, las 4 respuestas
Orden ”ComprobarRespuesta”
comprobarRespuesta(idRespuesta, idUsuario, tiempo) comprueba si el usuario ha pulsado sobre la respuesta correcta o incorrecta, devuelve si es correcta o incorrecta
Orden "ComprobarEquipoGanador"
comprobarEquipoGanador() comprueba cual de los dos equipos gana, devuelve un json con la puntuacion global, nombre de equipos, nombre de usuarios y puntuacion de cada usuario, actualiza el ranking global de usuarios