Page 1 sur 1

soucis avec jointure de table

Posté : 25 mars 2021, 00:09
par nestor94
Bonjour, je pense que c'est simple mais je suis paumé et n'arrive pas à m'en sortir. Apres x essais, voici le dernier qui ne marche pas :?

Code : Tout sélectionner

<?php $sql = "SELECT pos_x, pos_y FROM membres WHERE id=:id UNION ALL SELECT pos_x, pos_y FROM map WHERE tile=:tile"; $pdostat = $bdd->prepare($sql); $pdostat->bindvalue(':id',$id ,PDO::PARAM_INT); $pdostat->execute(); $resultat = $pdostat->fetch(); }catch(Exception $e){ //en cas d'erreur dans la requête echo "Erreur : " . $e->getMessage(); } if (!empty($resultat )) { // MISE EN SESSION $pos_x = $resultat['pos_x']; $pos_y = $resultat['pos_y']; echo '<img src="./relief/' . '$tile' .'">'; } else{ echo " Erreur : PB QQ PART !"; } ?>
Erreur : SQLSTATE[HY093]: Invalid parameter number: number of bound variables does not match number of tokens Erreur : PB QQ PART !

j'ai 1 table membres avec id, pos_x, pos_y
1 table avec id, tile, pos_x, pos_y

je souhaite récupérer tile en fonction de pos_x et pos_y de la table membres.
id, pos_x et pos_y ont les memes valeurs dans les deux tables.

Re: soucis avec jointure de table

Posté : 25 mars 2021, 00:30
par two3d
Lis ce petit tuto et regarde si ya quelque chose qui ne va pas, comme par exemple les données pas dans le même ordre dans chaque table:

https://sql.sh/cours/union/union-all

Re: soucis avec jointure de table

Posté : 25 mars 2021, 14:03
par Ryle
Salutations !

Le message d'erreur indique une incohérence entre le nombre de ":tokens" présents dans ta requête SQL, et le nombre de variables que tu spécifies ensuite pour remplacer ces tokens :
$sql = "SELECT ... WHERE id=:id UNION ALL SELECT ... WHERE tile=:tile";
...
$pdostat->bindvalue(':id',$id ,PDO::PARAM_INT);
Il faut spécifier une valeur pour chaque token ou n'utiliser qu'un seul nom de token si c'est la même variable :)

Re: soucis avec jointure de table

Posté : 25 mars 2021, 19:01
par nestor94
Pfffttt, si je comprends ? j'ai modifié ainsi:

Code : Tout sélectionner

$sql = "SELECT pos_x, pos_y FROM membres WHERE id=:id UNION ALL SELECT pos_x, pos_y FROM map WHERE tile=:tile"; $pdostat = $bdd->prepare($sql); $pdostat->bindvalue(':id',$id ,PDO::PARAM_INT); $pdostat->bindvalue(':tile',$tile ,PDO::PARAM_STR); $pdostat->execute(); $resultat = $pdostat->fetch(); }catch(Exception $e){ //en cas d'erreur dans la requête echo "Erreur : " . $e->getMessage(); } if (!empty($resultat )) { $tile = $resultat['tile']; echo '<img src="./relief/' . '$tile' .'">'; } else{ echo " Erreur : PB QQ PART !"; }
Notice: Undefined variable: tile in C:\wamp64\www\map_debut.php on line 17
Notice: Undefined index: tile in C:\wamp64\www\map_debut.php on line 26

Autre question: est-ce que ma requète est en adéquation avec ce que je veux réaliser?

Re: soucis avec jointure de table

Posté : 25 mars 2021, 19:31
par two3d
Tu na pas sélectionné tile pour le retrouver dans tes résultats (avec SELECT).

Re: soucis avec jointure de table

Posté : 26 mars 2021, 11:22
par Ryle
En fait tu t'y prends mal par rapport à ce que tu veux faire... ta requête actuelle va retourner toutes pos_x et pos_y de l'utilisateur dont tu passe l'id, ainsi que les pos_x et pox_y du tile dont tu passe la valeur.
je souhaite récupérer tile en fonction de pos_x et pos_y de la table membres.
id, pos_x et pos_y ont les memes valeurs dans les deux tables.
Les requêtes SQL se constituent quasiment comme tu les exprimes. Si tu arrives à l'exprimer dans la logique SELECT / FROM / WHERE, tu arrives à construire ta requête :

Tu veux sélectionner la valeur de tile dans la table map,
SELECT tile FROM map
avec une jointure sur la table membre en comparant les pos_x et pos_y des deux tables
LEFT JOIN membres ON map.pos_x = membres.pos_x AND map.pos_y = membres.pos_y
pour l'id du membre spécifié
WHERE membres.id=:id
Tu n'as ainsi qu'un seul paramètre à passer dans ta requête (l'id du membre) et tu récupère le ou les tiles associés de ta table map :)

Re: soucis avec jointure de table

Posté : 26 mars 2021, 11:58
par nestor94
Merci Ryle, cela semble plus cohérent. Mais le script retourne une autre erreur
 $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";

//avec une jointure sur la table membre en comparant les pos_x et pos_y des deux tables
//pour l'id du membre spécifié
 
  
  $pdostat = $bdd->prepare($sql);
  $pdostat->bindvalue(':id',$id ,PDO::PARAM_INT);
  $pdostat->execute();
  $resultat = $pdostat->fetch();    
}catch(Exception $e){
  //en cas d'erreur dans la requête
  echo "Erreur : " . $e->getMessage();
}
if (!empty($resultat )) { 
    $tile = $resultat['tile'];
echo '<img src="./relief/' . '$tile' .'">'; 
}
else{
 echo " Erreur : PB QQ PART !";
}  
?>
Erreur : SQLSTATE[23000]: Integrity constraint violation: 1052 Champ: 'tile' dans field list est ambigu Erreur : PB QQ PART !

Re: soucis avec jointure de table

Posté : 26 mars 2021, 20:13
par Ryle
Si le champ tile est ambigu, c'est que tu as une colonne tile dans ta table map, mais également une colonne tile dans ta table membre et MySQL ne sait pas lequel il doit te retourner.

En fonction de la valeur que tu veux récupérer, il te faut préciser laquelle des deux tu veux en préfixant la colonne par le nom de la table comme je l'ai fait dans la jointure ou dans le where : map.tile ou membres.tile :)

Re: soucis avec jointure de table

Posté : 27 mars 2021, 16:14
par nestor94
Merci Ryle, j'ai même fait autrement, j'ai modifié le nom du champ dans la table membres. C'est OK.