Problème syntaxe ET traitement donnée sur jointure de table

Résolu/Fermé
nestor94 Messages postés 74 Date d'inscription dimanche 28 février 2021 Statut Membre Dernière intervention 14 octobre 2021 - 31 mars 2021 à 22:50
yg_be Messages postés 23309 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 2 novembre 2024 - 8 avril 2021 à 13:52
Bonjour,
Je cale sur ce problème qui comporte plusieurs erreurs et vous remercie à l'avance de votre indulgence !
j'ai deux tables:

membres avec id, pos_x, pos_y
exemple 1 7 7
map avec tile, pos_x, pos_y
exemple foret 7 7

je souhaite récupérer pos_x et pos_y de la table map en fonction de id pos_x et pos_y
de la table membres et afficher 5 positions autour...


$sql = "SELECT map.pos_x, map.pos_y  LEFT JOIN membres ON membres.pos_x = map.pos_x  AND membres.pos_y = map.pos_y WHERE membres.id=:id";
$pdostat = $bdd->prepare($sql);
$pdostat->bindvalue(':id',$id ,PDO::PARAM_INT);
$pdostat->execute();
$resultat = $pdostat->fetch();    
if (!empty($resultat ))
 { 
//On récupère les coordonnées du joueur depuis table map ?
$pos_x = $resultat['map.pos_x'];
$pos_y = $resultat['map.pos_y'];
//On déclare les variables de positionnement carte
$compteurY = ['$pos_y + 6'];
$finY = ['$pos_y - 6'];
// on definit la taille de la carte
$largeur = 5;
$hauteur = 5;
// On calcule l'aire de la mini-map
$compteurX = $pos_x - 6;
$compteurY = $pos_y + 6;

$finX = $pos_x + 6;
$finY = $pos_y - 6;

$debutX = $pos_x - 6;
}
while($compteurY >= $finY)
{
	echo' <div class="container">';
	echo '<div class="row">  ';
	echo ' <div class="col-md-offset-2 col-md-8"> ';
	echo ' <div id="map" style="width:660px; height:660px"></div>';
	echo '        </div>
    </div>
</div> ';
  echo '</div>', "\n";
                $compteurX++;
           
        echo '</div>', "\n";
        $compteurX = $debutX;
        $compteurY--;
}


Erreur : SQLSTATE[42000]: Syntax error or access violation: 1064 Erreur de syntaxe près de 'INNER JOIN membres ON membres.pos_x = map.pos_x AND membres.pos_y = map.pos_y W' à la ligne 1
Undefined variable: finY in C:\wamp64\www\map_debut.php on line 49
Undefined variable: compteurY in C:\wamp64\www\map_debut.php on line 49

pour info, j'arrive à afficher "tile" (une seule case, celle de l'id membres) avec ce script mais on est loin de ce que je souhaite.
$sql = "SELECT tile FROM map LEFT JOIN membres ON map.pos_x = membres.pos_x AND map.pos_y = membres.pos_y WHERE membres.id=:id";
$pdostat = $bdd->prepare($sql);
$pdostat->bindvalue(':id',$id ,PDO::PARAM_INT);
$pdostat->execute();
$resultat = $pdostat->fetch();    
if (!empty($resultat )) { 
    $tile = $resultat['tile'];
echo '<img src=" '.$tile.' ">'; 
}

11 réponses

jordane45 Messages postés 38269 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 4 novembre 2024 4 694
31 mars 2021 à 22:56
Bonjour,

Première requête ... tu as oublié le FROM

Lignes 9 et 10 ... faut retirer les 'map.'

Lignes 12 et 13, tu dois, soit faire de la concaténation ... soit utiliser des doubles quotes. Sinon les variables php ne sont pas interprétées.
0
jordane45 Messages postés 38269 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 4 novembre 2024 4 694
31 mars 2021 à 23:05
Lignes 12 et 13, .. faut retirer les crochets .. sinon il considère ta variable comme un array
0
yg_be Messages postés 23309 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 2 novembre 2024 Ambassadeur 1 551
31 mars 2021 à 23:02
bonjour, je pense que l'accolade fermante en ligne 25 devrait être déplacée après la ligne 42.
0
nestor94 Messages postés 74 Date d'inscription dimanche 28 février 2021 Statut Membre Dernière intervention 14 octobre 2021
Modifié le 1 avril 2021 à 09:46
Voici les modifications apportées et le code complet.
Il reste un soucis de variable et je ne sais pas quoi mettre pour les déclarer.

