1. Introduction

Le basket a été inventé en1891 par James Naismith, il s'agit d' un sport collectif qui oppose deux équipes, chaque équipe est composée de minimum 5 joueurs. Ce jeu nécessite de la stratégie basée sur les compétences de chaque joueur ainsi que les compétences globales de l'équipe. Les analyses des aptitudes individuelles sont importantes afin de pouvoir établir un bilan résumant les points forts et les points faibles d'un joueur. Ce bilan analytique permet d'améliorer les capacités des joueurs et par conséquent être bénéfique pour les résultats globaux de l'équipe. Il est important de séparer les compétences individuelles et collectives, puisqu'elles sont juges de deux aspects différents du jeux. De ce fait il me semblait intéressant de programmer et établir un site web permettant de faciliter la tâche des entraîneurs qu'est de développer le talent des joueurs et l'esprit d'équipe. Mon site web se composera donc d'outils, telles qu'un compteur de fautes, de tirs marqués, de tirs effectués, etc... puis ces donnés seront enregistrées afin d'établir un profil réunissant toutes les compétences du joueurs ainsi qu'à établir un profil d'équipe afin de pouvoir avoir une vision globale des défaites, des victoires et des fautes d'équipe. Ce projet a donc pour objectif d'établir un site qui peut faciliter le traitement de données des joueurs et de l'équipe. Ce projet me permettra ainsi d'approfondir mes connaissances dans plusieurs langages informatiques telles que le HTML, CSS, PHP, SQL et SVG. La réalisation de ce projet me donnera l'opportunité d'élargir mes connaissance en faisant quelque chose qui me plaît.

2. Matériel et méthodes

2.1 Matériel

  • Ordinateur
  • Serveur

2.2 Méthode

2.2.1 Visualisation

Pour commencer ce projet, un plan doit être établi afin d'avoir une visualisation claire et structurée. Les bases de données sont le fil rouge de ma planification, elle me permet de voir les relations entre celles-ci et les pages à établir. En effectuant des recherches et en demandant des conseils, j'ai découvert un outil visuel afin de modeler mes bases de donnés: My SQL Workbench. Ce logiciel m'a permis de préciser mes bases de données selon la modélisation UML:

Schéma.png

J'ai crée 5 tables: 'Category' pour pouvoir définir les équipes selon leur âges et niveaux, 'Player' qui engobe toutes les informations du joueur, 'Game' qui enregistre les données sur le match, 'Team' qui englobe les informations individuelles des équipes et Stat_Game_player qui permette de catégoriser les informations durant un match et de les ajouter à celle du joueurs.

Screenshot_2019-05-12 h2-phpmyadmin infomaniak com paqc myd infomaniak com paqc_jennifershan phpMyAdmin 4 8 5.png

Une option sur My SQL Workbench qui permet de générer des requêtes SQL ce qui a facilité la création de mes bases de données sur PHPmyadmnin.

Notamment pour les foreign keys qui me permettent de créer des liens entre les tables pour pouvoir afficher les informations complètes:

  • Une relation 1:n entre 'Category' et 'Team' car une équipe a une catégorie mais une catégorie a plusieurs équipe.
  • Une relation 1:n entre 'Team' et 'Player' car un joueur a une équipe mais une équipe a plusieurs joueurs.
  • Une relation 1:n entre 'Player' et 'Stat_Game_Player' car une statistique appartient à un joueur mais un joueur a plusieurs statistiques.
  • Une relation 1:n entre 'Game' et 'Stat_Game_Player' car une statistique appartient à un match mais un match a plusieurs statistiques.
  • Une relation 2:n entre 'Team' et 'Game' car un match a 2 équipes mais une équipe a plusieurs match

2.2.2 Mise en place

Afin de pouvoir vérifier le bon fonctionnement de mes bases de données, les foreign keys ainsi que leur affichage sur le site web, j'ai du créer des exemples pour chaque tables:

Exemples.png
Exemple1.png

