Files
triviagmatico/clasePartida.php
T
2026-09-24 10:05:39 +02:00

332 lines
10 KiB
PHP

<?php
require_once '../includes/conexion.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
];
}
}
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
];
}
}
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
];
}
}
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
];
}
}
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
];
}
}
/**
* 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
];
}
}
/**
* 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
];
}
}
//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
];
}
}
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
];
}
}
/**
* 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
];
}
}
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
];
}
}
}
?>