<?php
session_start();
ini_set('display_errors', 1);
ini_set('display_startup_errors', 1);
error_reporting(E_ALL);
require_once 'config.php';
$id = !empty($_SESSION['id']) ? $_SESSION['id'] : NULL;
try{ 
$sql = "SELECT map.pos_x, map.pos_y FROM map LEFT JOIN membres ON membres.pos_x = map.pos_x  AND membres.pos_y = map.pos_y WHERE membres.id=:id";
$pdostat = $bdd->prepare($sql);
$pdostat->bindvalue(':id',$id ,PDO::PARAM_INT);
$pdostat->execute();
$resultat = $pdostat->fetch();    
}catch(Exception $e){
  echo "Erreur : " . $e->getMessage();
}
if (!empty($resultat ))
 { 
//On déclare les variables de positionnement carte
$compteurY = "$pos_y + 6";
$finY = "$pos_y - 6";
// on definit la taille de la carte
$largeur = 5;
$hauteur = 5;
// On calcule l'aire de la mini-map
$compteurX = $pos_x - 6;
$compteurY = $pos_y + 6;
$finX = $pos_x + 6;
$finY = $pos_y - 6;
$debutX = $pos_x - 6;
while($compteurY >= $finY)
{
 echo' <div class="container">';
 echo '<div class="row">  ';
 echo ' <div class="col-md-offset-2 col-md-8"> ';
 echo ' <div id="map" style="width:660px; height:660px"></div>';
 echo '        </div>
    </div>
</div> ';
  echo '</div>', "\n";
                $compteurX++;
           
        echo '</div>', "\n";
        $compteurX = $debutX;
        $compteurY--;
}
 }
?>



Undefined variable: pos_y in C:\wamp64\www\map_debut.php on line 20
Undefined variable: pos_x in C:\wamp64\www\map_debut.php on line 26

le var_dump de pos_x et pos_y est OK....
0
jordane45 Messages postés 38269 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 4 novembre 2024 4 694
1 avril 2021 à 09:55
tes lignes 9 et 10 ont disparues.
Il ne fallait pas les retirer... juste les corriger en retirant les map. qui se trouvaient dedans
0
nestor94 Messages postés 74 Date d'inscription dimanche 28 février 2021 Statut Membre Dernière intervention 14 octobre 2021
1 avril 2021 à 11:12

<?php
session_start();
ini_set('display_errors', 1);
ini_set('display_startup_errors', 1);
error_reporting(E_ALL);
require_once 'config.php';
$id = !empty($_SESSION['id']) ? $_SESSION['id'] : NULL;
try{ 
$sql = "SELECT map.pos_x, map.pos_y FROM map LEFT JOIN membres ON membres.pos_x = map.pos_x  AND membres.pos_y = map.pos_y WHERE membres.id=:id";
$pdostat = $bdd->prepare($sql);
$pdostat->bindvalue(':id',$id ,PDO::PARAM_INT);
$pdostat->execute();
$resultat = $pdostat->fetch();    
}catch(Exception $e){
  echo "Erreur : " . $e->getMessage();
}
if (!empty($resultat ))
	{ 
//On déclare les variables de positionnement carte
$pos_x = $resultat ['pos_x'];
$pos_y = $resultat ['pos_y'];
$compteurY = "$pos_y + 6";
$finY = "$pos_y - 6";
// on definit la taille de la carte
$largeur = 5;
$hauteur = 5;
// On calcule l'aire de la mini-map
$compteurX = $pos_x - 6;
$compteurY = $pos_y + 6;
$finX = $pos_x + 6;
$finY = $pos_y - 6;
$debutX = $pos_x - 6;
while($compteurY >= $finY)
{
	echo' <div class="container">';
	echo '<div class="row">  ';
	echo ' <div class="col-md-offset-2 col-md-8"> ';
	echo ' <div id="map" style="width:660px; height:660px"></div>';
	echo '        </div>
    </div>
</div> ';
  echo '</div>', "\n";
                $compteurX++;
           
        echo '</div>', "\n";
        $compteurX = $debutX;
        $compteurY--;
}
	}
?>


ca affiche une page blanche...
0
jordane45 Messages postés 38269 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 4 novembre 2024 4 694
Modifié le 1 avril 2021 à 11:36
Fais un var_dump de la variable résultat et regarde si elle contient des choses il se peut que ta roquette ne retourne rien
0
yg_be Messages postés 23309 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 2 novembre 2024 1 551
1 avril 2021 à 12:23
ce serait bien d'ajouter un
else
à if
(!empty($resultat ))
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
nestor94 Messages postés 74 Date d'inscription dimanche 28 février 2021 Statut Membre Dernière intervention 14 octobre 2021
1 avril 2021 à 17:50
j'ai fait les var_dump suivants:

ligne 20 var_dump($resultat);
ligne 21 var_dump($pos_x);
ligne 22 var_dump($pos_y);