Puis je trouvais plus pratique de pouvoir accéder au serveur depuis mon bureau, j'ai donc télécharger un module pour pouvoir y accéder : Secure Shell File System, ce module permet de monter sur mon système de fichier, un système fichier distant donc le serveur. Il m'a permis d'accéder aux fichiers directement depuis mon système de fichier. L'apprentissage de l'outil vi était beaucoup trop chronphage, j'ai donc trouvé cet intermédiaire plus efficace d'après moi. Depuis mon bureau, j'ouvrais le fichier dans ATOM, un éditeur de texte avec une coloration syntaxique pour le langage HTML , PHP et CSS , ce qui favorise la compréhension du code .

Voici la ligne de code à taper dans le terminal afin d'accéder aux fichiers:

sshfs paqc_eleve@83.166.138.39: /home/jdecim/temp

"temp" est un dossier créer pour héberger le système de fichier et "jdecim" est le nom de ma session

2.2.3 Code pour l'affichage de la liste déroulante des joueurs

Il faut tout d'abord se connecter à la base de données et stocker ça dans une variable afin d'y accéder tout le long du code. Ceci est à mettre au début de chaque page du site web qui nécessite la base de données:

<?php
$MYSQL_HOST= 'paqc.myd.infomaniak.com';

$MYSQL_USER= 'paqc_eleve';

$MYSQL_PASS='TNC8Oah166Ic';

$MYSQL_DATABASE= 'paqc_jennifershan';

//connection to the database
  $conn = mysqli_connect($MYSQL_HOST, $MYSQL_USER, $MYSQL_PASS, $MYSQL_DATABASE);@@
?>

Dans ma page pour les informations concernant le joueur, j'ai voulu créer une liste déroulante qui affiche tout les joueurs. Il faut d'abord lancer une requête afin de sélectionner les données désirées:

$requete=mysqli_query($conn, "SELECT * FROM Player");

et récupérer le résultat: $result=mysqli_fetch_all($requete,MYSQLI_ASSOC);

Il faut maintenant créer une liste déroulante:

echo '<tr><td><form method="get">Veuillez choisir un joueur:<select name="lplayer"onchange="submit()">';
                foreach ($result as $value)
                {

                  if(isset($choice) && $choice == $value['idPlayer'])
                  {
                    echo '<option value="'.$value['idPlayer'].'"selected="selected">'.$value['Lastname'].
                             '  '.$value['Firstname'].'</option>';
                  }else
                      {
                      echo '<option value="'.$value['idPlayer'].'">'.$value['Lastname'].
                             '  '.$value['Firstname'].'</option>';
                      }
                }

                    '</select>
                    </form></td></tr>';

J'ai égalemant fait en sorte que à chaque fois qu'un élément de la liste déroulante est choisi, la page est renouvelé, ,même si c'est du Javascript j'ai besoin de cette ligne de code pour mettre à jour les données du joueur selon l'option choisi :

onchange="submit()">';

Lorsqu'un élément dans la liste déroulante est choisi il reste sur cette option grâce à :

selected="selected"

et la valeur choisi est enregistré grâce à:

<form method="get">

qui sera récupéré dans une variable:

