Bug dans l'astuce Affichage sur plusieurs colonnes ?

Répondre
Rolland
le 04/04/2005 à 17:16
Rolland
Bonjour,

Si je suis le script du site avec par exemple 2 colonnes et 2 images j'obtiens :
<table>
<tr>
<td width="50%"><img src="img_1.gif" alt="1"></td>
<td width="50%"><img src="img_2.gif" alt="2"></td>
</tr>
</table>

Parfait ! J'ai mes deux colonnes et un code correct.

Mais avec 2 colonnes et 3 images j'obtiens :
<table>
<tr>
<td width="50%"><img src="img_1.gif" alt="1"></td>
<td width="50%"><img src="img_2.gif" alt="2"></td>
</tr>
<tr>
<td width="50%"><img src="img_3.gif" alt="3"></td>
</table>

J'ai bien mes 2 colonnes et deux lignes mais il manque comme qque chose au niveau du code...
Le gars PHP ne me place pas le </tr> puisque la condition n'est pas remplie.
Donc si j'ai un nbre d'images pair tt est OK. Un nbre impair et m'sieur W3C me dit que c pas bien et qu'il veut plus valider.
J'ai tenté plusieurs changements mais sans succès. Qqu'un de + doué aurait-il la solut.
Merci.
Encore bravo à l'équipe du site !
3SI - Sea, Sex, Sun and Internet
LA GLOBULE
le 04/04/2005 à 17:32
LA GLOBULE
Oui mettre un colspan="2" sur le dernier affichage quand tu as un nombre impair d'élément à placer.

Utilise l'opérateur modulo : %.
Rolland
le 04/04/2005 à 17:59
Rolland
Pfiiiiooooouuu ! Quelle rapidité ! Tu vas bien arriver à rattrapper BipBip à cette allure :)

Bon un colspan je vois bien c du html. Le modulo, je crois savoir : pair if ($nombre % 2 == 0) ou impair if ($nombre % 1 == 0). Mais après j'sais plus. Comment j'explique çà au serveur ? Et si j'ai 3 colonnes (ce qui en plus est le cas) ?

Ah ces débutants alors...
3SI - Sea, Sex, Sun and Internet
LA GLOBULE
le 04/04/2005 à 18:34
LA GLOBULE
Ben si tu as 3 colonnes, le probleme ne se pose que dans le cas ou $nombre % 3 vaut 1 ou 2.
Auquel cas, faut faire un colspan="2" ou colspan="3".
Rolland
le 05/04/2005 à 16:52
Rolland
Salut,

Aprés pas mal de recherches, toujours pas réussi à placer correctement le colspan. J'ai donc adopté une méthode inspirée de ta réponse qui va certainement te faire marrer ou bondir (selon l'humeur) mais qui semble bien fonctionner.
<?php
//on scanne
while($data = mysql_fetch_assoc($rsPart)) {
// on stocke nos donn&eacute;es
$tablo[]=$data;
}
//pour ne pas que <table></table> s'affiche si tablo est vide
if(!count($tablo)==0) {
$nbcol=3; //---on d&eacute;termine le nombre de colonnes de l'affichage
echo '<table width="100%" border="0" cellspacing="0" cellpadding="0">';
//Pour le nombre de tuples trouvé
for($i=0;$i<count($tablo);$i++){
if($i%$nbcol==0)
echo '<tr>';
echo '<td><img src="../images/'.$tablo1[$i]['img'].'alt="img" /></td>';
//si la colonne est la dernière de la ligne
if($i%$nbcol==($nbcol-1))
//on ferme cette ligne
echo '</tr>';
}
//si 1 seule colonne dans la ligne
if($i%$nbcol==1) {
//on ajoute deux colonnes
echo '<td>&nbsp;</td><td>&nbsp;</td>';
//on ferme la ligne
echo '</tr>';
}
//si 2 colonnes dans la ligne
if($i%$nbcol==2) {
//on ajoute une troisième colonne
echo '<td>&nbsp;</td>';
//on ferme la ligne
echo '</tr>';
}
echo '</table>';
}
?>

Voilà, voilà.

Merci encore pour ta disponiobilité.

Bye
3SI - Sea, Sex, Sun and Internet
bibi
le 05/04/2005 à 20:18
bibi
je comprend pas bien l'utilité de ca :

$tablo[]=$data;

