[PHP] Table à partir de données MySQL

@ybee

Membre expert
Club iGen
18 Mai 2001
1 039
14
42
Embourg, Belgique
antoine.olbrechts.eu
Hello tout le monde!

J'aurais un peu besoin d'aide, je ne vois pas trop comment faire quelque chose en PHP:


www.srinformatique.be/periph.php


J'aimerais faire en sorte que les catégories apparaissent genre par rangées de 3 dans un tableau. Le problème c'est que le nombre de catégories varie bien entendu selon ce qu'il y a dans la base de données, donc je ne sais pas comment dire en PHP: "pour les 3 premiers, une <tr>, pour les 3 suivants une autre <tr>, et ainsi de suite..."

Je sais pas très bien si je suis clair :D


Quelqu'un voit comment m'aider?

Un grand merci !!
 
Tu fais un compteur et à chaque fois que c'est divisible par trois, tu fais une nouvelle ligne.

Pour savoir si un nombre A est divisible par un nombre B, tu peux utiliser l'opération "modulo" (qui signifie "reste de la division entière"). Si A modulo B est égal à 0, cela veut dire que A est divisible par B (ou que le reste de la division de A par B est nul).

En PHP, l'opération modulo est le pourcent : %.

Bloc de code:
<?php

$a = 27;
$b = 3;
$c = $a % $b;

if ($c == 0)
{
   // $a est divisible par $b
}

?>

En l'occurence, tu initialises un compteur à 1, tu l'incrémentes à chaque produit, et tu testes à chaque itération, si ton compteur modulo 3 est égal à 0. Si c'est le cas, tu commences une nouvelle ligne.

Bloc de code:
<table>
<?php

for ($i = 0 ; $i < 20 ; $i++)
{
   if (($i % 3) == 0)
   {
      echo "<tr>";
   }

   echo "<td>blabla</td>";

   if (($i % 3) == 2)
   {
      echo "</tr>";
   }
}

?>
</table>

Ce que je fais là, c'est dire que si le compteur $i (initialisé à 0) est divisible par 3, alors on ouvre une balise <tr>. Ensuite, on affiche les <td></td>, puis si le reste de la division de $i par 3 est égal à 2, on ferme la ligne avec un </tr>.

En situation réelle, ça donnerait (ce qui est affiché est en rouge) :
première boucle :
$i = 0, donc :
- test : $i % 3 == 0 ? oui donc on affiche <tr>
- affichage de <td>blabla</td>
- test : $i % 3 == 2 ? non, donc on fait rien

deuxième boucle :
$i = 1, donc :
- test : $i % 3 == 0 ? non, donc on fait rien
- affichage de <td>blabla</td>
- test : $i % 3 == 2 ? non, donc on fait rien

troisième boucle :
$i = 2, donc :
- test : $i % 3 == 0 ? non, donc on fait rien
- affichage de <td>blabla</td>
- test : $i % 3 == 2 ? oui, donc on affiche </tr>

quatrième boucle :
$i = 3, donc :
- test : $i % 3 == 0 ? oui donc on affiche <tr>
- affichage de <td>blabla</td>
- test : $i % 3 == 2 ? non, donc on fait rien

etc.

Si tu regardes ce qui est noté en rouge, on a bien un truc du genre
<tr><td>blabla</td><td>blabla</td><td>blabla</td></tr>
<tr>...

Par contre, tu dois pouvoir éviter PHP en utilisant les CSS. Génère simplement une liste de <div> (ou de <li>) auquelx tu donnes une certaine largeur (on va dire 50px), et tu mets tout ça dans un conteneur trois fois plus large (150px). En utilisant les styles float:left ou display:inline, tu dois pouvoir t'arranger pour qu'il n'y a que trois éléments par ligne (chaque élément faisant 50px, il n'y en a que trois qui entrent dans une largeur de 150px).
 
sylver a dit:
Par contre, tu dois pouvoir éviter PHP en utilisant les CSS. Génère simplement une liste de <div> (ou de <li>) auquelx tu donnes une certaine largeur (on va dire 50px), et tu mets tout ça dans un conteneur trois fois plus large (150px). En utilisant les styles float:left ou display:inline, tu dois pouvoir t'arranger pour qu'il n'y a que trois éléments par ligne (chaque élément faisant 50px, il n'y en a que trois qui entrent dans une largeur de 150px).



Mmmmmh pas con ça, plus léger non? Je vais peut être regardé ça d'abord...
 
@ybee a dit:
Mmmmmh pas con ça, plus léger non? Je vais peut être regardé ça d'abord...

regarde cette page

dans ma fonction d'affichage, j'utilise...

