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

Résolu
nestor94 Messages postés 74 Date d'inscription   Statut Membre Dernière intervention   -  
yg_be Messages postés 23541 Date d'inscription   Statut Contributeur Dernière intervention   -
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.' ">'; 
}
A voir également:

11 réponses

jordane45 Messages postés 38483 Date d'inscription   Statut Modérateur Dernière intervention   4 746
 
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 38483 Date d'inscription   Statut Modérateur Dernière intervention   4 746
 
Lignes 12 et 13, .. faut retirer les crochets .. sinon il considère ta variable comme un array
0
yg_be Messages postés 23541 Date d'inscription   Statut Contributeur Dernière intervention   Ambassadeur 1 583
 
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   Statut Membre Dernière intervention  
 
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 38483 Date d'inscription   Statut Modérateur Dernière intervention   4 746
 
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   Statut Membre Dernière intervention  
 

<?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 38483 Date d'inscription   Statut Modérateur Dernière intervention   4 746
 
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 23541 Date d'inscription   Statut Contributeur Dernière intervention   1 583
 
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   Statut Membre Dernière intervention  
 
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 23541 Date d'inscription   Statut Contributeur Dernière intervention   Ambassadeur 1 583
 
peux-tu partager le code source HTML de la page affichée?
0
nestor94 Messages postés 74 Date d'inscription   Statut Membre Dernière intervention  
 
 <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 38483 Date d'inscription   Statut Modérateur Dernière intervention   4 746 > nestor94 Messages postés 74 Date d'inscription   Statut Membre Dernière intervention  
 
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   Statut Membre Dernière intervention  
 
Ben oui, mais ca doit etre la suite qui déconne. J'ai toujours une page blanche à l'affichage.
0
jordane45 Messages postés 38483 Date d'inscription   Statut Modérateur Dernière intervention   4 746
 
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   Statut Membre Dernière intervention  
 
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 38483 Date d'inscription   Statut Modérateur Dernière intervention   4 746
 
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 23541 Date d'inscription   Statut Contributeur Dernière intervention   1 583
 
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   Statut Membre Dernière intervention  
 
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 38483 Date d'inscription   Statut Modérateur Dernière intervention   4 746
 
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 23541 Date d'inscription   Statut Contributeur Dernière intervention   1 583
 
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   Statut Membre Dernière intervention  
 
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 23541 Date d'inscription   Statut Contributeur Dernière intervention   1 583
 
la requête doit être dans la boucle.
0
nestor94 Messages postés 74 Date d'inscription   Statut Membre Dernière intervention  
 
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