8791 sujets

Développement web côté serveur, CMS

Bonjour,

Voilà, j'ai une page sur laquelle je doit mettre une série d'images. C'est dernières, sont toute dans une bdd. Bon, alors sur cette page je fais ma requête pour appeler les dites images que j'affiche sous forme de tableau. Le problème c'est qu'elles s'affiche toutes l'une en dessous de l'autre.

Comment fait-on pour que le tableau s'affiche sur 3 colonnes?

La page

Mon code:
<?php
$recherche = "SELECT * FROM categories";
$requete = mysql_query($recherche);
while($info = mysql_fetch_assoc($requete)) {
	$categorie = addslashes($info['fr']);
	?>
<table class="products" align="center">
	<caption class="gradient-gray"><?php echo stripslashes($categorie); ?></caption>
	<a id="<?php echo stripslashes($categorie); ?>"></a>
    <tbody>
	<?php
	$r = "SELECT * FROM produits WHERE categorie = '$categorie' AND ftp = 'yes' ORDER BY produits";
	$req = mysql_query($r);	  
	while ($p = mysql_fetch_assoc($req)){
		?>
        	<tr>
            	<th><?php echo $p['produits']; ?></th>
            </tr>
        	<tr>
            	<td>
                	<a href="../FTP/fichiers/Photo Produits/PNG/<?php echo $p['high_png']?>.png"><img alt="" src="../../Images/photosProduits/<?php echo $p['thumbnail']?>" /></a>
        	   </td>
            </tr>
		<?php
	}
	?>
	</tbody>
</table>
<p class="top"><a href="#top">Back to Top / Haut de page</a></p>
<?php
}
?>
Salut,

C'est normal puisque, pour chaque image, tu génères une ligne de tableau via la balise <tr>.

A priori, je vois 2 pistes...
La première, c'est de se passer du tableau !
Tu pourrais gérer ton affichage via CSS (avec display: inline-block ou float: left) !

La seconde, c'est de passer par un index et un truc du genre modulo dans ta boucle ($i%3) qui te permettrait de savoir quand générer une nouvelle ligne de tableau...

tm
tm™ a écrit :
C'est normal puisque, pour chaque image, tu génères une ligne de tableau via la balise <tr>.
Je sais, raison pour laquelle je demande comment générer des colonnes.

J'ai essayé de faire l'affichage en CSS avec des display:table et inline-block... c'est pas super.. ou bien j'ai encore de la difficulté à maîtriser ces propriétés.
Ligne -> tr
Case -> td

Tu ouvres ta ligne si ton nombre-1 est divisible par ton nombre de case; tu le fermes si ton nombre est divisible par ton nombre de case.

A partir de là :

<table>
<?php for($i=1;$i<=20;$i++)
{
    if(($i-1)%3==0): ?><tr><?php endif; ?>
    <td>blabla</td>
    <?php if($i%3==0):?></tr><?php endif; ?>
}
</table>

Modifié par Lothindil (31 Jan 2013 - 16:46)
Merci de ta réponse Lothindil.

C'est une bonne piste, mais j'ai du mal avec ce "type" de notion...

À quoi correspond le chiffre 20? Parce que telquel, ça m'affiche 2 fois le même produits avant de passé au suivant et ainsi de suite...

EDIT:
J'ai fait comme ça, et ça m'affiche 20 fois le produits:
<table class="products" align="center">
	<?php
	if($lang == 'FR'){
		?>
	<caption class="gradient-gray"><?php echo stripslashes($categorie);?></caption>
    <a id="<?php echo stripslashes($categorie); ?>"></a>
    	<? 
	}
	else{
		?>
	<caption class="gradient-gray"><?php echo $category;?></caption>
    <a id="<?php echo $category; ?>"></a>
    	<? 
	}
	?>
    <tbody>
	<?php
	$r = "SELECT * FROM produits WHERE categorie = '$categorie' AND ftp = 'yes' ORDER BY produits";
	$req = mysql_query($r);
	while ($p = mysql_fetch_assoc($req)){
		$produits = $p['produits'];
		$png = $p['high_png'];
		$thumbnail = $p['thumbnail'];
		
		for($i=1;$i<=20;$i++)
		{
			if(($i-1)%3==0): ?>
            <tr><?php endif; ?>
                <th><?php echo $produits; ?></th>
            </tr>
        	<tr>
            	<td>
                	<a href="../FTP/fichiers/Photo Produits/PNG/<?php echo $png?>.png"><img alt="" src="../../Images/photosProduits/<?php echo $thumbnail?>" /></a>
        	   </td>
                <?php if($i%3==0):?>
            </tr><?php endif;
		}
	}
	?>
	</tbody>
