Page 1 sur 2

Boucle while

Posté : 29 mai 2013, 09:22
par HunabKu
Bonjour je veux afficher une image récupérée en Base de Données mysql.
Je récupère en BdD :
$query2=$db1->prepare('SELECT forum_icon_lu, forum_icon_non_lu
FROM forum_forum');
$query2->execute();
Je fait ma boucle :
while ($data2 = $query2 -> fetch())
{
	//Gestion de l'image à afficher
	if (!empty($id)) // Si le membre est connecté
	{
		if ($data['tv_id'] == $id) //S'il a lu le topic
		{
			if ($data['tv_poste'] == '0') // S'il n'a pas posté
			{
				if ($data['tv_post_id'] == $data['topic_last_post']) //S'il n'y a pas de nouveau message
				{
					$ico_mess = $data2['forum_icon_lu'];
				}
				else
				{
					$ico_mess = $data2['forum_icon_non_lu']; //S'il y a un nouveau message
				}
			}
			else // S'il a  posté
			{
				if ($data['tv_post_id'] == $data['topic_last_post']) //S'il n'y a pas de nouveau message
				{
					$ico_mess = $data2['forum_icon_lu'];
				}
				else //S'il y a un nouveau message
				{
					$ico_mess = $data2['forum_icon_non_lu'];
				}
			}
		}
		else //S'il n'a pas lu le topic
		{
			$ico_mess = $data2['forum_icon_non_lu'];
		}
	} //S'il n'est pas connecté
	else
	{
		$ico_mess = $data2['forum_icon_non_lu'];
	}
J'affiche :
	echo '<table><tr><td class="lunonlu"><img src="./images/forum/'.$ico_mess.'" alt="message" /></td></tr></table>';
}
Mon problème est que ça m'affiche la même image dans pour chaque ligne ...
Souriez-vous ou est mon problème s'il vous plait ?
Merci d'avance
Hunab Ku.

Re: Boucle while

Posté : 29 mai 2013, 09:30
par Spols
ajoute des echo un peu partout pour vérifier tes conditions.
vois aussi si il n'y a pas de conflits entre tes deux $data et $data2

Re: Boucle while

Posté : 29 mai 2013, 09:43
par sirakawa
D'où sort data ?
modifier ici pour tester
if (!empty($id)) // Si le membre est connecté
{//1
var_dump($data);

Re: Boucle while

Posté : 29 mai 2013, 09:44
par HunabKu
D’accord merci bien Spols.
Je vais vérifier ça et je te tiens au courant.

Sirakawa, le $data viens d'une autre requête pour récupérer d'autres informations pour mon forum.

Hunab Ku.

Re: Boucle while

Posté : 29 mai 2013, 09:58
par Mazarini
Tu alimentes le nom de l'image à plein d'endroit. Tu pourrais alimenter avec une valeur différente selon l'endroit. Ca te permettrait de voir dans quel branche du traitement tu passes et essayer de comprendre pourquoi.
Si la valeur ne correspond pas à une image, tu regardes dans le source HTML. Personnellement je forcerai "cas 1", "cas 2"...

Re: Boucle while

Posté : 29 mai 2013, 09:59
par HunabKu
Bonjour, Mazarini
Lorsque je place un echo $ico_mess; après else { $ico_mess = $data2['forum_icon_non_lu'];
else
	{
		$ico_mess = $data2['forum_icon_non_lu'];
		echo $ico_mess;
	}
ça me donne bien le chemin de mes images différentes ligne par ligne donc les conditions fonctionne puisque je suis dans le cas du else.
Ce qui m'amène à la question : où est-ce que le tableau est transformé en une seule ligne ?

j'ai affiché le contenu de $ico_mess juste a coté de l'<img src ...>, ça m'affiche le chemin de l'image qui s'affiche sur toutes les lignes donc le problème est entre la boucle et l'echo, aussi je vous met mon code concerné:
<?php
$query=$db1->prepare('SELECT cat_id, cat_nom, 
forum_forum.forum_id, forum_name, forum_desc, forum_post, forum_topic, auth_view, forum_topic.topic_id,  forum_topic.topic_post, post_id, post_time, post_createur, membre_pseudo, 
membre_id 
FROM forum_categorie
LEFT JOIN forum_forum ON forum_categorie.cat_id = forum_forum.forum_cat_id
LEFT JOIN forum_post ON forum_post.post_id = forum_forum.forum_last_post_id
LEFT JOIN forum_topic ON forum_topic.topic_id = forum_post.topic_id
LEFT JOIN forum_membres ON forum_membres.membre_id = forum_post.post_createur
WHERE auth_view <= :lvl 
ORDER BY cat_ordre, forum_ordre DESC');
$query->bindValue(':lvl',$lvl,PDO::PARAM_INT);
$query->execute();

$query2=$db1->prepare('SELECT forum_icon_lu, forum_icon_non_lu
FROM forum_forum');
$query2->execute();

while ($data2 = $query2 -> fetch())
{
	//Gestion de l'image à afficher
	if (!empty($id)) // Si le membre est connecté
	{
		if ($data['tv_id'] == $id) //S'il a lu le topic
		{
			if ($data['tv_poste'] == '0') // S'il n'a pas posté
			{
				if ($data['tv_post_id'] == $data['topic_last_post']) //S'il n'y a pas de nouveau message
				{
					$ico_mess = $data2['forum_icon_lu'];
				}
				else
				{
					$ico_mess = $data2['forum_icon_non_lu']; //S'il y a un nouveau message
				}
			}
			else // S'il a  posté
			{
				if ($data['tv_post_id'] == $data['topic_last_post']) //S'il n'y a pas de nouveau message
				{
					$ico_mess = $data2['forum_icon_lu'];
				}
				else //S'il y a un nouveau message
				{
					$ico_mess = $data2['forum_icon_non_lu'];
				}
			}
		}
		else //S'il n'a pas lu le topic
		{
			$ico_mess = $data2['forum_icon_non_lu'];
		}
	} //S'il n'est pas connecté
	else
	{
		$ico_mess = $data2['forum_icon_non_lu'];
	}
	?>
	<center><table>
	<?php
	//Début de la boucle
	while($data = $query->fetch())
	{
		//On affiche chaque catégorie
		if( $categorie != $data['cat_id'] )
		{
			//Si c'est une nouvelle catégorie on l'affiche
			
			$categorie = $data['cat_id'];
			?>
			<tr>
			<th></th>
			<th class="titre"><strong>
			<?php
			echo stripslashes(htmlspecialchars($data['cat_nom']));
			?>
			</strong></th>             
			<th class="nombremessages"><strong>Sujets</strong></th>       
			<th class="nombresujets"><strong>Messages</strong></th>       
			<th class="derniermessage"><strong>Dernier message</strong></th>   
			</tr>
			<?php
		}
	 
		//Ici, on met le contenu de chaque catégorie

		// Ce super echo de la mort affiche tous
		// les forums en détail : description, nombre de réponses etc...
	 
		//echo'<tr><td><img src="./images/message.gif" alt="message" /></td>
		echo'<tr><td class="lunonlu"><img src="./images/forum/'.$ico_mess.'" alt="message" /></td>

Re: Boucle while

Posté : 29 mai 2013, 10:28
par Mazarini
Il y a un problème de logique. Tu calcules l'image et ensuite tu affiches toutes les lignes. C'est donc le dernier calcul de l'images qui est pris en compte.

Re: Boucle while

Posté : 29 mai 2013, 10:45
par HunabKu
Ok, Mazarini, merci.
Je dois donc calculer l'image dans l'echo ? Parceque ça ne fonctionne pas dans mon cas :
while ($data2 = $query2 -> fetch())
{
	?>
	<center><table>
	<?php
	//Début de la boucle
	while($data = $query->fetch())
	{
		//On affiche chaque catégorie
		if( $categorie != $data['cat_id'] )
		{
			//Si c'est une nouvelle catégorie on l'affiche
			
			$categorie = $data['cat_id'];
			?>
			<tr>
			<th></th>
			<th class="titre"><strong>
			<?php
			echo stripslashes(htmlspecialchars($data['cat_nom']));
			?>
			</strong></th>             
			<th class="nombremessages"><strong>Sujets</strong></th>       
			<th class="nombresujets"><strong>Messages</strong></th>       
			<th class="derniermessage"><strong>Dernier message</strong></th>   
			</tr>
			<?php
		}
	 
		//Ici, on met le contenu de chaque catégorie

		// Ce super echo de la mort affiche tous
		// les forums en détail : description, nombre de réponses etc...
	 
		//echo'<tr><td><img src="./images/message.gif" alt="message" /></td>
		echo'<tr><td class="lunonlu"><img src="./images/forum/';
		
		//Gestion de l'image à afficher
		if (!empty($id)) // Si le membre est connecté
		{
			if ($data['tv_id'] == $id) //S'il a lu le topic
			{
				if ($data['tv_poste'] == '0') // S'il n'a pas posté
				{
					if ($data['tv_post_id'] == $data['topic_last_post']) //S'il n'y a pas de nouveau message
					{
						$ico_mess = $data2['forum_icon_lu'];
					}
					else
					{
						$ico_mess = $data2['forum_icon_non_lu']; //S'il y a un nouveau message
					}
				}
				else // S'il a  posté
				{
					if ($data['tv_post_id'] == $data['topic_last_post']) //S'il n'y a pas de nouveau message
					{
						$ico_mess = $data2['forum_icon_lu'];
					}
					else //S'il y a un nouveau message
					{
						$ico_mess = $data2['forum_icon_non_lu'];
					}
				}
			}
			else //S'il n'a pas lu le topic
			{
				$ico_mess = $data2['forum_icon_non_lu'];
			}
		} //S'il n'est pas connecté
		else
		{
			$ico_mess = $data2['forum_icon_non_lu'];
		}
		
		echo $ico_mess.'" alt="message" /></td>

Re: Boucle while

Posté : 29 mai 2013, 12:05
par Spols
Le problème est que tu traite tes requètes dans le mauvais ordre,

tu essaye d'atteindre $data alors que tu ne le traite qu'après, donc elle ne sont pas définie et tu te retrouve dans le else générale.

Inverse l'ordre de traitements des requètes

Re: Boucle while

Posté : 29 mai 2013, 13:33
par Mazarini
Ce que je ne comprends pas, c'est le nombre de ligne que te retourne la requete que fournit les images. Je pense une seule pour avoir une image lu et une non lu. Dans se cas, stocke les 2 images et choisi celle à afficher au moment de l'affichage dans la boucle de lecture des messages.

Re: Boucle while

Posté : 29 mai 2013, 14:16
par HunabKu
Spols, je ne suis pas connecté durant mes tests donc je tombe de toute manière dans le else :
else
{
	$ico_mess = $data2['forum_icon_non_lu'];
}
Mazarini, j'ai une image lu et une non lu pour chaque forum.

Récapitulons :
- J'ai une image 'lu' et une 'non lu' pour chaque forum.
- Je fait mes tests non connecté et pourtant l'image affichée est une 'non lu' (colorée, les 'lu' étant en niveaux de gris)
- Mon problème est que ça m'affiche la même pour chaque.
- Mes tests démontrent que la boucle ($ico_mess = $data2['forum_icon_non_lu'];) me sort bien un array contenant toutes les chemins des images.
- Mes tests démontrent également que l'echo (echo $ico_mess;) renvoie toujours la même image.
- Conclusion personnelle : le problème se situe entre le calcul de l'image ($ico_mess = $data2['forum_icon_non_lu'];) et l'affichage de chacune (echo $ico_mess;)

Capture du bug :
Image

Dernier Code :
<?php
$query=$db1->prepare('SELECT cat_id, cat_nom, 
forum_forum.forum_id, forum_name, forum_desc, forum_post, forum_topic, auth_view, forum_topic.topic_id,  forum_topic.topic_post, post_id, post_time, post_createur, membre_pseudo, 
membre_id 
FROM forum_categorie
LEFT JOIN forum_forum ON forum_categorie.cat_id = forum_forum.forum_cat_id
LEFT JOIN forum_post ON forum_post.post_id = forum_forum.forum_last_post_id
LEFT JOIN forum_topic ON forum_topic.topic_id = forum_post.topic_id
LEFT JOIN forum_membres ON forum_membres.membre_id = forum_post.post_createur
WHERE auth_view <= :lvl 
ORDER BY cat_ordre, forum_ordre DESC');
$query->bindValue(':lvl',$lvl,PDO::PARAM_INT);
$query->execute();

$query2=$db1->prepare('SELECT forum_icon_lu, forum_icon_non_lu
FROM forum_forum');
$query2->execute();

while ($data2 = $query2 -> fetch())
{
	?>
	<center><table>
	<?php
	//Début de la boucle
	while($data = $query->fetch())
	{
		//On affiche chaque catégorie
		if( $categorie != $data['cat_id'] )
		{
			//Si c'est une nouvelle catégorie on l'affiche
			
			$categorie = $data['cat_id'];
			?>
			<tr>
			<th></th>
			<th class="titre"><strong>
			<?php
			echo stripslashes(htmlspecialchars($data['cat_nom']));
			?>
			</strong></th>             
			<th class="nombremessages"><strong>Sujets</strong></th>       
			<th class="nombresujets"><strong>Messages</strong></th>       
			<th class="derniermessage"><strong>Dernier message</strong></th>   
			</tr>
			<?php
		}
	 
		//Ici, on met le contenu de chaque catégorie

		// Ce super echo de la mort affiche tous
		// les forums en détail : description, nombre de réponses etc...
	 
		//echo'<tr><td><img src="./images/message.gif" alt="message" /></td>
		echo'<tr><td class="lunonlu"><img src="./images/forum/';
		
		//Gestion de l'image à afficher
		if (!empty($id)) // Si le membre est connecté
		{
			if ($data['tv_id'] == $id) //S'il a lu le topic
			{
				if ($data['tv_poste'] == '0') // S'il n'a pas posté
				{
					if ($data['tv_post_id'] == $data['topic_last_post']) //S'il n'y a pas de nouveau message
					{
						$ico_mess = $data2['forum_icon_lu'];
					}
					else
					{
						$ico_mess = $data2['forum_icon_non_lu']; //S'il y a un nouveau message
					}
				}
				else // S'il a  posté
				{
					if ($data['tv_post_id'] == $data['topic_last_post']) //S'il n'y a pas de nouveau message
					{
						$ico_mess = $data2['forum_icon_lu'];
					}
					else //S'il y a un nouveau message
					{
						$ico_mess = $data2['forum_icon_non_lu'];
					}
				}
			}
			else //S'il n'a pas lu le topic
			{
				$ico_mess = $data2['forum_icon_non_lu'];
			}
		} //S'il n'est pas connecté
		else
		{
			$ico_mess = $data2['forum_icon_non_lu'];
		}
		echo $ico_mess;
		echo '" alt="message" /></td>
		<td class="titre"><strong>
		<a class="lien" href="./voirforum.php?f='.$data['forum_id'].'">
		'.stripslashes(htmlspecialchars($data['forum_name'])).'</a></strong>
		<br />'.nl2br(stripslashes(htmlspecialchars($data['forum_desc']))).'</td>
		<td class="nombresujets">'.$data['forum_topic'].'</td>
		<td class="nombremessages">'.$data['forum_post'].'</td>';
	 
		// Deux cas possibles :
		// Soit il y a un nouveau message, soit le forum est vide
		if (!empty($data['forum_post']))
		{
			 //Selection dernier message
		 $nombreDeMessagesParPage = 15;
			 $nbr_post = $data['topic_post'] +1;
		 $page = ceil($nbr_post / $nombreDeMessagesParPage);
			  
			 echo'<td class="derniermessage">
			 '.date('H\hi \l\e d/M/Y',$data['post_time']).'<br />
			 <a class="lien" href="./voirprofil.php?m='.stripslashes(htmlspecialchars($data['membre_id'])).'&action=consulter">'.$data['membre_pseudo'].'  </a>
			 <a class="lien" href="./voirtopic.php?t='.$data['topic_id'].'&page='.$page.'#p_'.$data['post_id'].'">
			 <img src="./images/forum/go.gif" alt="go" /></a></td></tr>';
			 /*<img src="./images/go.gif" alt="go" /></a></td></tr>';*/
	 
		 }
		 else
		 {
			 echo '<td class="nombremessages">Pas de message</td></tr>';
		 }
	 
		 //Cette variable stock le nombre de messages, on la met à jour
		 $totaldesmessages += $data['forum_post'];
	 
		 //On ferme notre boucle et nos balises
	} //fin de la boucle
} // fin du while ($data2 = $query2 -> fetch())
$query->CloseCursor();
$query2->CloseCursor();
echo '</table></center><br /><br />';

Re: Boucle while

Posté : 29 mai 2013, 15:13
par Mazarini
Le plus simple est peut être de faire une seule requete en ajoutant les 2 images comme colonne puisque tu lis déjà la table forum_forum dans la requete avec jointure.
Tu feras ainsi une seule boucle de lecture.

Re: Boucle while

Posté : 29 mai 2013, 15:17
par HunabKu
Effectivement je sais pas pourquoi je me suis compliqué à les séparer. Je vais essayer ça.
Merci Mazarini

Re: Boucle while

Posté : 29 mai 2013, 16:16
par Spols
Quelle est la structure de ta table forum_forum ?

et le résultat phpmyadmin de ta requète ?

Re: Boucle while

Posté : 29 mai 2013, 16:20
par HunabKu
Voila j'ai essayé mais je ne comprend pas pourquoi ça ne fonctionne pas :
Me serais-je trompé dans les LEFT JOIN ? (je connais pas trop les jointures, si vous pouviez m'expliquer au passage, s'il vous plait :wink: )
$query=$db1->prepare('SELECT cat_id, cat_nom, 
forum_forum.forum_id, forum_name, forum_desc, forum_post, forum_topic, auth_view, forum_forum.forum_icon_lu, forum_forum.forum_icon_non_lu, forum_topic.topic_id, forum_topic.topic_post, post_id, post_time, post_createur, membre_pseudo, 
membre_id 
FROM forum_categorie
LEFT JOIN forum_forum ON forum_categorie.cat_id = forum_forum.forum_cat_id
LEFT JOIN forum_post ON forum_post.post_id = forum_forum.forum_last_post_id
LEFT JOIN forum_topic ON forum_topic.topic_id = forum_post.topic_id
LEFT JOIN forum_membres ON forum_membres.membre_id = forum_post.post_createur
LEFT JOIN forum_icon_lu ON forum_forum.forum_id = forum_forum.forum_icon_lu
LEFT JOIN forum_icon_non_lu ON forum_forum.forum_id = forum_forum.forum_icon_non_lu
WHERE auth_view <= :lvl 
ORDER BY cat_ordre, forum_ordre DESC');
Table forum_categorie :
Image
Table forum_forum :
Image

PS: Ça affiche un message d'erreur :

Code : Tout sélectionner

SCREAM: Error suppression ignored for ( ! ) Warning: Illegal string offset 'forum_icon_non_lu'