C:\wamp64\www\map_debut.php:20:
array (size=4)
'pos_x' => string '7' (length=1)
0 => string '7' (length=1)
'pos_y' => string '7' (length=1)
1 => string '7' (length=1)


( ! ) Notice: Undefined variable: pos_x in C:\wamp64\www\map_debut.php on line 21


C:\wamp64\www\map_debut.php:21:null


( ! ) Notice: Undefined variable: pos_y in C:\wamp64\www\map_debut.php on line 22

C:\wamp64\www\map_debut.php:22:null
0
yg_be Messages postés 23309 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 2 novembre 2024 Ambassadeur 1 551
1 avril 2021 à 17:54
peux-tu partager le code source HTML de la page affichée?
0
nestor94 Messages postés 74 Date d'inscription dimanche 28 février 2021 Statut Membre Dernière intervention 14 octobre 2021
1 avril 2021 à 21:46
 <div class="container"><div class="row">   <div class="col-md-offset-2 col-md-8">  <div id="map" style="width:660px; height:660px"></div>        </div>
    </div>
</div> </div>
</div>
 <div class="container"><div class="row">   <div class="col-md-offset-2 col-md-8">  <div id="map" style="width:660px; height:660px"></div>        </div>
    </div>
</div> </div>
</div>
 <div class="container"><div class="row">   <div class="col-md-offset-2 col-md-8">  <div id="map" style="width:660px; height:660px"></div>        </div>
    </div>
</div> </div>
</div>
 <div class="container"><div class="row">   <div class="col-md-offset-2 col-md-8">  <div id="map" style="width:660px; height:660px"></div>        </div>
    </div>
</div> </div>
</div>
 <div class="container"><div class="row">   <div class="col-md-offset-2 col-md-8">  <div id="map" style="width:660px; height:660px"></div>        </div>
    </div>
</div> </div>
</div>
 <div class="container"><div class="row">   <div class="col-md-offset-2 col-md-8">  <div id="map" style="width:660px; height:660px"></div>        </div>
    </div>
</div> </div>
</div>
 <div class="container"><div class="row">   <div class="col-md-offset-2 col-md-8">  <div id="map" style="width:660px; height:660px"></div>        </div>
    </div>
</div> </div>
</div>
 <div class="container"><div class="row">   <div class="col-md-offset-2 col-md-8">  <div id="map" style="width:660px; height:660px"></div>        </div>
    </div>
</div> </div>
</div>
 <div class="container"><div class="row">   <div class="col-md-offset-2 col-md-8">  <div id="map" style="width:660px; height:660px"></div>        </div>
    </div>
</div> </div>
</div>
 <div class="container"><div class="row">   <div class="col-md-offset-2 col-md-8">  <div id="map" style="width:660px; height:660px"></div>        </div>
    </div>
</div> </div>
</div>
 <div class="container"><div class="row">   <div class="col-md-offset-2 col-md-8">  <div id="map" style="width:660px; height:660px"></div>        </div>
    </div>
</div> </div>
</div>
 <div class="container"><div class="row">   <div class="col-md-offset-2 col-md-8">  <div id="map" style="width:660px; height:660px"></div>        </div>
    </div>
</div> </div>
</div>
 <div class="container"><div class="row">   <div class="col-md-offset-2 col-md-8">  <div id="map" style="width:660px; height:660px"></div>        </div>
    </div>
</div> </div>
</div>
0
jordane45 Messages postés 38269 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 4 novembre 2024 4 694 > nestor94 Messages postés 74 Date d'inscription dimanche 28 février 2021 Statut Membre Dernière intervention 14 octobre 2021
1 avril 2021 à 21:50
Et bien
Visiblement ton code PHP génère bien ce que tu lui as demandé
0
nestor94 Messages postés 74 Date d'inscription dimanche 28 février 2021 Statut Membre Dernière intervention 14 octobre 2021
2 avril 2021 à 09:41
Ben oui, mais ca doit etre la suite qui déconne. J'ai toujours une page blanche à l'affichage.
0
jordane45 Messages postés 38269 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 4 novembre 2024 4 694
2 avril 2021 à 10:00
La suite ? Quelle suite ?
C'est normal que tu ne vois rien puisque que des balises HTML ne contiennent aucun texte....
0
nestor94 Messages postés 74 Date d'inscription dimanche 28 février 2021 Statut Membre Dernière intervention 14 octobre 2021
2 avril 2021 à 19:26
J'entends bien et c'est là que le bat blesse. Comment je mets le résultat de la requete dans mes div? cette fin de script ne semble pas valable...