$choice=$_GET'lplayer', (je l'ai mis au tout début du code). La fonction foreach(...as...)(à chaque donnée executé le code) me permet d'afficher toute mes données en une fois.

Puis

 if(isset($choice) && $choice == $value'idPlayer')

me permet d'afficher seulement si la variable $choice est défini et si elle est égale à l'id.

2.2.4 L'affichage des informations et des statistiques du joueur

Afin d'afficher les informations du joueur, il est nécessaire que la variable $choice soit défini car elle correspond à l'id du joueur:

if(isset($choice))

Puis on a besoin de faire plusieurs requête afin de pouvoir les récupérer et de les afficher:

$cplayer=mysqli_query($conn,"SELECT * FROM Player WHERE idPlayer= '$choice' ");
        $resultcplayer=mysqli_fetch_array($cplayer);
        $fkteam=mysqli_query($conn,"SELECT Team.Name FROM Player, Team 
              WHERE Player.Team_idTeam= Team.idTeam AND idPlayer='$choice'");
        $resultfkteam=mysqli_fetch_assoc($fkteam);
        $nbplayedgame=mysqli_query($conn,"SELECT COUNT(*) AS nb 
              FROM Stat_Game_player WHERE PLayer_idPlayer='$choice'");
        $resultnb=mysqli_fetch_assoc($nbplayedgame);

La première requête concerne les informations générales(Nom,Prénom,Date de naissance, Numéro, Position), une simple requête à la base de données.

La deuxième requête concerne l'équipe, il existe une foreign key qui existe entre le joueur et la table Equipe, cette ligne me permet d'afficher le nom de l'équipe où le joueur est.

La troisième requête sert à compter le nombre de match que le joueur a joué et pour ça il compte le nombre de stat_joueur car un joueur n'a qu'un statistique par match.

Puis maintenant il faut faire des requêtes pour les statistiques du joueur:

$statfault=mysqli_query($conn, "SELECT AVG(Nb_fault) 
            AS averagef FROM Stat_Game_player WHERE PLayer_idPlayer='$choice'");
        $resultstatfault=mysqli_fetch_assoc($statfault);
        $statshoot=mysqli_query($conn, "SELECT AVG(Nb_shoot) 
            AS averagesh FROM Stat_Game_player WHERE PLayer_idPlayer='$choice'");
        $resultstatshoot=mysqli_fetch_assoc($statshoot);
        $statshootf=mysqli_query($conn, "SELECT AVG(Nb_failed_shoot) 
            AS averageshf FROM Stat_Game_player WHERE PLayer_idPlayer='$choice'");
        $resultstatshootf=mysqli_fetch_assoc($statshootf);
        $statrebound=mysqli_query($conn, "SELECT AVG(Nb_rebound) 
            AS averager FROM Stat_Game_player WHERE PLayer_idPlayer='$choice'");
        $resultstatshootr=mysqli_fetch_assoc($statrebound);
        $ratio= ($resultstatshootf['averageshf']/$resultstatshoot['averagesh'])*'100';

La fonction "SELECT AVG()"permet de faire des moyennes, j'ai donc fait une moyenne des shoots, des fautes, shoots ratés et des rebonds des joueurs par match. Le ratio fait un pourcentage de shoots ratés par rapport aux shoots effectués.

2.2.4 Code pour l'affichage de la liste déroulante des équipes

La liste a le même tronc que celle pour les joueurs:

    echo '<tr><td><form method="post">Veuillez choisir une équipe:
    <select name="lteam"onchange="submit()">';
    foreach ($result as $value)
    {

      if(isset($choice) && $choice == $value['idTeam'])
      {
        echo '<option value="'.$value['idTeam'].'"selected="selected">'.$value['Name'].'</option>';
      }else
          {
          echo '<option value="'.$value['idTeam'].'">'.$value['Name'].' </option>';
          }
    }

Seul les requêtes diffèrent:

    $request=mysqli_query($conn, "SELECT * FROM Team");
    $result=mysqli_fetch_all($request,MYSQLI_ASSOC);

Puis j'ai dû afficher les informations liées à chaque équipe:

    if(isset($choice))
    {
      $cteam=mysqli_query($conn, "SELECT * FROM Team WHERE Team.idTeam= '$choice'");
      $resultcteam=mysqli_fetch_array($cteam, MYSQLI_ASSOC);
      $tplayer=mysqli_query($conn,"SELECT * FROM Player WHERE Player.Team_idTeam='$choice'");
      $resulttplayer=mysqli_fetch_all($tplayer, MYSQLI_ASSOC);
      $tcategory=mysqli_query($conn,"SELECT * FROM Category WHERE Category.idCategory='$choice'");
      $resulttcategory=mysqli_fetch_array($tcategory, MYSQLI_ASSOC);
      var_dump($resulttcategory);

      echo "<tr><td>Coach:</td><td>" . $resultcteam['Coach']."</td></tr>";
      echo "<tr><td>Joueurs de l'équipe:</td>";
       foreach ($resulttplayer as $valuea)
       {
         if(isset($choice))
         {
           echo "<td>".$valuea["Firstname"]."</td></tr>";

         }
       }
       echo "<tr><td>Catégorie:</td><td>". $resulttcategory["Name"]."</td></tr>";

      }

2.2.4 Les catégories

Une des difficultés de ses pages étaient de faire une claire différence entre mysqli_fetch_array et mysqli_fetch_all. L'un affiche une ligne de résultat, l'autres les colonnes. Il faut également ajoute MYSQLI_ASSOC. Afin de pouvoir les associer plus tard dans le code.

      if(isset($choice)){
        $requestteam=mysqli_query($conn,"SELECT Team.Name FROM Team 
                                     WHERE Category_idCategory= '$choice'");
        $result1=mysqli_fetch_all($requestteam, MYSQLI_ASSOC);
        foreach ($result1 as $value1) {

        echo"<tr><td>". $value1["Name"] ."</td></tr>";


      }

      }

2.2.5 Les matchs

Cette section est partculière j'étais dans l'incapacité d'afficher les 2 équipes sous leurs noms, j'ai donc juste afficher leurs id et le nom des équipes en temps qu'informations sur le match:

     <?php
      $request=mysqli_query($conn, "SELECT * FROM Game");
      $result=mysqli_fetch_all($request,MYSQLI_ASSOC);
      echo '<tr><td><form method="get">Veuillez choisir le match:
           <select name="lgame"onchange="submit()">';
        foreach ($result as $value)

        {
          if(isset($choice) && $choice == $value['idGame'])
            {
              var_dump($value['idGame']);

          echo '<option value="'.$value['idGame'].'"selected="selected"> '.
                     $value['Team_G'].' '.VS.' '.$value['Team_H'].' </option>';
        }else
            {
           echo '<option value="'.$value['idGame'].'">'.$value['Team_G'].
                     ' '.VS.' '.$value['Team_H'].'  </option>';
            }

      }
      if(isset($choice))
      {
      $fkteamg=mysqli_query($conn,"SELECT Team.Name FROM Game, Team WHERE 
              Team.idTeam=Game.Team_G AND Game.idGame='$choice'");
      $resultfkteamg=mysqli_fetch_array($fkteamg, MYSQLI_ASSOC);
      $fkteamh=mysqli_query($conn,"SELECT Team.Name FROM Game, Team WHERE 
              Team.idTeam=Game.Team_H AND Game.idGame='$choice'");
      $resultfkteamh=mysqli_fetch_array($fkteamh, MYSQLI_ASSOC);
      $requestf=mysqli_query($conn, "SELECT * FROM Game WHERE Game.idGame='$choice'");
      $resultf=mysqli_fetch_array($requestf,MYSQLI_ASSOC);
      var_dump($choice);

        echo "<tr><th>Informations sur le match</th></tr>";
        echo "<tr><td>Equipe(Guest):</td><td>" . $resultfkteamg['Name']. "</td></tr>";
        echo "<tr><td>Equipe(Home):</td><td>" . $resultfkteamh['Name']."</td></tr>";
        echo "<tr><td>Score(Guest):</td><td>" . $resultf['Score_G']."</td></tr>";
        echo "<tr><td>Score(Home):</td><td>" . $resultf['Score_H']."</td></tr>";
}


          '</select>
          </form></td></tr>';

2.2.6 Catégories

Cette section est similaire, les requêtes doivent être faîte de manière à ce que ce soit le nom de la catégorie qui s'affiche et non l'id:

    <?php

    echo "</br>";
    $request = mysqli_query($conn,"SELECT * FROM Category");
    $result=mysqli_fetch_all($request, MYSQLI_ASSOC);

    echo '<tr><td><form method="get">Veuillez choisir la Catégorie:

    <select name="lcategory"onchange="submit()">';
    foreach ($result as $value) {

      if(isset($choice) && $choice == $value['idCategory'])
      {

        echo '<option value="'.$value['idCategory'].'"selected="selected">'.$value['Name'].'</option>';

      }else{
          echo '<option value="'.$value['idCategory'].'">'.$value['Name'].'</option>';
          }

      }
      echo "<tr><th>Équipe appartenant à cette catégorie:</th></tr>";

      if(isset($choice)){
        $requestteam=mysqli_query($conn,"SELECT Team.Name FROM Team 
                       WHERE Category_idCategory= '$choice'");
        $result1=mysqli_fetch_all($requestteam, MYSQLI_ASSOC);
        foreach ($result1 as $value1) {

        echo"<tr><td>". $value1["Name"] ."</td></tr>";


      }

      }

2.2.7La page d'acceuil

Il me sembait important de faire un page d'acceuil afin de faciliter l'accès aux autres pages. Ce qui permet de faire un lien entre les pages:

          <li><a href="homepage">Page d'accueil</a></li>
          <li><a href="Match">Match</a></li>
          <li><a href="Category">Catégories</a></li>
          <li><a href="player">Joueurs et leurs statistiques</a></li>
          <li><a href="Team">Les équipes</a></li>

2.2.8 Mise en page

J'ai centré le texte et ajouter des images, j'ai tapé le css dans le code principale vu les faibles modifcations.

    <style type="text/css">

    body {

    }
  table{
      margin-left: 600px;
      margin-right: auto;}


    h1{
      margin-left: 600px;
      margin-right: auto; }


    ul{margin-left: 561px;
      margin-right: auto;}


    p{margin-left: 1300px;
      margin-right: auto;
      margin-bottom: auto;
      margin-top: -80px;}

  </style>

3. Résultats

Page d'acceuil:

Screenshot_2019-05-17 Page d'acceuil.png

Catégories:

Screenshot_2019-05-17 Catégories.png

Equipes:

Screenshot_2019-05-17 Match.png

Screenshot_2019-05-17 https dev gyre ch.png

Les Joueurs:

Screenshot_2019-05-17 Joueur.png

4. Discussion

J'ai appris énorément pendant ce projet, j'ai commis énormément d'erreur ce qui m'a ralenti, tout d'abord, pour faire ce projet les bases de donnés doivent être parfaites. Pour que le SQL soit correctement généré sur PHPmyadmnin, j'ai dû refaire mes bases de donné 5, 6 fois car elle n'apparaissait pas comme prévu. SQL n'est pas très dur à comprendre mais la combinaison php SQL et HTML m'a énormément perturbé au niveau de la syntaxe, un point à la place d'une parenthèse et le compilateur ne l'identifiait plus. J'ai également manqué de temps, en effet je n'avais pas pris en compte que la fin d'année allait être si intense, j'ai mal géré mon temps et je n'ai pas du tout suivi ma planification. Ce qui me revient à un dernier point il reste quelques bugs que je n'ai pas réussi à résoudre par manque de temps. Par exemple l'affichage des nom des équipes pour les matchs, l'affichage n'était jamais ce que je voulais soit il sortait les résultats faux ou incohérents soit pas de résultat je me suis donc résigné à le laisser comme ça par manque de temps.

5. Conclusion

Ce projet m'a énormément apporté, il m'a permis de m'exercer sur les langages appris en cours et l'objecti est partiellement atteint. Il y a énormément de choses à améliorer, on pourrait créer un formulaire qui permet de rajouter des nouvelles donnés à la base de données. ON pourrait également créer des liens pour faire en sorte que les réponse afficher soit des liens qui nous envoie directement sur le profil intéressé. On peut également créer une barre de recherche, la liste déroulante fonctionne pour des petites bases de donnés mais à plus grande échelle, il serait plus judicieux de lance une barre de recherche dans la liste. Ce projet a été lucratif et enrichissant, l'objectif est partiellemnt atteint je suis donc partiellement satisfaite de mon travail.

Références

  • https://www.w3schools.com
  • https://www.php.net/manual/fr/