Sélectionner une révision Git
-
Eliah REBSTOCK a rédigéEliah REBSTOCK a rédigé
Partie.php 8,47 Kio
<?php
include_once("ELO_function.php");
/**
* Created by PhpStorm.
* User: phoenix
* Date: 25/04/16
* Time: 15:27
*/
class Partie extends Model
{
public $joueurs, $scores, $lejeu, $date, $slug;
public static function getFromSlug($slug_partie)
{
$db = Database::getInstance();
$sql = "SELECT * FROM R_partie WHERE slug = :slug";
$stmt = $db->prepare($sql);
$stmt->setFetchMode(PDO::FETCH_CLASS, "Partie"); // règle le type dans lequel on doit mettre les données (PDO va chercher les attributs de la classe de même nom que ses colonnes de BDD et mettre dedans les valeurs correspondantes)
$stmt->execute(array(":slug" => $slug_partie));
return $stmt->fetch();
}
public static function getList()
{
$db = Database::getInstance();
$sql = "SELECT * FROM R_partie";
$stmt = $db->query($sql);
$stmt->setFetchMode(PDO::FETCH_CLASS, "Partie");
return $stmt->fetchAll();
}
public static function checkExists($slug_partie)
{ // méthode permettant de vérifier si une partie existe dans la BDD
$db = Database::getInstance(); // on récupère la connexion à la BDD
$sql = "SELECT * FROM R_partie WHERE slug = :slug";
$req = $db->prepare($sql); // on prépare la requête
$req->execute(array(":slug" => $slug_partie)); // on remplace les variables dans la requête
if ($result = $req->fetch()) { // on récupère l'enregistrement, s'il existe
return true;
}
return false; // on aurait pu mettre deux return (un dans le if et un ici), mais bon...
}
private static function calcul_classement($R)
{
$m = count($R);
$R_classement = array_fill(0, $m, 0);
arsort($R);
$i = 1;
foreach ($R as $k => $val) {
$R_classement[$k] = $i;
$i++;
}
return $R_classement;
}
public static function updateClassement($jeu)
{
$db = Database::getInstance();
$sql1 = "SELECT joueur FROM R_joueur_jeu ORDER BY score DESC";
$sql2 = "UPDATE R_joueur_jeu SET classement = :classement WHERE joueur = :joueur AND jeu = :jeu;";
$stmt1 = $db->prepare($sql1);
$stmt2 = $db->prepare($sql2);
if ($stmt1->execute()) {
$i = 1;
while ($row = $stmt1->fetch()) {
if ($stmt2->execute(array(":classement" => $i, ":joueur" => $row['joueur'], ":jeu" => $jeu->slug))) {
} else {
return 2;
}
$i++;
}
} else {
return 2;
}
return 0;
}
public static function addPartie($joueurs, $scores, $jeu)
{
$db = Database::getInstance();
$datestr = date("Y-m-d H:i:s");
$sql1 = "INSERT INTO R_partie (jeu, date) VALUES (:id_jeu, :date);";
$sql2 = "SELECT id FROM R_partie WHERE jeu = :id_jeu AND date = :date;";
$sql3 = "SELECT score FROM R_joueur_jeu WHERE joueur = :id_joueur AND jeu = :id_jeu;";
$sql4 = "INSERT INTO R_joueur_partie (partie, joueur, classement, score)
VALUES (:partie, :joueur,:classement, :score);";
$sql5 = "UPDATE R_joueur_jeu SET score = :new_score WHERE joueur = :id_joueur AND jeu = :id_jeu;";
$sqlN = "INSERT INTO R_joueur_jeu (joueur, jeu, score) VALUES (:id_joueur, :id_jeu, :score);";
$stmt1 = $db->prepare($sql1);
$stmt2 = $db->prepare($sql2);
$stmt3 = $db->prepare($sql3);
$stmt4 = $db->prepare($sql4);
$stmt5 = $db->prepare($sql5);
if ($stmt1->execute(array(":id_jeu" => $jeu->slug, ":date" => $datestr))) {
// insertion d'une nouvelle partie
// on suppose que si l'insertion fonctionne, la lecture aussi, donc que les droits d'accés sont bons
$stmt2->execute(array(":id_jeu" => $jeu->slug, ":date" => $datestr));
$id_partie = $stmt2->fetch()['id'];
$m = count($scores);
$old_score = array_fill(0, $m, 0);
$old_score_e = array();
foreach ($joueurs as $k => $joueur) {
// version avec équipes
if ($jeu->type == 'equipes') {
$old_score_e[$k] = array();
foreach ($joueur as $kj => $j) {
if ($stmt3->execute(array(":id_joueur" => $j->slug, ":id_jeu" => $jeu->slug))) {
if ($row = $stmt3->fetch()) {
// Le joueur a déja joué à ce jeu
$old_score_e[$k][$kj] = $row[0];
} else {
// ou le joueur n'a jamais joué à ce jeu, on je rajoute à la relation.
$old_score_e[$k][$kj] = 1000;
$stmtN = $db->prepare($sqlN);
if ($stmtN->execute(array(":id_joueur" => $j->slug, ":id_jeu" => $jeu->slug, ":score" => 1000))) {
} else
return 2;
}
}
}
$old_score[$k] = array_sum($old_score_e[$k]) / count($old_score_e[$k]);
} else {
// récupération du score actuel de chaque joueur
if ($stmt3->execute(array(":id_joueur" => $joueur->slug, ":id_jeu" => $jeu->slug))) {
if ($row = $stmt3->fetch()) {
// Le joueur a déja joué à ce jeu
$old_score[$k] = $row[0];
} else {
// ou le joueur n'a jamais joué à ce jeu, on je rajoute à la relation.
$old_score[$k] = 1000;
$stmtN = $db->prepare($sqlN);
if ($stmtN->execute(array(":id_joueur" => $joueur->slug, ":id_jeu" => $jeu->slug, ":score" => 1000))) {
} else
return 2;
}
}
}
}
// Calcul de la nouvelle différence de scores et du classement de chacun dans la partie
$diff_scores = ELO_scores($old_score, $scores, 32);
$classement = self::calcul_classement($diff_scores);
foreach ($joueurs as $k => $joueur) {
if ($jeu->type == 'equipes') {
foreach ($joueur as $kj => $j) {
// Insertion des infos de la partie (avec le score avant la partie et le classement interne à la partie)
// pour chaque joueur
if ($stmt4->execute(array(":partie" => $id_partie,
":joueur" => $j->slug,
":classement" => $classement[$k], ":score" => $old_score_e[$k][$kj]))
) {
$newS = $old_score_e[$k][$kj] + $diff_scores[$k];
// On met à jour le score du joueur actuel dans sa relation avec le jeu
if ($stmt5->execute(array(":new_score" => $newS,
":id_jeu" => $jeu->slug, ":id_joueur" => $j->slug))
) {
} else
return 2;
} else
return 2;
}
} else {
// Insertion des infos de la partie (avec le score avant la partie et le classement interne à la partie)
// pour chaque joueur
if ($stmt4->execute(array(":partie" => $id_partie,
":joueur" => $joueur->slug,
":classement" => $classement[$k], ":score" => $old_score[$k]))
) {
$newS = $old_score[$k] + $diff_scores[$k];
// On met à jour le score du joueur actuel dans sa relation avec le jeu
if ($stmt5->execute(array(":new_score" => $newS,
":id_jeu" => $jeu->slug, ":id_joueur" => $joueur->slug))
) {
} else
return 2;
} else
return 2;
}
}
} else
return 2;
// met à jour le classement de tous les joueurs
return self::updateClassement($jeu);
}
}