</table>

Modifié par juliesunset (31 Jan 2013 - 18:29)
Salut,

Je pense que tu as déjà un souci avec le html que tu dois générer. Smiley ohwell
Je te suggères de d'abord coder ta page html en dur.
Tu pourras ainsi avoir une meilleure vision de ce que ton code php doit produire.

Tu verras dans la structure du tableau que chaque résultat de ta requête correspond à la création d'un <td> mais que, toutes les 3 itérations, tu dois aussi ajouter un <tr>.

Pour ce faire, dans ta boucle "while", tu pourras utiliser un "compteur" ($i) qui s'incremente à chaque tour et te permet de tester via le modulo (%) quand tu dois ajouter une nouvelle ligne de tableau ou pas.

Toutes les infos sont dans le réponses données... Smiley cligne

tm
20 représente le nombre d'objets à placer dans le tableau au total ^^

Et là tous les 3 (à partir du premier), je lui demande de débuter une ligne et tous les 3 (à partir du 3ème), je lui demande de fermer la ligne ^^
tm™: Ma structure est correct, et c'est là toute ma problématique je crois, je dois reproduire les 2 lignes... ça donnerais une structure comme ça, les lignes th et td doivent rester groupé.

<table class="products" align="center">
	<caption>Caméras</caption>
    <tbody>
        <tr>
            <th>Produits</th>
            <th>Produits</th>
            <th>Produits</th>
        </tr>
        <tr>
            <td>photo</td>
            <td>photo</td>
            <td>photo</td>
        </tr>
        <tr>
            <th>Produits</th>
            <th>Produits</th>
            <th>Produits</th>
        </tr>
        <tr>
            <td>photo</td>
            <td>photo</td>
            <td>photo</td>
        </tr>
    </tbody>
</table>


Lothindil: Ok, mais si j'ignore le nombre d'objet qui sera placé? Ce n'est pas le même nombre d'un tableau à l'autre.
Salut,

Tu ne dois pas utiliser de "for" puisque tu as déjà une boucle "while"...
$i = 0;
while ($p = mysql_fetch_assoc($req)) {
  if($i%3 == 0) { echo '<tr>'; }
  // affichage des cellules
  if($i%3 == 0) { echo '</tr>'; }
  $i++
}

tm
Décidément... ça ne fonctionne toujours pas, mais au moins il n'y plus de répétition...

<tbody>
	<?php
	$r = "SELECT * FROM produits WHERE categorie = '$categorie' AND ftp = 'yes' ORDER BY produits";
	$req = mysql_query($r);
	$i = 0;
	while ($p = mysql_fetch_assoc($req)){
		$produits = $p['produits'];
		$png = $p['high_png'];
		$thumbnail = $p['thumbnail'];
		
		if($i%4 == 0){ echo '<tr>';}
		?>
			<th><?php echo $produits; ?></th>
		</tr>
		<tr>
			<td>
            	<a href="../FTP/fichiers/Photo Produits/PNG/<?php echo $png?>.png"><img alt="" src="../../Images/photosProduits/<?php echo $thumbnail?>" /></a>
			</td>
            <?php
		if($i%4 == 0){echo '</tr>';}
		$i++;
	}
	?>
	</tbody>
Salut,

Je n'avais pas regardé la structure précise de ton tableau qui, pour moi, pose problème...
Ça n'a pas de sens d'avoir des entêtes différentes au sein d'une même colonne ! Smiley confus
En fait, tu ne fais pas une présentation tabulaire de tes données...

Ceci serait plus approprié :
<ul>
  <li>
    <hx>Produit</hx>
    <img src="photo">
  </li>
  <li>
    <hx>Produit</hx>
    <img src="photo">
  </li>
...
</ul>

ou encore (dans le pire du pire) :
<table>
  <tr>
    <td>
      Produit
      <img src="photo">
    </td>
    <td>
      Produit
      <img src="photo">
    </td>
    <td>
      Produit
      <img src="photo">
    </td>
  </tr>
  <tr>
    <td>
      Produit
      <img src="photo">
    </td>
...
  </tr>
</table>


Mais la création d'un tableau se fait ligne par ligne.
Je ne pense pas que tu pourras créer tes deux lignes th + td avec une seul boucle ! Smiley biggol

tm
Modifié par tm™ (06 Feb 2013 - 16:23)
Ah d'accord... Je pensais que ça serait possible, mais puisque ce ne l'est pas... je vais faire un affichage avec une liste.

Merci pour ton aide!