JeuWeb - Crée ton jeu par navigateur
[reglé]Tentative de jointure - 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 : [reglé]Tentative de jointure (/showthread.php?tid=1417)

Pages : 1 2


[reglé]Tentative de jointure - blackduty - 04-07-2007

J'ai 6 tables: info_carte, the_personnage, grade_europe_e, grade_europe_o, grade_afrique, grade_pacifique. (enfin un peu plus, mais bon, ce sont celle qui nous intéresse ici ^^)

Table: info_carte
Colonne 1: theatre = contient le theatre d'opération (europe_e, europe_o, pacifique ou afrique)

Table: the_personnage
Colonne 1: id
Colonne 2: alliance (contient axe ou allie)
Colonne 3: nom
Colonne 4: compte
etc...
Colonne X: grade (contient un numéro: 1,2 etc...)

Table: grade_X (les 4 tables sont identiques mais ne possèdent pas le même remplissage)
Colonne 1: id
Colonne 2: axe (contient le nom des grades pour l'axe)
Colonne 3: allie (contient le nom des grades pour les allies)
Colonne 4: pc_requis

Donc le but de la manoeuvre, c'est d'afficher le grade du personnage. Grade qui n'aura pas le même nom suivant les théâtres d'opérations.

Je pense que dans ce cas, il faut une jointure (ma première... Ouais !) mais hélas, ça ne se passe pas comme je l'espérais... snif !

Voici la partie de code concernée (il est un peu réduit volontairement Wink):

Code PHP :
<?php 
$requete_info_carte
= mysql_query("SELECT * FROM info_carte");
$info_carte = mysql_fetch_assoc($requete_info_carte);

$theatre = $info_carte['theatre'];

$requete_affichage_perso = mysql_query("SELECT the_personnage.*, grade_$theatre.id AS grade_id, grade_$theatre.axe,
grade_
$theatre.allie FROM the_personnage INNER JOIN grade_$theatre ON the_personnage.grade = grade_id WHERE `compte`='$pseudo_joueur'");
$affichage_perso = mysql_fetch_assoc($requete_affichage_perso);

echo
'<table>';
echo
'<tr>';
echo
'<th><img src=image/camps/'.$theatre.'/'.$affichage_perso['alliance'].'.gif></th>';
echo
'<th>Nom</th>';
echo
'<td> '.$affichage_perso['nom'].' </td>';
echo
'<th>Grade</th>';
echo
'<td> '.$affichage_perso['grade'].' </td>';
echo
'</tr>';
echo
'</table>';

Mon message d'erreur:
Citation :Warning: mysql_fetch_assoc(): supplied argument is not a valid MySQL result resource in c:\documents and settings\hp_administrateur\mes documents\projet_aegis\jeu\interface_jeu\interface.php on line 37

Donc visiblement, le problème viendrait de:
Code PHP :
<?php 
$affichage_perso
= mysql_fetch_assoc($requete_affichage_perso);

Donc si ça vient bien de ceci, quelle fonction utiliser pour pouvoir dispatcher les résultats de ce genre de chose ?
Sinon, le problème viendrait d'où selon vous ?

Merci d'avance pour votre aide Smile

PS: si vous voyez d'autre chose horrible, n'hésitez pas a le signaler !


RE: Tentative de jointure - pascal - 04-07-2007

affiche ta requete puis teste là dans phpmyadmin. à mon avis, ça vient pê de la jointure, ça se fait sur le nom du champ, pas sur un alias de résultat. (

sinon coté structure de base de données, ça me parait louche... pourquoi ne pas ajouter une table contenant le camp ( afrique, pacifique, ... ) ?
ça simplifiera pas mal tes requetes.

A+

Pascal

PS : va faire un tour sur le tutorial SQL dans ma signature, ça t'aidera à débugguer.


RE: Tentative de jointure - Nessper - 04-07-2007

Pour ma part je n'ai jamais fait de jointures (je n'en ai jamais trouvé l'utilité), mais je peux quand même te dire ce que je ferais.
Pour récupérer le grade :
Code PHP :
<?php 
$requete_affichage_perso
= "SELECT grade_$theatre.nom FROM grade_$theatre, the_personnage WHERE the_personnage.grade_id=grade_$theatre.id";

Je pense que ça va marcher


RE: Tentative de jointure - pascal - 04-07-2007

Nessper a écrit :Pour ma part je n'ai jamais fait de jointures (je n'en ai jamais trouvé l'utilité), mais je peux quand même te dire ce que je ferais.
Pour récupérer le grade :
Code PHP :
<?php 
$requete_affichage_perso
= "SELECT grade_$theatre.nom FROM grade_$theatre, the_personnage WHERE the_personnage.grade_id=grade_$theatre.id";

Je pense que ça va marcher


tu fais des jointures sans le savoir Wink

une condition sur les id entre 2 tables, c'est une jointure Tongue

A+

Pascal


RE: Tentative de jointure - Nessper - 04-07-2007

ah ok ^^. Mais alors quel intérêt de faire une "vraie" jointure ? plus rapide ?


RE: Tentative de jointure - pascal - 04-07-2007

concernant la rapidité, je ne sais pas.

par contre on peut faire dans une jointure des trucs plus difficiles à faire avec un WHERE :
_ toutes les lignes d'une table, avec un lien optionnel dans la 2e table
_ toutes les lignes d'une table qui n'ont pas de correspondance dans la 2e table

c'est aussi une question de lisibilité de requête :
_ les relations entre tables = les jointures
_ les conditions sur les données ( ex : id du joueur connecté ) : WHERE

A+

Pascal


RE: Tentative de jointure - blackduty - 04-07-2007

Bon, j'ai une erreur directement dans phpmyadmin :hahahaha:

Citation :#1064 - Erreur de syntaxe pr�s de '"SELECT the_personnage.*, grade_$theatre.id AS grade_id, grade_$' � la ligne 1

hum, par contre, je ne vois pas (ou je ne comprend pas) ceci:
Citation :ça se fait sur le nom du champ, pas sur un alias de résultat

Enfin:
Citation :pourquoi ne pas ajouter une table contenant le camp (afrique, pacifique, ... )

Parce que Afrique, Pacifique etc... ne sont pas des camps mais des théâtres d'opérations Wink
Si on résume mes camps, on arrive a une confrontation binaire Axe/Allie.
Mais suivant le théâtre, la confrontation n'est pas la même:
Ex: Europe_O:
On a USA/Allemagne
Europe_E
On a URSS/Allemagne etc...

Le but de la manoeuvre étant de pouvoir modifier les noms des personnages (les différents noms sont saisie a l'inscription mais je souhaite garder les même personnages [caract, xp etc...]) et leur grade en quelques clics dans un formulaire.
J'espère que j'ai bien compris ce que tu me dis...


RE: Tentative de jointure - pascal - 04-07-2007

on voit les $ des variables, donc elles ne sont pas interprétées dans la requete

2 solutions :
_ concaténation
_ la fonction sprintf()

A+

Pascal


RE: Tentative de jointure - blackduty - 04-07-2007

Donc si je comprend bien, la requête interprète le nom du champ ainsi:

grade_$theatre

Et non, grade_europe_e (dans le cas où $theatre = europe_e).

Exact ?


RE: Tentative de jointure - pascal - 04-07-2007

apparemment, oui