26-07-2010, 08:41 AM
(26-07-2010, 01:13 AM)Argorate a écrit : L'erreur est "simple" c'est que tu mets trois fois la meme table dans le FROM avec trois ALIAS différent.
Ce genre de chose ne pose aucun problème pour les langages SQL.
L'erreur sur le Fetch signifie en effet que la requête à merdé.
Ne connaissant pas PDO, je ne sais pas si tu peux avoir un message d'erreur plus explicite mais cela aiderait certainement aux futurs débuggage.
Pour en revenir à ta requête d'origine, je pense que l'erreur se situe au niveau de la ligne id_joueur=".$_SESSION['id']."
Comme tu utilises trois fois la même table avec des alias si tu souhaites faire un WHERE sur le champ id_joueur, tu dois spécifier la table à utiliser sinon le moteur SQL est incapable de déterminer laquelle il doit utiliser. Tu peux mettre par exemple batiments_fermes.id_joueur=".$_SESSION['id'].". Cela devrait supprimer ton erreur mais ne renverra pas pour autant ce que tu attends (je te laisse tester toi même pour voir les résultats et essayer de comprendre ce qui se passe)
Le code donné par Argorate te renverra plusieurs lignes, une par bâtiment existant dans ta table. Au passage, personnellement, j'aurai remplacé la série de OR par id_batiment in (1,4,5).
L'avantage est que le résultat est renvoyé en une seule passe sur la base SQL. Le désavantage est que cela t'oblige à parcourir le recordset pour tester la valeur de id_batiment sur chaque ligne pour connaître précisément le type de bâtiment.
Maintenant, si tu souhaites tout avoir sur une seule ligne, je vois deux possibilités utiliser une jointure ou les sous requêtes.
La jointure est simple. A partir d'une table 'parent' tu vas joindre des tables 'filles' en reliant les lignes en fonction de certains champs/valeurs. Je te laisse chercher toi même les différences entre les jointures de type INNER et LEFT
Dans le code suivant, je pars d'une simple requête sur les fermes (alias bf) et je rajoute les informations sur les bucherons (alias bb) et les carrières (alias bc) avec des jointures. Petit inconvénient, si le joueur n'a pas de fermes (ma table 'parent'), tu n'auras aucun résultats en retour, même s'il possède des bucherons ou des carrières.
Code :
SELECT
bf.nombre AS fermes,
bb.nombre AS bucherons,
bc.nombre AS carrieres
FROM
j_batiments_joueurs bf
LEFT JOIN
j_batiments_joueurs bb on bb.id_joueur = bf.id_joueur and bb.id_batiment = 4
LEFT JOIN
j_batiments_joueurs bc on bc.id_joueur = bf.id_joueur and bb.id_batiment = 5
WHERE
bf.id_joueur=".$_SESSION['id']."
AND
bf.id_batiment = 1
Les sous requêtes reviennent à faire plusieurs requêtes dans une seule.
Le moteur SQL va faire trois recherches dans la base de donnée et ranger le résultat dans un recordset.
Cela peut être un peu plus gourmand en ressources mais dans ton cas, cela devrait fonctionner selon tes attentes.
Code :
SELECT
(
SELECT nombre
FROM j_batiments_joueurs
WHERE id_joueur=".$_SESSION['id']." AND
id_batiment = 1
) as fermes,
(
SELECT nombre
FROM j_batiments_joueurs
WHERE id_joueur=".$_SESSION['id']." AND
id_batiment = 4
) as bucherons,
(
SELECT nombre
FROM j_batiments_joueurs
WHERE id_joueur=".$_SESSION['id']." AND
id_batiment = 5
) as carrieres
Quand on te dit qu'un projet est terminé à 90%, prépare toi pour les 90% suivant
Ninety-Ninety Rule
"Une guerre de religions, c'est quand deux peuples s'entretuent pour savoir qui a le meilleur ami imaginaire"
Vu sur IRC
Ninety-Ninety Rule
"Une guerre de religions, c'est quand deux peuples s'entretuent pour savoir qui a le meilleur ami imaginaire"
Vu sur IRC