[RESOLU] Problème avec un affichage d'un élément (pdo)

Petit nouveau ! | 7 Messages

08 oct. 2013, 14:45

Bonjour à tous,

Je voudrais être éclairé sur un point concernant une erreur survenue à l'instant sur un site web que je développe.
Grâce à ce code j'affiche les annonces créés par l'utilisateur.

Code : Tout sélectionner

function afficherPropreAnnonce($pdo,$id){ $affiche = $pdo->query('SELECT ID, user_categorie, user_id, date_depart, heure_depart, heure_arrivee, lieu_depart, autrepoint_depart, lieu_arrivee, autrepoint_arrivee, prix_trajet, nbr_place, commentaires, afficher_num, afficher_email FROM annonces WHERE user_id='.$id); if ($liste=$affiche->fetch() == false){ echo '<div class="no-results">Vous n\'avez aucune annonce</div>'; } elseif ($liste=$affiche->fetch() == true) { while ($liste=$affiche->fetch()) { $date = $liste['date_depart']; $annee = substr($date, 6, 4); $mois = substr($date, 3, 2); $jour = substr($date, 0, 2); if ($mois == "01"){ $mois = "Janv"; } elseif ($mois == "02"){ $mois = "Févr"; } elseif ($mois == "03"){ $mois = "Mars"; } elseif ($mois == "04"){ $mois = "Avr"; } elseif ($mois == "05"){ $mois = "Mai"; } elseif ($mois == "06"){ $mois = "Juin"; } elseif ($mois == "07"){ $mois = "Juill"; } elseif ($mois == "08"){ $mois = "Août"; } elseif ($mois == "09"){ $mois = "Sept"; } elseif ($mois == "10"){ $mois = "Oct"; } elseif ($mois == "11"){ $mois = "Nov"; } elseif ($mois == "12"){ $mois = "Déc"; } echo '<div class="row conducteur id-'.$liste['ID'].'"> <div class="date">'.$jour.' '.$mois.'</div> <div class="lieu"> <p><strong>'.$liste['heure_depart'].'</strong> - '.$liste['lieu_depart'].'</p> <p><strong>'.$liste['heure_arrivee'].'</strong> - '.$liste['lieu_arrivee'].'</p> </div> <div class="dispo"><span class="nb">'.$liste['nbr_place'].'</span> <span class="legend">places</span></div> <div class="actions"> <a href="./viewConducteur.php?id='.$liste['ID'].'" class="ico apercu">Voir l\'annonce</a> <a href="./editConducteur.php?id='.$liste['ID'].'" class="ico edit">modifier</a> <a href="#id-'.$liste['ID'].'" class="ico suppr" data-toggle="modal" >supprimer</a> </div> <div class="clearfix"></div> </div> <div class="clearfix"></div>'; } else { echo "Erreur !"; } } $affiche->closeCursor(); } }
Lorsque la personne vient de créer un compte, et que donc aucunes annonces n'est crées alors une div s'affiche :

Code : Tout sélectionner

echo '<div class="no-results">Vous n\'avez aucune annonce</div>';
Lorsque la personne poste sa première annonce, cette div disparait et rien ne s'affiche...
Puis lorsqu'il ajoute une deuxième annonce, celle ci s'affiche bien mais la première reste toujours introuvable sur la page.. Pourtant elle éxiste bien dans la bdd...

Une idée ? :/

ViPHP
xTG
ViPHP | 7331 Messages

08 oct. 2013, 17:36

Quand tu fais un fetch() tu avances le curseur. ;)
Donc ton premier test avance le curseur sur le second n-uplet.

Fais plutôt ainsi :
$liste = $affiche->fetch();
if ($liste == false){

Petit nouveau ! | 7 Messages

15 oct. 2013, 17:25

Salut xTG,

Désolé de ne te répondre que maintenant, j'ai eu une semaine plutôt chargé..
Bref, pour en revenir au sujet, j'ai essayé ce que tu m'as proposé et cela me pose toujours problèmes. La première annonce ne s'affiche toujours pas.
$affiche = $pdo->query('SELECT ID, user_categorie, user_id, date_depart, heure_depart, heure_arrivee, lieu_depart, autrepoint_depart, lieu_arrivee, autrepoint_arrivee, prix_trajet, nbr_place, commentaires FROM annonces WHERE user_id='.$id);
	$liste = $affiche->fetch();
		if ($liste == false){

			echo '<div class="no-results">Vous n\'avez aucune annonce</div>';
			echo $liste;


		} elseif ($list == true) {
			 while ($liste=$affiche->fetch())
				{
                                }
$affiche->closeCursor();

		}
Une autre idée peut-être ? :-)

