Renombrar clases y controladores

This commit is contained in:
2026-09-30 09:08:23 +02:00
parent 87c8ea871a
commit 98b383d16f
19 changed files with 2495 additions and 2495 deletions
@@ -1,269 +1,269 @@
<?php
require_once __DIR__ . '/../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()
];
}
}
public function obtenerSalaUsuario($idUsuario)
{
$conexion = conexionBD();
if (is_array($conexion)) {
return $conexion;
}
try {
$sql = "
SELECT
exu.idEquipo,
exp.idPartida
FROM equipoxusuario exu
INNER JOIN equipoxpartida exp
ON exu.idEquipo = exp.idEquipo
WHERE exu.idUsuario = :idUsuario
LIMIT 1
";
$consulta = $conexion->prepare($sql);
$consulta->bindParam(
':idUsuario',
$idUsuario,
PDO::PARAM_INT
);
$consulta->execute();
$resultado = $consulta->fetch(PDO::FETCH_ASSOC);
if (!$resultado) {
return [
'asociado' => false
];
}
return [
'asociado' => true,
'idEquipo' => $resultado['idEquipo'],
'idPartida' => $resultado['idPartida']
];
} catch (PDOException $error) {
return [
'error' => 'Ocurrió un error al obtener la sala del usuario.',
'error_tecnico' => $error->getMessage()
];
}
}
public static function salirDeSala($idUsuario)
{
$conexion = conexionBD();
if (is_array($conexion)) {
return $conexion;
}
try {
// 1. Averiguamos el equipo y la partida del usuario
$sql = "SELECT exu.idEquipo, exp.idPartida, p.idUsuario AS idHost FROM equipoxusuario exu INNER JOIN equipoxpartida exp ON exu.idEquipo = exp.idEquipo INNER JOIN partida p ON exp.idPartida = p.idPartida WHERE exu.idUsuario = :idUsuario LIMIT 1";
$consulta = $conexion->prepare($sql);
$consulta->bindParam(':idUsuario',$idUsuario, PDO::PARAM_INT);
$consulta->execute();
$datosSala = $consulta->fetch(PDO::FETCH_ASSOC);
// El usuario no pertenece a ninguna sala
if (!$datosSala) {
return [
'error' => 'No perteneces a ninguna sala.'
];
}
$idEquipo = (int)$datosSala['idEquipo'];
$idPartida = (int)$datosSala['idPartida'];
$idHost = (int)$datosSala['idHost'];
// Comenzamos una transacción
$conexion->beginTransaction();
/*
* 2. Comprobamos si quien abandona es el HOST
*/
if ($idUsuario === $idHost) {
/*
* Obtenemos todos los equipos pertenecientes
* a esta partida.
*/
$sqlEquipos = "SELECT idEquipo FROM equipoxpartida WHERE idPartida = :idPartida";
$consultaEquipos = $conexion->prepare($sqlEquipos);
$consultaEquipos->bindParam(':idPartida', $idPartida, PDO::PARAM_INT);
$consultaEquipos->execute();
$equipos = $consultaEquipos->fetchAll(PDO::FETCH_COLUMN);
/*
* 3. Eliminamos los jugadores de esos equipos
* de la tabla equipoxusuario.
*/
if (!empty($equipos)) {
$placeholders = implode(',', array_fill(0, count($equipos), '?'));
$sqlUsuarios = "DELETE FROM equipoxusuario WHERE idEquipo IN ($placeholders)";
$consultaUsuarios = $conexion->prepare($sqlUsuarios);
$consultaUsuarios->execute($equipos);
}
/*
* 4. Eliminamos las relaciones
* entre equipos y partida.
*/
$sqlEquipoxPartida = "DELETE FROM equipoxpartida WHERE idPartida = :idPartida";
$consultaEquipoxPartida = $conexion->prepare($sqlEquipoxPartida);
$consultaEquipoxPartida->bindParam(':idPartida', $idPartida,PDO::PARAM_INT);
$consultaEquipoxPartida->execute();
/*
* 5. Eliminamos los equipos.
*
* Los equipos ya no tienen relaciones con
* usuarios ni con la partida.
*/
if (!empty($equipos)) {
$placeholders = implode(',', array_fill(0, count($equipos), '?'));
$sqlEliminarEquipos = "DELETE FROM equipo WHERE idEquipo IN ($placeholders)";
$consultaEliminarEquipos = $conexion->prepare($sqlEliminarEquipos);
$consultaEliminarEquipos->execute($equipos);
}
/*
* 6. Eliminamos las relaciones
* entre preguntas y partida.
*/
$sqlPartidaxPregunta = "DELETE FROM partidaxpregunta WHERE idPartida = :idPartida";
$consultaPartidaxPregunta = $conexion->prepare($sqlPartidaxPregunta);
$consultaPartidaxPregunta->bindParam(':idPartida', $idPartida, PDO::PARAM_INT);
$consultaPartidaxPregunta->execute();
/*
* 7. Finalmente eliminamos la partida.
*/
$sqlPartida = "DELETE FROM partida WHERE idPartida = :idPartida";
$consultaPartida = $conexion->prepare($sqlPartida);
$consultaPartida->bindParam(':idPartida', $idPartida, PDO::PARAM_INT);
$consultaPartida->execute();
// Todo ha ido correctamente
$conexion->commit();
return [
'exito' => true,
'salaEliminada' => true,
'mensaje' => 'La sala ha sido eliminada correctamente.'
];
}
/*
* 7. Si NO es el host, simplemente abandona
* su relación con el equipo.
*/
$sqlSalir = "DELETE FROM equipoxusuario WHERE idUsuario = :idUsuario";
$consultaSalir = $conexion->prepare($sqlSalir);
$consultaSalir->bindParam(':idUsuario', $idUsuario, PDO::PARAM_INT);
$consultaSalir->execute();
$conexion->commit();
return [
'exito' => true,
'salaEliminada' => false,
'mensaje' => 'Has abandonado la sala correctamente.'
];
} catch (PDOException $error) {
// Si había una transacción activa, la deshacemos
if ($conexion->inTransaction()) {
$conexion->rollBack();
}
return [
'error' => 'Ocurrió un error al abandonar la sala.',
'error_tecnico' => $error->getMessage()
];
}
}
}
<?php
require_once __DIR__ . '/../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()
];
}
}
public function obtenerSalaUsuario($idUsuario)
{
$conexion = conexionBD();
if (is_array($conexion)) {
return $conexion;
}
try {
$sql = "
SELECT
exu.idEquipo,
exp.idPartida
FROM equipoxusuario exu
INNER JOIN equipoxpartida exp
ON exu.idEquipo = exp.idEquipo
WHERE exu.idUsuario = :idUsuario
LIMIT 1
";
$consulta = $conexion->prepare($sql);
$consulta->bindParam(
':idUsuario',
$idUsuario,
PDO::PARAM_INT
);
$consulta->execute();
$resultado = $consulta->fetch(PDO::FETCH_ASSOC);
if (!$resultado) {
return [
'asociado' => false
];
}
return [
'asociado' => true,
'idEquipo' => $resultado['idEquipo'],
'idPartida' => $resultado['idPartida']
];
} catch (PDOException $error) {
return [
'error' => 'Ocurrió un error al obtener la sala del usuario.',
'error_tecnico' => $error->getMessage()
];
}
}
public static function salirDeSala($idUsuario)
{
$conexion = conexionBD();
if (is_array($conexion)) {
return $conexion;
}
try {
// 1. Averiguamos el equipo y la partida del usuario
$sql = "SELECT exu.idEquipo, exp.idPartida, p.idUsuario AS idHost FROM equipoxusuario exu INNER JOIN equipoxpartida exp ON exu.idEquipo = exp.idEquipo INNER JOIN partida p ON exp.idPartida = p.idPartida WHERE exu.idUsuario = :idUsuario LIMIT 1";
$consulta = $conexion->prepare($sql);
$consulta->bindParam(':idUsuario',$idUsuario, PDO::PARAM_INT);
$consulta->execute();
$datosSala = $consulta->fetch(PDO::FETCH_ASSOC);
// El usuario no pertenece a ninguna sala
if (!$datosSala) {
return [
'error' => 'No perteneces a ninguna sala.'
];
}
$idEquipo = (int)$datosSala['idEquipo'];
$idPartida = (int)$datosSala['idPartida'];
$idHost = (int)$datosSala['idHost'];
// Comenzamos una transacción
$conexion->beginTransaction();
/*
* 2. Comprobamos si quien abandona es el HOST
*/
if ($idUsuario === $idHost) {
/*
* Obtenemos todos los equipos pertenecientes
* a esta partida.
*/
$sqlEquipos = "SELECT idEquipo FROM equipoxpartida WHERE idPartida = :idPartida";
$consultaEquipos = $conexion->prepare($sqlEquipos);
$consultaEquipos->bindParam(':idPartida', $idPartida, PDO::PARAM_INT);
$consultaEquipos->execute();
$equipos = $consultaEquipos->fetchAll(PDO::FETCH_COLUMN);
/*
* 3. Eliminamos los jugadores de esos equipos
* de la tabla equipoxusuario.
*/
if (!empty($equipos)) {
$placeholders = implode(',', array_fill(0, count($equipos), '?'));
$sqlUsuarios = "DELETE FROM equipoxusuario WHERE idEquipo IN ($placeholders)";
$consultaUsuarios = $conexion->prepare($sqlUsuarios);
$consultaUsuarios->execute($equipos);
}
/*
* 4. Eliminamos las relaciones
* entre equipos y partida.
*/
$sqlEquipoxPartida = "DELETE FROM equipoxpartida WHERE idPartida = :idPartida";
$consultaEquipoxPartida = $conexion->prepare($sqlEquipoxPartida);
$consultaEquipoxPartida->bindParam(':idPartida', $idPartida,PDO::PARAM_INT);
$consultaEquipoxPartida->execute();
/*
* 5. Eliminamos los equipos.
*
* Los equipos ya no tienen relaciones con
* usuarios ni con la partida.
*/
if (!empty($equipos)) {
$placeholders = implode(',', array_fill(0, count($equipos), '?'));
$sqlEliminarEquipos = "DELETE FROM equipo WHERE idEquipo IN ($placeholders)";
$consultaEliminarEquipos = $conexion->prepare($sqlEliminarEquipos);
$consultaEliminarEquipos->execute($equipos);
}
/*
* 6. Eliminamos las relaciones
* entre preguntas y partida.
*/
$sqlPartidaxPregunta = "DELETE FROM partidaxpregunta WHERE idPartida = :idPartida";
$consultaPartidaxPregunta = $conexion->prepare($sqlPartidaxPregunta);
$consultaPartidaxPregunta->bindParam(':idPartida', $idPartida, PDO::PARAM_INT);
$consultaPartidaxPregunta->execute();
/*
* 7. Finalmente eliminamos la partida.
*/
$sqlPartida = "DELETE FROM partida WHERE idPartida = :idPartida";
$consultaPartida = $conexion->prepare($sqlPartida);
$consultaPartida->bindParam(':idPartida', $idPartida, PDO::PARAM_INT);
$consultaPartida->execute();
// Todo ha ido correctamente
$conexion->commit();
return [
'exito' => true,
'salaEliminada' => true,
'mensaje' => 'La sala ha sido eliminada correctamente.'
];
}
/*
* 7. Si NO es el host, simplemente abandona
* su relación con el equipo.
*/
$sqlSalir = "DELETE FROM equipoxusuario WHERE idUsuario = :idUsuario";
$consultaSalir = $conexion->prepare($sqlSalir);
$consultaSalir->bindParam(':idUsuario', $idUsuario, PDO::PARAM_INT);
$consultaSalir->execute();
$conexion->commit();
return [
'exito' => true,
'salaEliminada' => false,
'mensaje' => 'Has abandonado la sala correctamente.'
];
} catch (PDOException $error) {
// Si había una transacción activa, la deshacemos
if ($conexion->inTransaction()) {
$conexion->rollBack();
}
return [
'error' => 'Ocurrió un error al abandonar la sala.',
'error_tecnico' => $error->getMessage()
];
}
}
}
@@ -1,132 +1,132 @@
<?php
require_once __DIR__ . '/../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()
];
}
}
public static function getTodosIds()//devuelve solamente los id de todas las preguntas
{
$conexion = conexionBD();
if (is_array($conexion)) {
return $conexion;
}
try {
$consulta = $conexion->prepare("SELECT idPregunta FROM pregunta");
$consulta->execute();
return $consulta->fetchAll(PDO::FETCH_COLUMN);
} catch (PDOException $error) {
return [
"error" => "Ocurrió un error al obtener el listado.",
'error_tecnico' => $error->getMessage()
];
}
}
<?php
require_once __DIR__ . '/../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()
];
}
}
public static function getTodosIds()//devuelve solamente los id de todas las preguntas
{
$conexion = conexionBD();
if (is_array($conexion)) {
return $conexion;
}
try {
$consulta = $conexion->prepare("SELECT idPregunta FROM pregunta");
$consulta->execute();
return $consulta->fetchAll(PDO::FETCH_COLUMN);
} catch (PDOException $error) {
return [
"error" => "Ocurrió un error al obtener el listado.",
'error_tecnico' => $error->getMessage()
];
}
}
}
@@ -1,76 +1,76 @@
<?php
require_once __DIR__ . '/../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 function __construct($idRespuestaAlmacenada = null, $idPartidaxPregunta = null, $idUsuario = null, $idRespuesta = null) {
$this->idRespuestaAlmacenada = $idRespuestaAlmacenada;
$this->idPartidaxPregunta = $idPartidaxPregunta;
$this->idUsuario = $idUsuario;
$this->idRespuesta = $idRespuesta;
}
/**
* 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)
VALUES (:idPartidaxPregunta, :idUsuario, :idRespuesta)";
$consulta = $conexion->prepare($sql);
$consulta->bindParam(':idPartidaxPregunta', $this->idPartidaxPregunta);
$consulta->bindParam(':idUsuario', $this->idUsuario);
$consulta->bindParam(':idRespuesta', $this->idRespuesta);
$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()
];
}
}
}
<?php
require_once __DIR__ . '/../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 function __construct($idRespuestaAlmacenada = null, $idPartidaxPregunta = null, $idUsuario = null, $idRespuesta = null) {
$this->idRespuestaAlmacenada = $idRespuestaAlmacenada;
$this->idPartidaxPregunta = $idPartidaxPregunta;
$this->idUsuario = $idUsuario;
$this->idRespuesta = $idRespuesta;
}
/**
* 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)
VALUES (:idPartidaxPregunta, :idUsuario, :idRespuesta)";
$consulta = $conexion->prepare($sql);
$consulta->bindParam(':idPartidaxPregunta', $this->idPartidaxPregunta);
$consulta->bindParam(':idUsuario', $this->idUsuario);
$consulta->bindParam(':idRespuesta', $this->idRespuesta);
$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()
];
}
}
}
@@ -1,474 +1,474 @@
<?php
require_once __DIR__ . '/../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()
];
}
}
public static function buscarPorEmail($email)
{
$conexion = conexionBD();
if (is_array($conexion)) {
return $conexion;
}
try {
$sql = "SELECT * FROM usuario WHERE email = :email";
$stmt = $conexion->prepare($sql);
$stmt->execute([':email' => $email]);
$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 null; // No existe usuario con ese email
} catch (PDOException $error) {
return [
'error' => 'Ocurrió un error al buscar el usuario por email.',
'error_tecnico' => $error->getMessage()
];
}
}
public static function login($email, $contrasena)
{
$usuario = self::buscarPorEmail($email);
// El usuario no existe
if (!($usuario instanceof Usuario)) {
// Limpiamos posibles datos de sesión anteriores
unset($_SESSION['idUsuario']);
unset($_SESSION['email']);
unset($_SESSION['nombreUsuario']);
unset($_SESSION['avatar']);
return null;
}
// Comprobamos la contraseña
if (password_verify($contrasena, $usuario->getContrasena())) {
// Usuario validado correctamente
$_SESSION['idUsuario'] = $usuario->getIdUsuario();
$_SESSION['email'] = $usuario->getEmail();
$_SESSION['nombreUsuario'] = $usuario->getNombreUsuario();
$_SESSION['avatar'] = $usuario->getAvatar();
// Devolvemos el usuario como hasta ahora
return $usuario;
}
// Contraseña incorrecta
unset($_SESSION['idUsuario']);
unset($_SESSION['email']);
unset($_SESSION['nombreUsuario']);
unset($_SESSION['avatar']);
return null;
}
// Cookies
public static function guardarCookieToken($idUsuario, $token)
{
$conexion = conexionBD();
if (is_array($conexion)) return false;
try {
$sql = "UPDATE usuario SET cookie = :token WHERE idUsuario = :id";
$stmt = $conexion->prepare($sql);
return $stmt->execute([
':token' => $token,
':id' => $idUsuario
]);
} catch (PDOException $e) {
return false;
}
}
public static function buscarPorCookie($token)
{
if (empty($token)) return null;
$conexion = conexionBD();
if (is_array($conexion)) return null;
try {
$sql = "SELECT * FROM usuario WHERE cookie = :token AND cookie IS NOT NULL";
$stmt = $conexion->prepare($sql);
$stmt->execute([':token' => $token]);
$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 null;
} catch (PDOException $e) {
return null;
}
}
public function cambiarNombre($nuevoNombre)
{
$conexion = conexionBD();
if (is_array($conexion)) {
return $conexion;
}
try {
$sql = "UPDATE usuario
SET nombreUsuario = :nombre
WHERE idUsuario = :id";
$stmt = $conexion->prepare($sql);
$stmt->execute([
':nombre' => $nuevoNombre,
':id' => $this->idUsuario
]);
// Actualizamos también el objeto actual
$this->nombreUsuario = $nuevoNombre;
return [
'exito' => 'Nombre actualizado correctamente.'
];
} catch (PDOException $error) {
return [
'error' => 'Ocurrió un error al actualizar el nombre.',
'error_tecnico' => $error->getMessage()
];
}
}
public function cambiarAvatar($archivo)
{
$carpeta = __DIR__ . '/../img/avatars/';
// Creamos la carpeta si no existe
if (!is_dir($carpeta)) {
mkdir($carpeta, 0755, true);
}
// Obtenemos la extensión según el tipo MIME
$tipo = mime_content_type($archivo['tmp_name']);
$extensiones = [
'image/jpeg' => 'jpg',
'image/png' => 'png',
'image/gif' => 'gif',
'image/webp' => 'webp'
];
if (!isset($extensiones[$tipo])) {
return [
'error' => 'Formato de imagen no permitido.'
];
}
$extension = $extensiones[$tipo];
// Nombre único para evitar conflictos
$nombreArchivo = 'avatar_' . $this->idUsuario . '.' . $extension;
$rutaCompleta = $carpeta . $nombreArchivo;
// Guardamos la imagen
if (!move_uploaded_file($archivo['tmp_name'], $rutaCompleta)) {
return [
'error' => 'No se pudo guardar la imagen.'
];
}
// Ruta que utilizará el HTML
$rutaAvatar = 'img/avatars/' . $nombreArchivo;
$conexion = conexionBD();
if (is_array($conexion)) {
return $conexion;
}
try {
$sql = "UPDATE usuario
SET avatar = :avatar
WHERE idUsuario = :id";
$stmt = $conexion->prepare($sql);
$stmt->execute([
':avatar' => $rutaAvatar,
':id' => $this->idUsuario
]);
// Actualizamos también el objeto actual
$this->avatar = $rutaAvatar;
return [
'exito' => 'Avatar actualizado correctamente.',
'avatar' => $rutaAvatar
];
} catch (PDOException $error) {
return [
'error' => 'Ocurrió un error al actualizar el avatar.',
'error_tecnico' => $error->getMessage()
];
}
}
public static function obtenerRanking($limite = 10)
{
try {
$conexion = conexionBD();
if (is_array($conexion)) {
return [];
}
$sql = "SELECT
idUsuario,
nombreUsuario,
avatar,
aciertos,
victorias,
derrotas,
CASE
WHEN (victorias + derrotas) > 0
THEN ROUND((victorias / (victorias + derrotas)) * 100, 0)
ELSE 0
END AS porcentajeVictoria
FROM usuario
ORDER BY victorias DESC, aciertos DESC
LIMIT " . (int)$limite;
$stmt = $conexion->prepare($sql);
$stmt->execute();
return $stmt->fetchAll(PDO::FETCH_ASSOC);
} catch (PDOException $e) {
return [];
}
}
<?php
require_once __DIR__ . '/../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()
];
}
}
public static function buscarPorEmail($email)
{
$conexion = conexionBD();
if (is_array($conexion)) {
return $conexion;
}
try {
$sql = "SELECT * FROM usuario WHERE email = :email";
$stmt = $conexion->prepare($sql);
$stmt->execute([':email' => $email]);
$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 null; // No existe usuario con ese email
} catch (PDOException $error) {
return [
'error' => 'Ocurrió un error al buscar el usuario por email.',
'error_tecnico' => $error->getMessage()
];
}
}
public static function login($email, $contrasena)
{
$usuario = self::buscarPorEmail($email);
// El usuario no existe
if (!($usuario instanceof Usuario)) {
// Limpiamos posibles datos de sesión anteriores
unset($_SESSION['idUsuario']);
unset($_SESSION['email']);
unset($_SESSION['nombreUsuario']);
unset($_SESSION['avatar']);
return null;
}
// Comprobamos la contraseña
if (password_verify($contrasena, $usuario->getContrasena())) {
// Usuario validado correctamente
$_SESSION['idUsuario'] = $usuario->getIdUsuario();
$_SESSION['email'] = $usuario->getEmail();
$_SESSION['nombreUsuario'] = $usuario->getNombreUsuario();
$_SESSION['avatar'] = $usuario->getAvatar();
// Devolvemos el usuario como hasta ahora
return $usuario;
}
// Contraseña incorrecta
unset($_SESSION['idUsuario']);
unset($_SESSION['email']);
unset($_SESSION['nombreUsuario']);
unset($_SESSION['avatar']);
return null;
}
// Cookies
public static function guardarCookieToken($idUsuario, $token)
{
$conexion = conexionBD();
if (is_array($conexion)) return false;
try {
$sql = "UPDATE usuario SET cookie = :token WHERE idUsuario = :id";
$stmt = $conexion->prepare($sql);
return $stmt->execute([
':token' => $token,
':id' => $idUsuario
]);
} catch (PDOException $e) {
return false;
}
}
public static function buscarPorCookie($token)
{
if (empty($token)) return null;
$conexion = conexionBD();
if (is_array($conexion)) return null;
try {
$sql = "SELECT * FROM usuario WHERE cookie = :token AND cookie IS NOT NULL";
$stmt = $conexion->prepare($sql);
$stmt->execute([':token' => $token]);
$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 null;
} catch (PDOException $e) {
return null;
}
}
public function cambiarNombre($nuevoNombre)
{
$conexion = conexionBD();
if (is_array($conexion)) {
return $conexion;
}
try {
$sql = "UPDATE usuario
SET nombreUsuario = :nombre
WHERE idUsuario = :id";
$stmt = $conexion->prepare($sql);
$stmt->execute([
':nombre' => $nuevoNombre,
':id' => $this->idUsuario
]);
// Actualizamos también el objeto actual
$this->nombreUsuario = $nuevoNombre;
return [
'exito' => 'Nombre actualizado correctamente.'
];
} catch (PDOException $error) {
return [
'error' => 'Ocurrió un error al actualizar el nombre.',
'error_tecnico' => $error->getMessage()
];
}
}
public function cambiarAvatar($archivo)
{
$carpeta = __DIR__ . '/../img/avatars/';
// Creamos la carpeta si no existe
if (!is_dir($carpeta)) {
mkdir($carpeta, 0755, true);
}
// Obtenemos la extensión según el tipo MIME
$tipo = mime_content_type($archivo['tmp_name']);
$extensiones = [
'image/jpeg' => 'jpg',
'image/png' => 'png',
'image/gif' => 'gif',
'image/webp' => 'webp'
];
if (!isset($extensiones[$tipo])) {
return [
'error' => 'Formato de imagen no permitido.'
];
}
$extension = $extensiones[$tipo];
// Nombre único para evitar conflictos
$nombreArchivo = 'avatar_' . $this->idUsuario . '.' . $extension;
$rutaCompleta = $carpeta . $nombreArchivo;
// Guardamos la imagen
if (!move_uploaded_file($archivo['tmp_name'], $rutaCompleta)) {
return [
'error' => 'No se pudo guardar la imagen.'
];
}
// Ruta que utilizará el HTML
$rutaAvatar = 'img/avatars/' . $nombreArchivo;
$conexion = conexionBD();
if (is_array($conexion)) {
return $conexion;
}
try {
$sql = "UPDATE usuario
SET avatar = :avatar
WHERE idUsuario = :id";
$stmt = $conexion->prepare($sql);
$stmt->execute([
':avatar' => $rutaAvatar,
':id' => $this->idUsuario
]);
// Actualizamos también el objeto actual
$this->avatar = $rutaAvatar;
return [
'exito' => 'Avatar actualizado correctamente.',
'avatar' => $rutaAvatar
];
} catch (PDOException $error) {
return [
'error' => 'Ocurrió un error al actualizar el avatar.',
'error_tecnico' => $error->getMessage()
];
}
}
public static function obtenerRanking($limite = 10)
{
try {
$conexion = conexionBD();
if (is_array($conexion)) {
return [];
}
$sql = "SELECT
idUsuario,
nombreUsuario,
avatar,
aciertos,
victorias,
derrotas,
CASE
WHEN (victorias + derrotas) > 0
THEN ROUND((victorias / (victorias + derrotas)) * 100, 0)
ELSE 0
END AS porcentajeVictoria
FROM usuario
ORDER BY victorias DESC, aciertos DESC
LIMIT " . (int)$limite;
$stmt = $conexion->prepare($sql);
$stmt->execute();
return $stmt->fetchAll(PDO::FETCH_ASSOC);
} catch (PDOException $e) {
return [];
}
}
}