Bloc de code:
$query="SELECT * FROM xxxxxx WHERE $search=$what ORDER BY user1 ASC LIMIT $limite,$nombre";
	$num_dl=1;
	$result= mysql_query($query);
		while ($val=mysql_fetch_array($result)) {
		// On aligne sur 4 occurences.
		if($num_dl<4){ 
		// On construit la liste des images
		$Kod.=gen_dl_images($val['aid'],$val['pid'], $val['filepath'], $val['filename'], $val['title'], $val['keywords'],$val['caption'],$val['user1'], $limite);
		$num_dl++;
		}else{
		$Kod.=gen_dl_images($val['aid'],$val['pid'], $val['filepath'], $val['filename'], $val['title'], $val['keywords'],$val['caption'],$val['user1'], $limite);
		$Kod.='<br style="clear:left;line-height:1px;" />'."\n";
		$num_dl=1;
		}


puis une autre fonction...

Bloc de code:
//Generation des listes de definitions pour l'affichage des vignettes images, $search
 		function gen_dl_images($src_aid,$src_pid,$src_filepath,$src_filename, $src_title, $src_keywords, $src_caption, $src_user1, $src_limite){
 		if($src_caption!=""){$comment='<img src="puce2.gif" width="6" height="6" border="0" alt=""/> ';}
		$kod='<dl class="gen_dl">'."\n";
		$kod.='<dt><font color="#333366">.</font>'.$src_user1.'</dt>'."\n"; //affichage de l'année
		$kod.='<dd><a href="index.php?pid=2&amp;id_images='.$src_pid.'&amp;theme_pr2='.$src_aid.'&amp;limite='.$src_limite.'"><img src="cpg2/albums/'.$src_filepath.'thumb_'.$src_filename.'" alt="" /></a></dd>'."\n"; //vignette + lien
		$kod.='<dt class="puce">'.$comment.str_replace("HAZEBROUCK - ","",$src_title).'</dt>'."\n"; //affichage du titre de l'image
		$kod.='</dl>'."\n";
		return $kod;
		return $kod;		
	}

et dans la css...

Bloc de code:
.gen_dl {
	border-color: #000;
	color: #6969A3;
	float: left;
	height: 85px;
	margin-bottom:47px;
	margin-left: 10px;
	margin-right: 10px;
	margin-top: 10px;
	padding: 0px;
	width: 115px;
	text-align: center;
}

.gen_dl img {
	margin-top: 2px;
	margin-bottom:3px;
	border-color: #000;
	border-style: solid;
	border-width: 1px;
	height: 60px;
}
.puce img{
	margin-top: 2px;
	margin-bottom:3px;
	border-width: 0px;
	height: 6px;
}
 
Captain_X a dit:
ca change pas l'utilisation de PHP, juste le fait de pas utiliser ces vilains tableaux et une liste à la place...
Si ça change. Avec le tableau, tu es obligé d'élaborer un algo pour caser tes balises de lignes (<tr> et </tr>) au bon endroit.

Avec CSS, ton PHP génère juste la liste des div ou des li, et après tu fais en sorte que le conteneur soit juste assez large pour n'afficher que trois éléments par ligne, ou deux (en réduisant la largeur du conteneur), ou quatre (en l'augmentant), etc.
 
De fait, j'ai pu éviter tous ces calculs de modulo en PHP en mettant tout dans un conteneur bien fixé:

http://www.srinformatique.be/periph2.php (page de test, pas encore en production)

Le CSS:
Bloc de code:
#periph_container {
	width: 400px;
}

.periph_box {
	text-align: center;
	width: 120px;
	height: 120px;
	float: left;
}

.periph_title {
	text-align: center;
	font-size: 1.1em;
	line-height: 2em;
}


Le code:
Bloc de code:
echo '<div id="periph_container">';
			
			WHILE($data = mysql_fetch_array($req))
			{
				
				$code = $data['code'];
				$title = $data['title'];
				$icon = $data['icon'];
				
				echo '<div class="periph_box">
				<span class="periph_title">
				<a href="view_periph.php?cat=' . $code . '" title="SR Informatique - '.$title.'">'.$title.'</a>
				</span><br />
				<a href="view_periph.php?cat=' . $code . '" title="SR Informatique - '.$title.'">
				<img src="cats/'.$icon.'" class="cat_icon" alt="'.$title.'" /></a>
				</div>';
			
			};
			
			echo '</div>';



Il me reste encore quelques trucs à peaufiner, et vérifier ce que ça donne dans Explorer sur PC, mais ça ressemble en tous cas à ce que je voulais faire, merci :D
 
Captain_X a dit:
oui, mais tu peux pas eviter PHP comme tu le dit plus haut
Effectivement, j'ai mal formulé mon propos dans un de mes précédents post. En fait, je voulais dire "tu peux éviter de gérer ça en PHP et utiliser CSS" au lieu de "tu peux éviter PHP et utiliser CSS".

Désolé pour le malentendu.