JeuWeb - Crée ton jeu par navigateur
[REGLE]Pouvoir equiper un objet ( ou pas)suivant ce que l'on a deja - Version imprimable

+- JeuWeb - Crée ton jeu par navigateur (https://jeuweb.org)
+-- Forum : Discussions, Aide, Ressources... (https://jeuweb.org/forumdisplay.php?fid=38)
+--- Forum : Programmation, infrastructure (https://jeuweb.org/forumdisplay.php?fid=51)
+--- Sujet : [REGLE]Pouvoir equiper un objet ( ou pas)suivant ce que l'on a deja (/showthread.php?tid=1794)



[REGLE]Pouvoir equiper un objet ( ou pas)suivant ce que l'on a deja - Kassak - 23-09-2007

Bonjour à vous!

Alors j'explique mon probleme en faisant simple:

J'ai une table item avec comme champ id_item et categorie, par exemple :
-id_item 2, categorie arme
-id_item 5, categorie armure
etc....

Cette table defini tous les objets disponible dans le jeu.


Ensuite il y la table inventaire, qui contient ce que le joueur possede, avec comme champs : pseudo, id_item, port, par exemple :
-kassak, 2, 0
-kassak, 7, 1

Quand port est a 1, l'objet est équipé, quand port est a 0 l'objet n'est pas équipé.


Je souhaiterias maintenant que le joueur puisse equiper une arme, seuleument s'il n'a pas deja une arme équipée, pareil pour l'armure, le bouclier etc....

J'ai un peu de mal, apres des journées de recodage, a trouver la ou les requetes miracles qui me permettrait de faire cela.

Merci à vous!Je vous est donné le minimum d'information, s'il vous en manque dites le moi^^

Ps : Quand on est sur la page inventaire.php, et qu'on clique sur un objet pour l'equiper, cela nous envoie vers la page equiper.php.


RE: Pouvoir equiper un objet ( ou pas)suivant ce que l'on a deja - Kalan - 23-09-2007

Bonjour,

tout d'abord, je pense que tu devrais avoir une table de référence pour les catégories puisque plusieurs objets peuvent appartenir à la même catégorie. Mais c'est juste une question de normalisation de ton modèle de données (Cf. MERISE).

Pour ta table inventaire, tu peux, avant d'exécuter l'équipement, faire une requête du type:
Code :
SELECT count(i.id_item) from inventaire i, item o  where i.pseudo_id = $pseudo AND i.port = 1 AND i.id_item = o.id_item AND i.categorie = $categorie
Cette requête va compter les objets équipés (clause where i.port=1) de l'utilisateur $pseudo (i.pseudo=$pseudo) qui sont de la même catégorie que l'objet que le joueur tente d'équiper (i.id_item = o.id_item est la jointure entre inventaire et item et i.categorie = $categorie cherche les objets de cette catégorie).
Si le résultat ne vaut pas 0 ou null, c'est qu'un objet de cette catégorie est déjà équipé.
Si le volume de donnée est un peu élevé, tu peux dénormaliser inventaire en y ajoutant une colonne categorie et en dupliquant l'information.
Ainsi ta requête évite la jointure :

Code :
SELECT count(id_item) from item where i.pseudo_id = $pseudo AND i.port = 1 AND i.categorie = $categorie



RE: Pouvoir equiper un objet ( ou pas)suivant ce que l'on a deja - Kassak - 23-09-2007

Ok ok, mais quelle est le nom de la variable que je recupere la?
Il n'y a pas de AS quelque chose...

Sinon merci de m'avoir éclairé sur la requete, j'ai vraiment du mal moi :p


RE: Pouvoir equiper un objet ( ou pas)suivant ce que l'on a deja - Kalan - 23-09-2007

Soit tu nommes la colonne retournée avec un AS effectivement, soit tu récupère simplement la valeur dans le curseur PHP en indiquant l'indice 0 :

$record = mysql_fetch_array($ma_requete);
$resultat = $record[0] ou $resultat = $record["alias AS de la requete"]


RE: Pouvoir equiper un objet ( ou pas)suivant ce que l'on a deja - Kassak - 23-09-2007

Ba en faites j'ia fait beaucoup plus simple :

Code PHP :
<?php 
$retour
= mysql_query('SELECT COUNT(*) AS nbre_entrees FROM inventaire LEFT JOIN item on item.id_item= inventaire.id_item WHERE pseudo = "' .$_SESSION['pseudo'].'" AND categorie="'.$categorie.'" AND port="1"');
$donnees = mysql_fetch_array($retour)or die (mysql_error());
$nombre = $donnees['nbre_entrees'];


Merci de m'avoir donné l'inspiration^^


RE: [REGLE]Pouvoir equiper un objet ( ou pas)suivant ce que l'on a deja - Kalan - 23-09-2007

Oui, c'est parfaitement équivalent à :

Citation :SELECT count(i.id_item) from inventaire i, item o where i.pseudo_id = $pseudo AND i.port = 1 AND i.id_item = o.id_item AND i.categorie = $categorie

mais en syntaxe ANSI (avec JOIN pour déclarer la jointure plutôt que dans la clause WHERE).
En fait non, ce n'est pas équivalent car ton LEFT JOIN signifie une jointure externe à gauche ce qui, dans ce cas est inutile : un INNER JOIN sera plus performant (pour en savoir plus sur les jointures externe : http://www.laltruiste.com/document.php?url=http://www.laltruiste.com/annexe/algebre_jointureexterne.html ).
Là on a équivalence entre ta syntaxe ANSI et celle qui inclut la jointure dans le WHERE -- fréquemment utilisée par les fainéants de mon espèce dans le cas de jointures internes mais non recommandée. :-) ).
De plus, je te conseille un COUNT(inventaire.id_item) plutôt qu'un count(*) : c'est plus performant puisque le serveur de base de données ne ramène qu'une seule colonne pour compter les enregsitrement plutôt que toutes les colonnes pour un résultat identique.

pour conclure, tu devrais plutôt écrire :

Code PHP :
<?php 
$retour
= mysql_query('SELECT COUNT(inventaire.id_item) AS nbre_entrees FROM inventaire INNER JOIN item on item.id_item= inventaire.id_item WHERE pseudo = "' .$_SESSION['pseudo'].'" AND categorie="'.$categorie.'" AND port="1"');