JeuWeb - Crée ton jeu par navigateur
[PHP] requêtes dûre - 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 : [PHP] requêtes dûre (/showthread.php?tid=3956)

Pages : 1 2


[PHP] requêtes dûre - Hell-AstiK - 13-11-2010

Bonsoir,
je savait pas quoi mettre dans le titre :heuuu:
C'est pas si dur que ca je pense, sauf que bon, on va dire que c'est le soir, c'est bientôt l'heure de dormir, le cerveau n'est pas a fond quoi Confusediffle:
Non sérieux, ca fait deux trois jour que j'y suis dessus, et pourtant sa parait simple.

Bon entrons dans le vif du sujet !

J'ai une table Liste_batiments ou comme son nom l'indique, je fait la liste des batiments, voici la structure de la table :

id | nom | description

bon je ne pense pas que j'ai beaucoup besoin de détailler, la description est la description du bâtiment..

Une autre table, Batiments_acquis, ou je liste les bâtiments que chaque membres a acheter, les bâtiment acquis (débloquer) donc. Cette table se présente ainsi :

id | id_batiments | id_membres | niveaux

id_batiments = id de la table Liste_batiments
id_membres = id d'une table Membres
niveaux = niveau du bâtiments

Lorsque sur une page je veut afficher la liste des bâtiments, avec en fonction si le membre possède le bâtiment ou pas 'Entrer' ou 'Construire', il y a deux fois afficher la même chos, et ceci juste pour un bâtiment pas tous >.<
J'arrive pas à trouver le problème, je vous montre mon code (php) :



$batiments_acquis = $bdd->prepare("SELECT BA.niveaux, BA.id_batiments, LB.nom, LB.description FROM Batiments_acquis BA, Liste_batiments LB WHERE BA.id_membres = :id_user AND BA.id_batiments = LB.id");
$batiments_acquis->bindValue(':id_user', $_SESSION['id'], PDO:TongueARAM_INT);
$batiments_acquis->execute();

while($donnees_acquis = $batiments_acquis->fetch()) {
echo $donnees_acquis['nom'].'<br />Niveau : '.$donnees_acquis['niveaux'].'<br />'
.'<em>'.$donnees_acquis['description'].'</em><br />'
.'<a href="./batiments/'.lcfirst(supprimer_accents($donnees_acquis['nom'])).'.php">Entrer</a><br />';

$batiment_bloquer = $bdd->prepare("SELECT * FROM Liste_batiments WHERE id != :id_debloquer");
$batiment_bloquer->bindValue(':id_debloquer', $donnees_acquis['id_batiments'], PDO:TongueARAM_INT);
$batiment_bloquer->execute();
}

while($donnees_bloquer = $batiment_bloquer->fetch()) {
echo $donnees_bloquer['nom'].'<br />'
.'<em>'.$donnees_bloquer['description'].'</em><br />'
.'<a href="./batiments/construire_batiment.php?batiment='.$donnees_bloquer['id'].'">Construire</a><br />';
}

quand je fait un var_dump($donnees_acquis['id_batiments']); à la fin du premier while, j'obtiens (int)1 et (int)2 jusque la niquel.
mais quand je fait un var_dump($donnees_bloquer['id']); a la fin du second while, j'obtiens (int)1 (int)3.
la ce n'est pas bon, il ne devrait pas m'afficher encore une fois le 1.

Peut être une erreur dans mes requêtes ? :heuuu:
Mais en tout cas je ne voit pas du tout ou. Si quelqu'un pourrez m'aider à corriger ce problème s'il vous plait..

Merci d'avance, bonne soirée à tous


RE: [PHP] requêtes dûre - Myrina - 13-11-2010

Dans la première requête, il y a deux tables; il ne manquerait pas la clause where de jointure entre les deux?

Sinon, la structure du code Php me laisse perplexe; pourquoi exécuter, à chaque occurrence de la première requête, la seconde requête et donc avoir le résultat que pour la dernière occurrence de la première requête donc "id différent de 2".
Il serait peut être plus judicieux de stocker l'ensemble des ID dans un tableau Php avant de les injecter dans une clause NOT IN dans la seconde requête.


RE: [PHP] requêtes dûre - Hell-AstiK - 13-11-2010

