TourDeJeu, le portail des jeux en ligne alternatifs, les articles 
TourDeJeu, le réseau des jeux en ligne alternatifs : jeux web multijoueurs, jeux par forum. En savoir +
En ligne : 490 jeux, 7155 news, 26679 commentaires
 

Recherche de jeu par critères - Un jeu au hasard !

Les Focus

Tech. : Le programmeur écologique
Tech. : automatisation et mails
Salon MondeDuJeu 2002
Revue de presse des JpC
Humour : 1001 raisons pour jouer
Ludique : le joueur parfait
Ludique : découverte du JpC
PHP : accès base de données
PHP : structure du site
Ludique : JpC et Temps réel
Jeux de rôles sans règles
Humour : astrologie du JpC
Tech. : Bases de données
MJ : les joueurs multiples
PHP : utilité pour un JpC
PHP : c'est quoi ?
Tech. : l'analyse des ordres
Ludique : débutants et vétérans
Tech. : archi Ultraball 2100
Ludique : les jeux de pronos
Tech. : le site Web d'un JpC
Humour : football et wargame
Présentation de TourDeJeu

Accès la base de données MySQL pour son jeu PHP

Premiers traitements

Nous avons des joueurs d'un côté et des parties de l'autre. Il faut faire le lien entre les deux ! Il faut permettre aux joueurs de s'inscrire aux parties ouvertes et non remplies.

Dans la base de données, c'est le rôle de la table fish_equipe que de donner la correspondance entre les joueurs et les parties.

Dans la page du joueur, on a va donc regarder s'il est inscrit à une partie (non terminée). Si oui, on va lui afficher les infos sur la partie en question. Si non, on va lui donner la liste des parties ouvertes aux inscriptions pour lui permettre de s'inscrire.

$res = mysql_query("SELECT idpartie FROM fish_equipe, fish_partie
  WHERE idpartie=fish_partie.id and idjoueur = $id and etat<>3");
if (mysql_num_rows($res)>0) {
  //---- il participe deja à une partie ----
} else {
  //---- il faut s'inscrire à une partie ---
}

Si le joueur est déjà inscrit dans une partie, on va se contenter d'afficher les infos relatives à cette partie. Plus tard, on y ajoutera la possibilité de passer ses ordres et de consulter son CR. L'ordre SQL récupérant les infos de la partie est en fait un peu complexe, car on veut afficher le nombre de places déjà prises dans la partie. Pour cela, il faut compter les équipes de cette partie. On peut tout grouper en un seul ordre SQL. Construisons progressivement cet ordre.

Tout d'abord, on prend les infos de la table fish_partie pour la partie qui nous intéresse :

SELECT fish_partie.datedebut, fish_partie.etat, fish_partie.typepartie,
  fish_partie.idriviere, fish_partie.nbplace
  FROM fish_partie
  WHERE fish_partie.id = $idpartie

Ensuite, plutôt que de prendre l'id de rivière, on va prendre son nom en faisant une jointure avec la table fish_riviere :

SELECT fish_partie.datedebut, fish_partie.etat, fish_partie.typepartie,
  fish_riviere.nom, fish_partie.nbplace
  FROM fish_partie, fish_riviere
  WHERE fish_partie.id = $idpartie AND fish_partie.idriviere = fish_riviere.id

Pour finir, on va compter les équipes déjà inscrites. Il faut ajouter un COUNT(fish_equipe.id) pour la partie, c'est-à-dire en ajoutant aussi un GROUP BY fish_partie.id. Il y a un piège : si aucune équipe n'est encore inscrite dans une partie, la jointure classique ne va rien renvoyer du tout pour cette partie, puisqu'il lui faut un résultat des deux cotés de la jointure. La solution est d'utiliser une semi-jointure (LEFT JOIN) qui prendra les parties sans aucune équipe aussi bien que les parties avec équipes. La solution finale est donc :

SELECT fish_partie.datedebut, fish_partie.etat, fish_partie.typepartie,
  fish_riviere.nom, fish_partie.nbplace, count(fish_equipe.id) as nbpris
  FROM fish_partie, fish_riviere
  LEFT JOIN fish_equipe ON fish_equipe.idpartie = $idpartie
  WHERE fish_partie.id = $idpartie AND fish_partie.idriviere = fish_riviere.id
  GROUP BY fish_partie.id

On aura sûrement aussi besoin de cette requête à d'autres endroits, donc on la met dans une fonction, dans un include séparé. Il ne reste plus qu'à afficher les infos obtenues.

Dans le cas où le joueur ne participe pas encore à une partie, nous allons afficher la liste des parties ouvertes, et lui permettre de choisir l'une d'elles. Il faut prendre en compte son type (vétéran/débutant). L'ordre SQL ressemble au précédent.

SELECT fish_partie.id, fish_partie.typepartie, fish_riviere.nom,
  fish_partie.nbplace, count(fish_equipe.id) as nbpris
  FROM fish_partie, fish_riviere, fish_joueur
  LEFT JOIN fish_equipe ON fish_equipe.idpartie = fish_partie.id
  WHERE fish_partie.etat = 1 AND fish_partie.idriviere = fish_riviere.id
  AND fish_joueur.id = $id
  AND (typepartie=3 OR (typepartie=1 AND veteran_on=0)
       OR (typepartie=2 AND veteran_on=1))
  GROUP BY fish_partie.id

On affiche la liste des résultats de cette requête, et s'il reste de la place dans la partie, on affiche un lien d'inscription. On renvoie vers la page formparticip.php en passant l'id de partie en paramètre.

if ($myrow["nbpris"] >= $myrow["nbplace"]) {
  echo "<td>Plus de place !</td>";
} else {
  echo "<td><a href=\"formparticip.php?idpartie=".
        $myrow["id"]."\">S'inscrire</a></td>";
}

La page d'infos joueur est alors terminée. Il faut ensuite écrire le formulaire d'inscription à une partie. On affiche la liste des joueurs déjà inscrits. On ajoute une formulaire HTML demandant la saisie du nom de l'équipe à créer, ainsi que l'espèce de poisson choisie. Les mécanismes mis en oeuvre sont identiques à ceux que nous avons déjà utilisés dans les pages précédentes. La seule nouveauté est dans le formulaire HTML :

<input type="hidden" name="i_partie" value="<?php echo $idpartie?>">

Il s'agit d'un champs caché dans le formulaire. A l'écran, rien n'est visible. Mais cela permet de récupérer, dans la page d'action, une variable supplémentaire dont on connait déjà la valeur, ici l'id de partie qui a déjà été sélectionné.

Finalement, on crée une page enregparticip.php qui va lire le résultat de ce formulaire et effectuer la création de l'équipe dans la table fish_equipe. On donnera son numéro d'équipe au joueur, et on lui proposera de revenir à la page de départ, celle des infos joueur. La boucle est bouclée.

Retour au sommaire de l'article 

(c) TourDeJeu 2000-2020