Monopoly : Parcourir ligne par ligne une bdd

Signaler
Messages postés
4
Date d'inscription
dimanche 10 janvier 2021
Statut
Membre
Dernière intervention
10 janvier 2021
-
Messages postés
30941
Date d'inscription
mercredi 22 octobre 2003
Statut
Modérateur
Dernière intervention
10 janvier 2021
-
Bonjour !

Je travaille actuellement sur un projet qui est de créer un jeu de Monopoly. Le jeu se jouera de 2 à 6 joueurs sur un même écran.

Je suis bloquée à l'étape où chaque joueur doit choisir son pion.

Sur la première page du jeu, on choisit le nombre de joueurs. Si le nombre de joueurs est égal à 2, on insère 2 lignes dans la base de données (cf capture d'écran).



Ensuite sur une seconde page apparaît les 6 pions que peuvent choisir les joueurs.

Le joueur 1 choisit son pion, on l'insère est base de données dans la colonne "avatar", puis le but est de passer au second joueur.

J'ai essayé de faire une boucle mais ça ne fonctionne pas. Je comprends pourquoi ça ne fonctionne pas mais je n'arrive pas à trouver la bonne solution.

Après quelques recherches sur internet, je suis tombée sur les procédures stockées et les curseurs pour pouvoir parcourir une ligne, puis effectuer une action, puis passer à la ligne suivante, mais ayant un niveau débutant en PHP, je n'y ai pas compris grand chose...

Je vous mets mon code ci-dessous :
  $QUERY = "SELECT id, avatar FROM joueur";
$requete = $bdd->prepare($QUERY);
$requete->execute();

$resultat = $requete->fetchAll(PDO::FETCH_KEY_PAIR);

echo '<pre>';
print_r($resultat);
echo '</pre>';

$idb = 1;

foreach ($resultat as $pseudo => $id )
{
echo "id de la boucle : ".$idb ;

if(isset($_POST['$1_pion']))
{
$avatar = "Tour Eiffel";
$QUERY= 'UPDATE joueur SET avatar = ? WHERE id = ?';
$requete = $bdd->prepare($QUERY);
$requete->execute(array($avatar, $idb));
echo "pseudo".$id."=".$avatar;
$idb++;
break;
}

if(isset($_POST['$2_pion']))
{
$avatar = "Arc de Triomphe";
$QUERY= 'UPDATE joueur SET avatar = ? WHERE id = ?';
$requete = $bdd->prepare($QUERY);
$requete->execute(array($avatar, $idb));
echo "pseudo".$id."=".$avatar;
$idb++;
break;
}

}



Merci d'avance pour votre aide !

4 réponses

Messages postés
30941
Date d'inscription
mercredi 22 octobre 2003
Statut
Modérateur
Dernière intervention
10 janvier 2021
3 165
Bonjour,

Tous les joueurs se trouvent sur le même PC ?
Ou chaque joueur est connecté depuis un ordi différent ?

Si tous sur le même PC ..il faut afficher le formulaire pour le joueur 1
Puis, insérer son résultat (une fois envoyé) dans la bdd
Puis afficher le formulaire pour le joueur 2 ... etc...

Si sur des ordis différents.. il faut simplement pouvoir identifier quel utilisateur à modifié son avatar ...

Mais comme on ne sait pas comment tu prévois le fonctionnement de ton site .. et que tu ne nous montres pas la partie formulaire...
Impossible de t'en dire plus.

Je serai également curieux de voir ce que t'affiche ton
  echo '<pre>';
  print_r($resultat);
  echo '</pre>';

et, vu que tu disposes de l'id de la ligne.. pourquoi avoir utilisé une variable $idb ??
Surtout que l'id peut très bien être différent de 1 ou 2 ... surtout si tu utilises des id auto-incrémentés dans ta bdd ...


PS: A l'avenir, merci de préciser le langage (ici php) dans les balises de code afin d'avoir la coloration syntaxique.
Explications ( à lire ENTIEREMENT !! ) disponibles ici :
https://codes-sources.commentcamarche.net/faq/11288-les-balises-de-code

PS²: Je t'invite également à gérer les éventuelles erreurs dans tes requêtes en appliquant les conseils donnés ici :
https://www.commentcamarche.net/faq/46512-pdo-gerer-les-erreurs

Messages postés
4
Date d'inscription
dimanche 10 janvier 2021
Statut
Membre
Dernière intervention
10 janvier 2021

Tout d'abord merci pour votre réponse !

Comme précisé dans mon message précédent, le jeu se jouerait sur un seul écran.

Pour que ce soit un peu plus clair, voici une capture d'écran de la première page sur lequel on choisit le nombre de joueurs :



Ensuite, cette page s'affiche :



Pour cette seconde page, voici l'affichage en HTML :


    <form action="" method="post">
    <section class="columnjoueurs">
        <div class="container">
            <div class="row justify-content-center mb-3">
                <div class="col-sm-3">
                    <input type="submit" name = "$1_pion" class="p1" value="" style='background-image: url(assets/images/<?php echo $pions ["p1"]?>)'/>
                </div>
                <div class="col-sm-3">
                    <input type="submit" name = "$2_pion" class="p2" value="" style='background-image: url(assets/images/<?php echo $pions ["p2"]?>)'/>
                </div>
                <div class="col-sm-3">
                    <input type="submit" name = "$3_pion" class="p3" value="" style='background-image: url(assets/images/<?php echo $pions ["p3"]?>)'/>
                </div>
            </div>
            <div class="row justify-content-center">
                <div class="col-sm-3">
                    <input type="submit" name = "$4_pion" class="p4" value="" style='background-image: url(assets/images/<?php echo $pions ["p4"]?>)'/>
                </div>
                <div class="col-sm-3">
                    <input type="submit" name = "$5_pion" class="p5" value="" style='background-image: url(assets/images/<?php echo $pions ["p5"]?>)'/>
                </div>
                <div class="col-sm-3">
                    <input type="submit" name = "$6_pion" class="p6" value="" style='background-image: url(assets/images/<?php echo $pions ["p6"]?>)'/>
                </div>
            </div>
        </div>
    </section> 
    
    </form>


Le but étant que le 1er joueur choisisse son pion, puis le second, etc, le tout sur cette même page.

J'ai utilisé $idb qui me servait à parcourir chaque ligne une par une. Mais effectivement les id dans la base de données sont auto-incrémentés.

Voici ce que m'affiche le code demandé précédemment :



Pour la gestion des erreurs, j'ai bien appliqué les conseils donnés.
Messages postés
30941
Date d'inscription
mercredi 22 octobre 2003
Statut
Modérateur
Dernière intervention
10 janvier 2021
3 165
Faut reprendre un peu la "logique" de ton code.

Donc première étape... tu choisis le nombre de joueurs... et en fonction de ça, tu créés x lignes dans la bdd.
ça.. c'est fait.
Ensuite, il faudrait pouvoir choisir, pour chaque joueur, son pion..
Donc, si tu veux le faire, "joueur par joueur" .. il faut donc,
dans ton formulaire, récupérer l' ID du joueur qui va choisir son pion ( en le mettant dans un input hidden par exemple )
Puis, en utilisant les variables de session... passer au second ID une fois que que tu as "submit" le formulaire...

Ou alors, pourquoi ne pas changer un peu cette page en faisant simplement, dans le même formulaire, X lignes par joueur... et sur chaque ligne, des option button (remplacés par les images des pions) pour indiquer, pour chaque joueur quel pion il va utiliser ?
A mon avis.. c'est le plus simple...


Par contre, d'après ce que je vois.. tu es en train de coder ton jeu sans avoir, au préalable, fait une phase importante... le cahier des spécificités fonctionnelles...
Cette étape te permet de bien réfléchir à toutes les fonctionnalités dont tu vas avoir besoin pour chacune de tes pages et donc d'anticipé la "logique" qu'il va te falloir mettre en place.

Pour l'instant, ton souci n'est pas un problème lié à proprement parlé au langage de programmation... mais à la mécanique que tu veux mettre en place et le choix des méthodes à utiliser...
Messages postés
4
Date d'inscription
dimanche 10 janvier 2021
Statut
Membre
Dernière intervention
10 janvier 2021

J'ai voulu tenter la première solution en utilisant les variables de session.
J'ai ainsi modifié mon html et ajouté un input hidden pour récupérer l'id de la session :

    <form action="" method="post">
    <section class="columnjoueurs">
        <div class="container">
            <div class="row justify-content-center mb-3">
                <div class="col-sm-3">
                    <input type="submit" name = "$1_pion" class="p1" value="" style='background-image: url(assets/images/<?php echo $pions ["p1"]?>)'/>
                </div>
                <div class="col-sm-3">
                    <input type="submit" name = "$2_pion" class="p2" value="" style='background-image: url(assets/images/<?php echo $pions ["p2"]?>)'/>
                </div>
                <div class="col-sm-3">
                    <input type="submit" name = "$3_pion" class="p3" value="" style='background-image: url(assets/images/<?php echo $pions ["p3"]?>)'/>
                </div>
            </div>
            <div class="row justify-content-center">
                <div class="col-sm-3">
                    <input type="submit" name = "$4_pion" class="p4" value="" style='background-image: url(assets/images/<?php echo $pions ["p4"]?>)'/>
                </div>
                <div class="col-sm-3">
                    <input type="submit" name = "$5_pion" class="p5" value="" style='background-image: url(assets/images/<?php echo $pions ["p5"]?>)'/>
                </div>
                <div class="col-sm-3">
                    <input type="submit" name = "$6_pion" class="p6" value="" style='background-image: url(assets/images/<?php echo $pions ["p6"]?>)'/>
                </div>
                <input type="hidden" name="id_pion" value="<?php echo $id ?>"/>
            </div>
        </div>
    </section> 
    
    </form>


Et pour le php je bloque à cette étape :

 session_start();

  $id = 1;

  if(isset($_POST['$1_pion']))
  {
    $_SESSION["id"]= $id;
    $avatar = "Tour Eiffel";
    $QUERY= 'UPDATE joueur SET avatar = ? WHERE id = ?';
    $requete = $bdd->prepare($QUERY);
    $requete->execute(array($avatar, $id));
    echo "pseudo".$id."=".$avatar;
    $_SESSION ["id"] = $id + 1;
    echo $_SESSION ["id"];
  }

  if(isset($_POST['$2_pion']))
  {
    $_SESSION["id"]= $id;
    $avatar = "Arc de Triomphe";
    $QUERY= 'UPDATE joueur SET avatar = ? WHERE id = ?';
    $requete = $bdd->prepare($QUERY);
    $requete->execute(array($avatar, $id));
    echo "pseudo".$id."=".$avatar;
    $_SESSION ["id"] = $id + 1;
    echo $_SESSION ["id"];
  }
Messages postés
30941
Date d'inscription
mercredi 22 octobre 2003
Statut
Modérateur
Dernière intervention
10 janvier 2021
3 165
Déjà.. comment créés tu ta variable $id ?
Comment la récupères tu depuis ta variable de session ?

Une fois que tu auras compris ça .. tu verras que tu n'auras pas besoin de tes deux if ...
Surtout qu'on ne sait pas d'où viennent tes variables $2_pion' et $1_pion'
Messages postés
4
Date d'inscription
dimanche 10 janvier 2021
Statut
Membre
Dernière intervention
10 janvier 2021

Ma variable $id correspond à l'id du joueur 1, puis du joueur 2, ainsi de suite.
Je comptais récupérer ma variable dans le formulaire dans l'input type = hidden.

Mes variables $2_pion et $pion correspondent au pion 1 et 2. Ainsi, if (isset($_POST['$1_pion']) correspond au clic sur le pion 1 de l'utilisateur.
Messages postés
30941
Date d'inscription
mercredi 22 octobre 2003
Statut
Modérateur
Dernière intervention
10 janvier 2021
3 165
Evite de mettre des $ dans le nom des variables dans les attributs html
En plus, pour éviter certains soucis éventuels, le nom d'une variable commence toujours par une lettre.
Donc pion_1
Il serait également préférable de n'avoir qu'un seul FORM
et dedans, à la place de tous tes boutons submit .. avoir simplement des boutons radios
(après, rien ne t'empèche, lors du click sur un de ces boutons radios, de générer le submit du formulaire en javascript )