WHERE [...] AND BA.id_batiments = LB.id
...?

Pour le tableau :
$batiments_construit = array($donnees_acquis['id_batiments']); ??

et ensuite utiliser $batiments_construit dans ma seconde requête ?


PS: désolé pour la déformation du forum en largeur :$


RE: [PHP] requêtes dûre - pascal - 13-11-2010

Tu peux faire une seule requête :

SELECT BA.niveaux, LB.id, LB.nom, LB.description
FROM Liste_batiments LB LEFT JOIN Batiments_acquis BA ON BA.id_batiments = LB.id
WHERE BA.id_membres = :id_user

Le LEFT JOIN te renverra tous les batiments, liés au joueur ou sans lien avec le joueur.

S'il n'y a pas de lien avec le joueur, on aura BA.niveaux = NULL (ou vide). Tu auras donc toutes les données en une seule requête Smile

A+

Pascal


RE: [PHP] requêtes dûre - Hell-AstiK - 13-11-2010

(13-11-2010, 10:58 PM)pascal a écrit : Tu peux faire une seule requête :

SELECT BA.niveaux, LB.id, LB.nom, LB.description
FROM Liste_batiments LB LEFT JOIN Batiments_acquis BA ON BA.id_batiments = LB.id
WHERE BA.id_membres = :id_user

Le LEFT JOIN te renverra tous les batiments, liés au joueur ou sans lien avec le joueur.

S'il n'y a pas de lien avec le joueur, on aura BA.niveaux = NULL (ou vide). Tu auras donc toutes les données en une seule requête Smile

A+

Pascal

Bonsoir, merci pour cette requêtes, j'ai lu un tuto pour la comprendre,
mais comment ensuite récupérer ces valeurs en php et les afficher ?
si je fait echo $donnees_acquis['nom'].'<br />';
Je n'obtient que les bâtiments débloquer. (idem sous phpmyadmin)

Je voudrais qu'ils s'affichent tous,
si je l'ai déjà construit, il y a un lien 'Entrer', si je ne l'ai pas construit il y a un lien 'Construire'.


RE: [PHP] requêtes dûre - pascal - 13-11-2010

normalement tu as tous les batiments, avec le niveau du joueur :
- son niveau actuel si c'est débloqué
- une chaine vide si c'est pas débloqué

vérifie tes données, montre nous tes données de test.

++

Pascal


RE: [PHP] requêtes dûre - Hell-AstiK - 13-11-2010

sous PHPmyadmin, si j'exécute cette requête :

SELECT BA.niveaux, LB.id, LB.nom, LB.description
FROM Liste_batiments LB
LEFT JOIN Batiments_acquis BA ON BA.id_batiments = LB.id
WHERE BA.id_membres =38

j'obtiens :
[Image: 4cdf0883ac56c.jpeg]
(ne vous fiez pas à la description ^^)

J'ai tout vérifier, j'ai bien 3 id dans ma table Liste_batiments, et les id_batiments : 1 et 2 dans ma tables batiment_acquis


RE: [PHP] requêtes dûre - pascal - 13-11-2010

et celle ci ?

SELECT BA.niveaux, LB.id, LB.nom, LB.description
FROM Liste_batiments LB
LEFT JOIN Batiments_acquis BA ON LB.id = BA.id_batiments
WHERE BA.id_membres =38

et les données ?
batiments acquis :

SELECT BA.*
FROM Batiments_acquis BA
WHERE BA.id_membres =38

Liste batiments :

SELECT LB.*
FROM Liste_batiments LB



RE: [PHP] requêtes dûre - Hell-AstiK - 14-11-2010

ta première requêtes me retourne :
[Image: 4cdf111fcd6e2.jpg]

La seconde :
[Image: 4cdf102d5911d.jpg]

et la troisième :
[Image: 4cdf10c796ebc.jpg]

What else ~ ? Big Grin


RE: [PHP] requêtes dûre - niahoo - 14-11-2010

Marrant, le left-join marche pas...

pitetre comme ça ?

SELECT BA.niveaux, LB.id, LB.nom, LB.description
FROM Liste_batiments LB
LEFT JOIN Batiments_acquis BA ON LB.id = BA.id_batiments AND BA.id_membres =38