problème boucle while et mise en page

mztt2
Invité n'ayant pas de compte PHPfrance

24 janv. 2010, 03:20

Bonjour à tous,

J'ai un petit souci concernant un boucle while me permettant d'afficher des données stockée dans ma BDD.
Pour chaque enregistrement j'affiche différentes données.
J'ai un problème de mise en page avec mes div. Je ne sais pas très bien comment les placer pour que ma boucle ferme bien les balises quand il faut.

voici mon code :
<div id="conteneur">
		
     	<?php 
     include ("menu_gauche.php");
    ?>
		
		<div id="centre">
		    <div id="top"></div>
			  <div id="cadre">
			  
			  
				   	<table border="0" cellpadding="4" cellspacing="0">
 <tr>
  <td><div id="wn">
    <div id="lyr1">
    <div class="contenu">
				        
				        
				        
				      <h1>  Le catalogue </h1>
 

<?php $idLivreEnCours = 0;
 
while ($ligne =  mysql_fetch_assoc($livre)) { // récupération des résultats de la requête
        
    if ($ligne['id_livre'] != $idLivreEnCours) { // nouveau livre
        $idLivreEnCours = $ligne['id_livre'];
         
        echo "<div class='sepa'></div>";
        echo '<br/>';
        echo "<div>
				          <div class='gauche'>
                      <a href='fiche_ouvrage.php?id_livre={$ligne['id_livre']}'><img src='images/{$ligne['couverture']}' border='0'/></a>
                  </div>";
                  
        echo "<div class='droite'><h2> {$ligne['titre_livre']}</h2>";
        echo "Date de publication : {$ligne['date_publication']}<br/> <br/>";
    }
        
    echo "{$ligne['nom_relation']} : <a href='fiche_auteur.php?id_auteur={$ligne['id_auteur']}'>{$ligne['prenom']} {$ligne['nom']}</a> <br/></div>";
      
}
     
?>
        
              </div> 
         </div> 
</div>
				
			</td>

  <td><div id="scrollbar"><!-- border attribute added to reduce support questions on the subject. 
    If you like valid strict markup, remove and place a img {border:none;} spec in style sheet -->
    <div id="up"><a class="mouseover_up" href=""><img src="images/btn-up.gif" width="11" height="11" alt="" border="0" /></a></div>
    <div id="track">
        <div id="dragBar"></div>
    </div>
    <div id="down"><a class="mouseover_down" href=""><img src="images/btn-dn.gif" width="11" height="11" alt="" border="0" /></a></div>
</div></td>
 </tr>
</table> 	
				
				
			</div>
			<div id="footer"></div>
		</div>
		
	     	<?php 
     include ("menu_droite.php");
    ?>
		
	</div>
Je sais, le code est un peu long...

Voici ce qu'il se passe. En ce moment j'ai 4 enregistrements (livres) dans ma BDD. Cela s'affiche plutôt bien. Mais si j'ajoute un autre livre dans ma base, l'affichage saute complètement.

Si quelqu'un a un peu de temps pour justement prendre le temps de regarder mon code et me dire ce qui cloche se serait vraiment super.
Je me triture l'esprit depuis plusieurs heures en essayant pas mal de choses, mais la je n'y vois plus clair.

merci en tout cas pour ceux qui auront pris le temps de me lire.

Cdt,
Mathieu

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

24 janv. 2010, 12:08

Dans ta boucle while, tu ouvre 3 div, mais tu n'en fermes que 2, il est probable que ton soucis vienne de la :)
Ce n'est pas en améliorant la bougie que l'on a inventé l'ampoule...

Invité
Invité n'ayant pas de compte PHPfrance

24 janv. 2010, 15:44

Merci pour ta réponse,

enfaite le 3ème div est fermé juste après.

le problème est que
<div class='gauche'>
                      <a href='fiche_ouvrage.php?id_livre={$ligne['id_livre']}'><img src='images/{$ligne['couverture']}' border='0'/></a>
                  </div>
affiche toujours une image.
 echo "<div class='droite'><h2> {$ligne['titre_livre']}</h2>";
        echo "Date de publication : {$ligne['date_publication']}<br/> <br/>";
affiche toujours un titre et une date de publication
 echo "{$ligne['nom_relation']} : <a href='fiche_auteur.php?id_auteur={$ligne['id_auteur']}'>{$ligne['prenom']} {$ligne['nom']}</a> <br/></div>";
peut afficher un ou plusierus auteurs.
S'il y a plusierus auteurs, je ne peux pas fermer la div avant.

pfff... je suis complétement paumé avec tout ça.
Je continue les tests en attendant.

Merci encore pour ton aide.

Mathieu

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

24 janv. 2010, 17:19

Dans ce cas, c'est le 2ème qui n'est pas fermé.... ;)
<?php 
	$idLivreEnCours = 0;
	while ($ligne =  mysql_fetch_assoc($livre)) { // récupération des résultats de la requête

		if ($ligne['id_livre'] != $idLivreEnCours) { // nouveau livre
	
			$idLivreEnCours = $ligne['id_livre'];
			
			echo "<div class='sepa'></div>";  // DIV N°1 - fermé
			echo '<br/>';
			echo "<div>  // DIV N°2
			   <div class='gauche'>  // DIV N°3
					<a href='fiche_ouvrage.php?id_livre={$ligne['id_livre']}'><img src='images/{$ligne['couverture']}' border='0'/></a>
				</div>"; // DIV N°3 - fermé
			
			echo "<div class='droite'><h2> {$ligne['titre_livre']}</h2>"; // DIV N°4
			echo "Date de publication : {$ligne['date_publication']}<br/> <br/>";
		}
		
		echo "{$ligne['nom_relation']} : <a href='fiche_auteur.php?id_auteur={$ligne['id_auteur']}'>{$ligne['prenom']} {$ligne['nom']}</a> <br/></div>"; // DIV N°4 - fermé	
	}		
?>
Il te faut fermer ce div, mais également fermer chaque div ouvert lorsque tu es sur un nouveau livre. Pour cela, il te suffit de fermer systématiquement le div au moment où tu changes de livre (sauf pour le premier div). Et fermer le dernier lorsque tu quittes le while :
<?php 
	$idLivreEnCours = 0;
	while ($ligne =  mysql_fetch_assoc($livre)) { // récupération des résultats de la requête

		if ($ligne['id_livre'] != $idLivreEnCours) { // nouveau livre
		
			if ($idLivreEnCours != 0) // sauf pour le premier livre
				echo '</div>' // ferme le div du livre précédent
		
			....
		}
		
		echo "{$ligne['nom_relation']} : <a href='fiche_auteur.php?id_auteur={$ligne['id_auteur']}'>{$ligne['prenom']} {$ligne['nom']}</a> <br/></div>";	
	}
	if ($idLivreEnCours != 0) // s'il y a eu au moins un livre
		echo '</div>' // ferme le div du dernier livre 
		
?>
Ce n'est pas en améliorant la bougie que l'on a inventé l'ampoule...