ViPHP
xTG
ViPHP | 7331 Messages

15 oct. 2013, 18:01

Ta modification n'a en rien changé la donne, tu fais en fait toujours la même chose au niveau algorithmie. ;)
A savoir :

Code : Tout sélectionner

Exécuter requête Récupérer n-uplet et avancer le curseur Si n-uplet inexistant ... Sinon Tant que ( (Récupérer n-uplet et avancer le curseur) est différent de vide ) Afficher données Fin Tant que Fin si

Petit nouveau ! | 7 Messages

16 oct. 2013, 11:23

Arf je pense ne pas saisir lorsque tu parles d'avancer le curseur et ce que signifie n-uplet..

Pour avancer le curseur, si j'ai bien compris c'est faire +1 non ?
Mais comment faire sur
$liste = $affiche->fetch();
?

Dans ma fonction je lui dis de faire ça :
Exécuter requête
Savoir si $liste contient quelque chose
Si $liste = false (vide)
...
Sinon
Tant que ($liste est a true)
Afficher données
Fin tant que
Fin si
Désolé d'être un petit peu à la ramasse... :?

ViPHP
xTG
ViPHP | 7331 Messages

16 oct. 2013, 13:22

Il n'y a pas de mal à ne pas comprendre tant que l'on pose les questions. :)

Un n-uplet est une ligne d'enregistrement retournée par la requête.
Si tu fais une requête du genre :
SELECT prenom FROM table
Chaque n-uplet contiendra un prénom.

Lorsque tu exécutes une requête la fonction query te retourne une ressource à exploiter.
Cette ressource est un "tableau" contenant tous les n-uplets retournés par la requête.
La fonction fetch te permet d'exploiter les n-uplets de cette ressource, elle retourne le n-uplet courant et s'avance sur le n-uplet suivant.

Exemple :

Ma ressource contient les n-uplets suivants :

Code : Tout sélectionner

Albert Anne Baptiste Benoit Chloé
Maintenant un peu de code :
$res = query(); // ici $res pointe sur notre premier n-uplet, à savoir Albert
$data = $res->fetch(); //ici on retourne Albert et on avance le curseur sur Anne
$res->fetch(); // ici on retourne Anne (qui n'est pas sauvegardé donc on perd ce n-uplet) et on avance sur Baptiste
$data = $res->fetch(); // ici on récupère Benoit et on avance sur Chloé
// ect
En espérant que cela t'aide à comprendre.
N'hésites pas à poser d'autres questions, il n'y a pas de bête question. :)

Petit nouveau ! | 7 Messages

16 oct. 2013, 17:12

Hum d'accord, je comprend beaucoup mieux !! :-)
Merci pour ces explications sur le terme n-uplet et sur les fetch aussi ;-)

Pour mon problème, malgré tes explications je ne vois pas quoi rajouter pour en venir au résultat attendu..
Dans mon premier test (donc mon if ($liste== false)), dois-je rajouter un while (même si je ne comprendrais pas pourquoi je devrais en rajouter un... ) ?
Comment lui dire d'avancer au second n-uplet ?

Merci de prendre du temps me répondre et surtout pour ces explications :-)

ViPHP
xTG
ViPHP | 7331 Messages

16 oct. 2013, 18:34

Ton problème est que justement il avance au second n-uplet sans afficher le premier, pas l'inverse.
T'aurais-je embrouillé ? :P

Ton problème peut être résolu très simplement.
Ton souci se situe sur ta condition de while qui fait qu'on avance sur le second n-uplet.
Puisque tu as ton test (if) qui fait déjà avancer le curseur.
Le plus simplement du monde on pourrait donc remplacer ton while par un do..while afin que la condition (qui fait aussi avancer le curseur) ne soit exécutée qu'à la fin.

Ce qui donnerai :

Code : Tout sélectionner

Exécuter requête Savoir si $liste contient quelque chose Si $liste = vide Afficher liste vide Sinon Faire Afficher données Tant que (Savoir si $liste contient quelque chose) Fin si

Petit nouveau ! | 7 Messages

17 oct. 2013, 10:15

Yesssssss !!!
Super, c'étais ce do...while qu'il me manquait (et qui résout en plus un autre soucis) !! Un grand merci à toi et merci pour ce petit cours sur le n-uplet ;-)

Merci de ta patience :-)