Problème syntaxe ET traitement donnée sur jointure de table [Résolu]

Signaler
Messages postés
56
Date d'inscription
dimanche 28 février 2021
Statut
Membre
Dernière intervention
8 avril 2021
-
Messages postés
15004
Date d'inscription
lundi 9 juin 2008
Statut
Contributeur
Dernière intervention
8 avril 2021
-
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

Messages postés
32042
Date d'inscription
mercredi 22 octobre 2003
Statut
Modérateur
Dernière intervention
8 avril 2021
3 380
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.
Messages postés
32042
Date d'inscription
mercredi 22 octobre 2003
Statut
Modérateur
Dernière intervention
8 avril 2021
3 380
Lignes 12 et 13, .. faut retirer les crochets .. sinon il considère ta variable comme un array
Messages postés
15004
Date d'inscription
lundi 9 juin 2008
Statut
Contributeur
Dernière intervention
8 avril 2021
825
bonjour, je pense que l'accolade fermante en ligne 25 devrait être déplacée après la ligne 42.
Messages postés
56
Date d'inscription
dimanche 28 février 2021
Statut
Membre
Dernière intervention
8 avril 2021

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....
Messages postés
32042
Date d'inscription
mercredi 22 octobre 2003
Statut
Modérateur
Dernière intervention
8 avril 2021
3 380
tes lignes 9 et 10 ont disparues.
Il ne fallait pas les retirer... juste les corriger en retirant les map. qui se trouvaient dedans
Messages postés
56
Date d'inscription
dimanche 28 février 2021
Statut
Membre
Dernière intervention
8 avril 2021


<?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...
Messages postés
32042
Date d'inscription
mercredi 22 octobre 2003
Statut
Modérateur
Dernière intervention
8 avril 2021
3 380
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
Messages postés
15004
Date d'inscription
lundi 9 juin 2008
Statut
Contributeur
Dernière intervention
8 avril 2021
825
ce serait bien d'ajouter un
else
à if
(!empty($resultat ))
Messages postés
56
Date d'inscription
dimanche 28 février 2021
Statut
Membre
Dernière intervention
8 avril 2021

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
Messages postés
15004
Date d'inscription
lundi 9 juin 2008
Statut
Contributeur
Dernière intervention
8 avril 2021
825
peux-tu partager le code source HTML de la page affichée?
Messages postés
56
Date d'inscription
dimanche 28 février 2021
Statut
Membre
Dernière intervention
8 avril 2021

 <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>
Messages postés
32042
Date d'inscription
mercredi 22 octobre 2003
Statut
Modérateur
Dernière intervention
8 avril 2021
3 380 >
Messages postés
56
Date d'inscription
dimanche 28 février 2021
Statut
Membre
Dernière intervention
8 avril 2021

Et bien
Visiblement ton code PHP génère bien ce que tu lui as demandé
Messages postés
56
Date d'inscription
dimanche 28 février 2021
Statut
Membre
Dernière intervention
8 avril 2021

Ben oui, mais ca doit etre la suite qui déconne. J'ai toujours une page blanche à l'affichage.
Messages postés
32042
Date d'inscription
mercredi 22 octobre 2003
Statut
Modérateur
Dernière intervention
8 avril 2021
3 380
La suite ? Quelle suite ?
C'est normal que tu ne vois rien puisque que des balises HTML ne contiennent aucun texte....
Messages postés
56
Date d'inscription
dimanche 28 février 2021
Statut
Membre
Dernière intervention
8 avril 2021

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--;
}
Messages postés
32042
Date d'inscription
mercredi 22 octobre 2003
Statut
Modérateur
Dernière intervention
8 avril 2021
3 380
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 ??
Messages postés
15004
Date d'inscription
lundi 9 juin 2008
Statut
Contributeur
Dernière intervention
8 avril 2021
825
commence par comprendre ce que tu veux obtenir en html. ensuite, tu réfléchiras à la programmation php.
Messages postés
56
Date d'inscription
dimanche 28 février 2021
Statut
Membre
Dernière intervention
8 avril 2021

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.' ">'; 
}
Messages postés
32042
Date d'inscription
mercredi 22 octobre 2003
Statut
Modérateur
Dernière intervention
8 avril 2021
3 380
Tu pourrais nous représenter, manuellement, ce que tu aimerais obtenir ?
car là.. on ne comprend pas ce que tu cherches à avoir...
Messages postés
15004
Date d'inscription
lundi 9 juin 2008
Statut
Contributeur
Dernière intervention
8 avril 2021
825
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
Messages postés
56
Date d'inscription
dimanche 28 février 2021
Statut
Membre
Dernière intervention
8 avril 2021

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!
Messages postés
15004
Date d'inscription
lundi 9 juin 2008
Statut
Contributeur
Dernière intervention
8 avril 2021
825
la requête doit être dans la boucle.
Messages postés
56
Date d'inscription
dimanche 28 février 2021
Statut
Membre
Dernière intervention
8 avril 2021

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>