while($compteurY >= $finY)
{
	 echo '<div class="case_map">';
	echo' <div class="container">';
	echo '<div class="row">  ';
	echo ' <div class="col-md-offset-2 col-md-8"> ';
	echo ' <div id="map" style="width:60px; height:60px"></div>';
	echo '        </div>
    </div>
</div> ';
   echo '</div>', "\n";
                $compteurX++;
       
        echo '</div>', "\n";
        $compteurX = $debutX;
        $compteurY--;
}
0
jordane45 Messages postés 38269 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 4 novembre 2024 4 694
2 avril 2021 à 20:10
C'est quoi que tu veux afficher provenant du résultat de ta requête au juste ?
Autrement dit... que penses tu ( veux tu... ) obtenir exactement ??
0
yg_be Messages postés 23309 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 2 novembre 2024 1 551
2 avril 2021 à 20:12
commence par comprendre ce que tu veux obtenir en html. ensuite, tu réfléchiras à la programmation php.
0
nestor94 Messages postés 74 Date d'inscription dimanche 28 février 2021 Statut Membre Dernière intervention 14 octobre 2021
3 avril 2021 à 10:57
je veux afficher
$pos_x = $resultat ['pos_x'];
$pos_y = $resultat ['pos_y'];

avec 5 positions autour.....

faudrait-il partir d'une autre base telle que:

$sql = "SELECT tile FROM map LEFT JOIN membres ON map.pos_x = membres.pos_x AND map.pos_y = membres.pos_y WHERE membres.id=:id";
$pdostat = $bdd->prepare($sql);
$pdostat->bindvalue(':id',$id ,PDO::PARAM_INT);
$pdostat->execute();
$resultat = $pdostat->fetch();    
if (!empty($resultat )) { 
    $tile = $resultat['tile'];
echo '<img src=" '.$tile.' ">'; 
}
0
jordane45 Messages postés 38269 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 4 novembre 2024 4 694
3 avril 2021 à 13:08
Tu pourrais nous représenter, manuellement, ce que tu aimerais obtenir ?
car là.. on ne comprend pas ce que tu cherches à avoir...
0
yg_be Messages postés 23309 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 2 novembre 2024 1 551
3 avril 2021 à 13:39
je crois deviner que tu veux afficher un carré de 11 * 11 positions, centré sur la position du joueur (position extraite de table membres).
Chaque case du carré doit afficher une image, extraite de la table map.
Est-ce exact?

si oui, tu dois faire deux boucles imbriquées, une avec $compteurY (pour chaque ligne du carré), l'autre avec $compteurX (pour chaque colonne du tableau).
pour chaque case du carré, faire une requête SQL telle que:
SELECT tile FROM map WHERE pos_x = $compteurX AND pos_y = $compteurY
0
nestor94 Messages postés 74 Date d'inscription dimanche 28 février 2021 Statut Membre Dernière intervention 14 octobre 2021
Modifié le 3 avril 2021 à 18:00
C'est exactement cela. Je vais tenter de m'y atteler... heu, la (ou les) requetes, c'est à positionner avant ou dans la boucle? Merci!
0
yg_be Messages postés 23309 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 2 novembre 2024 1 551
8 avril 2021 à 13:52
la requête doit être dans la boucle.
0
nestor94 Messages postés 74 Date d'inscription dimanche 28 février 2021 Statut Membre Dernière intervention 14 octobre 2021
8 avril 2021 à 13:11
J'ai abandonné les boucles et suis parti sur un affichage direct dans un tableau.

$id = !empty($_SESSION['id']) ? $_SESSION['id'] : NULL;
// affichage de la position du joueur depuis table membres
$sql = "SELECT id, pos_x, pos_y FROM membres WHERE id=:id";
$pdostat = $bdd->prepare($sql);
$pdostat->bindvalue(':id',$id ,PDO::PARAM_INT);
$pdostat->execute();
$resultat = $pdostat->fetch();    
if (!empty($resultat )) { 
$pos_x = $resultat['pos_x'];
$pos_y = $resultat['pos_y'];


puis pour affichage sur chaque case (en modifiant à chaque fois pos_x et pos_y !)

<td style="width:60px; height:60px;"><?php
$sql = "SELECT tile FROM map LEFT JOIN membres ON map.pos_x = membres.pos_x+1 AND map.pos_y = membres.pos_y-1 WHERE membres.id=:id";
$pdostat = $bdd->prepare($sql);
$pdostat->bindvalue(':id',$id ,PDO::PARAM_INT);
$pdostat->execute();
$resultat = $pdostat->fetch();    
if (!empty($resultat )) { 
$tile = $resultat['tile'];
                }
echo '<img src='.$tile.'>'?></td>
0