[RESOLU] problème de SELECT

Eléphant du PHP | 345 Messages

24 juin 2021, 11:11

je souhaite afficher tous les avatars de membres présents au même endroit. Ce script ne génère pas d'erreur mais seulement une page blanche. Comme les avatars sont dans la même table que les membres, j'ai simulé deux tables (T1 et T2 ). je ne sais pas s'il y a mieux a faire.
<?php
require_once 'config.php';
ini_set('display_errors', 1);
ini_set('display_startup_errors', 1);
error_reporting(E_ALL);
$id = !empty($_SESSION['id']) ? $_SESSION['id'] : NULL;
$sql = "SELECT T1.avatar FROM membres T1 INNER JOIN  membres T2 ON  T1.pos_x = T2.pos_x AND T1.pos_y = T2.pos_y  WHERE T2.id = :id ";
$pdostat = $bdd->prepare($sql);
$pdostat->bindvalue(':id',$id ,PDO::PARAM_INT);
$pdostat->execute();
while ($avatar = $pdostat->fetch(PDO::FETCH_OBJ))
{
echo '<img src="'.$avatar.'">';  
}
?>

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 10684 Messages

24 juin 2021, 12:59

Salutations !

As-tu essayé cette requête directement sur ta base dans phpMyAdmin ou équivalent (en remplaçant le :id par une valeur). Est-ce qu'elle retourne le résultat que tu attends ? Si aucun résultat n'est retourné, il n'y aura pas non plus d'enregistrement sur lesquels boucler pour afficher l'avatar et donc une page blanche.

Si tu as bien le résultat souhaité, c'est qu'il y a un problème dans ta boucle. $pdostat->fetch(PDO::FETCH_OBJ) retourne un objet anonyme avec les noms de propriétés qui correspondent aux noms des colonnes retournés dans le jeu de résultats. $avatar n'est dans ce cas pas une chaine de caractères, mais un objet dont il faut lire les attributs pour obtenir l'avatar.
Si tu regardes le code source de la page générée, du devrait voir plein de balises <img> mal constituée...
Ce n'est pas en améliorant la bougie que l'on a inventé l'ampoule...

Eléphant du PHP | 345 Messages

24 juin 2021, 23:46

Hello,

J'ai testé en direct dans PHP MYADMIN avec cette erreur retournée:

Erreur

Requête SQL : Documentation

SELECT T1.avatar FROM membres T1 INNER JOIN membres T2 ON T1.pos_x = T2.pos_x AND T1.pos_y = T2.pos_y WHERE T2.HIGREK = :HIGREK LIMIT 0, 25

MySQL a répondu : Documentation
#1064 - Erreur de syntaxe près de ':HIGREK LIMIT 0, 25' à la ligne 1
(je ne vois pas d'où vient ce LIMIT 0,25 du reste?)

Sinon, le code source générée par le script (sur la page blanche) marque seulement
1
2
Modifié en dernier par nestor94 le 24 juin 2021, 23:52, modifié 1 fois.

Mammouth du PHP | 2703 Messages

24 juin 2021, 23:50

Ryle disait : "en remplaçant le :id par une valeur"
et il ne faut pas copier coller le " avant la requête.

Eléphant du PHP | 345 Messages

24 juin 2021, 23:54

oui, j'ai mis HIGREK (un pseudo) à la place de id. et pas de double quotes dans la requete.

Mammouth du PHP | 2703 Messages

25 juin 2021, 00:02

T2.HIGREK =
il y a un champ dans la table avec ce nom ?
une chaine dans une requête doit être entourée de ""

Eléphant du PHP | 345 Messages

25 juin 2021, 09:39

Oups, j'ai corrigé ma requete
SELECT T1.avatar FROM membres T1 INNER JOIN membres T2 ON T1.pos_x = T2.pos_x AND T1.pos_y = T2.pos_y WHERE T2.pseudo = "HIGREK"

Et pour mon test dans dans Php my admin , c'est concluant .
Je coince un peu avec les objets PDO... J'ai laissé à blanc après le fetch mais ce n'est pas encore cela
<?php
require_once 'config.php';
ini_set('display_errors', 1);
ini_set('display_startup_errors', 1);
error_reporting(E_ALL);
$id = !empty($_SESSION['id']) ? $_SESSION['id'] : NULL;
$sql = "SELECT T1.avatar FROM membres T1 INNER JOIN  membres T2 ON  T1.pos_x = T2.pos_x AND T1.pos_y = T2.pos_y  WHERE T2.id = :id ";
$pdostat = $bdd->prepare($sql);
$pdostat->bindvalue(':id',$id ,PDO::PARAM_INT);
$pdostat->execute();
while ($avatar = $pdostat->fetch())
{
echo '<img src="'.$avatar.'">';  
}
?>

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 10684 Messages

25 juin 2021, 10:44

Si tu as bien le résultat souhaité, c'est qu'il y a un problème dans ta boucle. $pdostat->fetch(PDO::FETCH_OBJ) retourne un objet anonyme avec les noms de propriétés qui correspondent aux noms des colonnes retournés dans le jeu de résultats. $avatar n'est dans ce cas pas une chaine de caractères, mais un objet dont il faut lire les attributs pour obtenir l'avatar.
Si tu regardes le code source de la page générée, du devrait voir plein de balises <img> mal constituée...
;)
Ce n'est pas en améliorant la bougie que l'on a inventé l'ampoule...

Eléphant du PHP | 345 Messages

25 juin 2021, 11:13

while ($avatar = $pdostat->fetch(PDO::FETCH_STR)) ne fonctionne pas non plus.

Mammouth du PHP | 2703 Messages

25 juin 2021, 14:04

comment le contenu d'un champ de résultat d'une requête sql a été récupéré sur post467831.html ?

Eléphant du PHP | 345 Messages

26 juin 2021, 00:42

? avec une condition via le if.

Mammouth du PHP | 2703 Messages

26 juin 2021, 00:59

non

Eléphant du PHP | 345 Messages

26 juin 2021, 10:00

J'ai fait un var_dump de $avatar qu'il ne trouve pas...

Eléphant du PHP | 345 Messages

27 juin 2021, 10:55

J'ai complètement changé le script de cette façon.
<?php
require_once 'config.php';
$id = !empty($_SESSION['id']) ? $_SESSION['id'] : NULL;
$sql = "SELECT 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'];
}
$sql = "SELECT avatar FROM membres WHERE pos_x=pos_x AND pos_y=pos_y";
$pdostat = $bdd->prepare($sql);
$pdostat->execute();
$resultat = $pdostat->fetch(); 
if (!empty($resultat )) { 
$avatar = $resultat['avatar'];
}
echo '<img src="'.$avatar.'">';  
?>
cela n'affiche QUE l'avatar du "membre id" et pas les autres.
De quelle façon puis-je modifier le SELECT pour afficher les autres avatars situés sur la même position?

Mammouth du PHP | 2703 Messages

27 juin 2021, 12:02

cela n'affiche qu'un résultat, non pas car la requête sql ne retourne qu'un seul résultat, mais parce qu'il n'y a qu'un seul fetch d'exécuté. il faudrait un while()