tu marques comme commentaire : on stock nos données.
2 remarques. 1erement, tu peux tres bien utiliser $data[...] au lieu de $tablo[...] comme tu le fais, php a été conçu pour cela et c'est tant mieux. 2eme remarque maintenant, si tu fais cela, a la sortie de ta boucle, tu auras un tableau $tablo[] qui contiendra, a chaque index, un tableau correspondant a une ligne retournée par ta requete, enfin je pense que ca fera ca donc c'est mal :)

voila a+ :)
commit suicide
bibi
le 05/04/2005 à 20:19
bibi
enleve la 2eme remarque j'avais pas bien lu ton code . Mais la premiere fonction toujours . Prkoi faire une while et une for quand on peut tout mettre dans la premiere while ? :)
commit suicide
Rolland
le 06/04/2005 à 00:49
Rolland
Salut Bibi,

Bah pour $tablo[]=$data j'ai trouvé ça ds les astuces du site : affichage sur plusieurs colonnes, et comme j'avais besoin de compter autrement qu'avec mysql_num_rows(), le count($tablo) me semblait parfait et j'en ai déduit qu'il fallait un tablo pour stocker les données et pouvoir les compter. Mes connaissances en PHP ne m'ont même pas permis d'oser me poser la question.
Jusque là j'utilisais ce script (mon premier qui a fonctionné d'ailleurs...)
<?php
echo '<table width="100%" border="0" cellspacing="0" cellpadding="0">';
//on détermine le nombre de colonnes
$nbcol=3;
//on se positionne en début de ligne
$col=1;
//on scanne
while($data = mysql_fetch_assoc($rsLiens)) {
//si on est à la première colonne
if ($col==1) {
//on ouvre la ligne
echo '<tr>';
}
//on affiche les cellules
echo '<td>'.$data['nom'].'</td>';
//on passe à la colonne suivante
$col=$col+1;
//si on va dépasser le nombre de colonnes
If ($col>$nbcol) {
//on ferme la ligne
echo'</tr>';
//on revient à la première colonne
$col=1;

}
}
//autrement
if ($col<>1) {
//pour le nombre de cellules restant pour finir la ligne
for ($i=$col;$i<=$nbcol;$i++) {
//on affiche un espace
echo '<td>&nbsp;</td>';
}
//on ferme la ligne
echo '</tr>';
}
echo '</table>';
?>

Mais là si je n'ai pas de données <table></table> est généré et c ce que je veux éviter.
Donc, si je t'ai bien compris,
while($data = mysql_fetch_assoc($rsLiens))  { 
if(!count($data)==0) {
if($col==1) {
c'est possible !!!
Je teste ça dès demain matin...

Merci pour la patience.
3SI - Sea, Sex, Sun and Internet
Rolland
le 07/04/2005 à 01:13
Rolland
B'soir,
Pour conclure, le code qui fonctionne, complète éventuellement l'astuce du site affichage sur n colonnes et validé W3C :
<?php
//--- une requête
$req = 'select la_table.champ from la_table';
//--- Résultat
$res = mysql_query($req);
//--- total des enregistrements
$total_res = mysql_num_rows($res);
//si il y a des enregistrements (si le total des enregistrements est différent de 0)
if(!$total_res==0) {
//on ouvre notre tableau
echo '<table>';
//on détermine le nombre de colonnes
$nbcol=5;
//on se positionne en début de ligne
$col=1;
//on scanne tous les enregistrements
while($data = mysql_fetch_assoc($res)) {
//si on est à la première colonne
if ($col==1) {
//on ouvre la ligne
echo '<tr>';
}
//on affiche les cellules
echo '<td>'.$data['champ'].'</td>';
//on passe à la colonne suivante
$col=$col+1;
//si on va dépasser le nombre de colonnes
If ($col>$nbcol) {
//on ferme la ligne
echo'</tr>';
//on revient à la première colonne
$col=1;
}
}
//autrement
if ($col<>1) {
//pour le nombre de cellules restant
for ($i=$col;$i<=$nbcol;$i++) {
//on affiche des cellules avec un espace
echo "<td>&nbsp;</td>";
}
//on ferme la ligne
echo "</tr>";
}
echo "</table>";
}
//si il n'y a pas d'enregistrement (total des enregistrements égal à 0)
else {
//on l'affiche
echo '<div align="center">Aucun enregistrement</div>';
}
//on libère la mémoire allouée
mysql_free_result($rsAlbum);
//on ferme la connexion
mysql_close();
?>

Le PHP c géant !!!
Merci pour tout et à la prochaine.
3SI - Sea, Sex, Sun and Internet
Répondre

Ecrire un message

Votre message vient d'être créé avec succès.
LoadingChargement en cours