Mise en forme

Eléphant du PHP | 440 Messages

31 mai 2009, 00:07

Bonjour,

j'ai besoin de mettre en forme l'affichage d'articles sur un site d'e-commerce.
Voici le code qui m'affiche les articles :
<?php 
    $table = "baskets"; 
	$sql = "SELECT * FROM " . $table. " where validation=1 "; 
    $res = mysql_query($sql); 
		$nb = mysql_num_rows($res);
    $i = 0; 
	   while ($i < $nb)
	   { 
	   echo '<font face="Verdana, Arial, Helvetica, sans-serif" size="2"><b>'.mysql_result($res, $i, "nom").'</b></font><br />';
	   echo '<font face="Verdana, Arial, Helvetica, sans-serif" size="2" > '.mysql_result($res, $i, "presentation").'</font><br />';
	echo '<font face="Verdana, Arial, Helvetica, sans-serif" size="2"><a href="http://'.mysql_result($res, $i, "photo").'" target="_blank"><img src="http://'.mysql_result($res, $i, "photo").'" border="0" width="220"/></a></font><br />';
		echo '<font face="Verdana, Arial, Helvetica, sans-serif" size="2" >'.mysql_result($res, $i, "prix").'</font><br />';
				echo '<font face="Verdana, Arial, Helvetica, sans-serif" size="2" >'.mysql_result($res, $i, "suite").'</font><br />';

				echo '<font face="Verdana, Arial, Helvetica, sans-serif" size="2" >'.mysql_result($res, $i, "paypal").'</font><br />';

	 $i++; 
    } 
          ?>
Les articles s'affichent l'un en dessous de l'autre. Comment afficher 2 articles côte à côte ?

Comment faire pour que la page ne soit pas trop longue ? Est-il possible qu'il se crée une nouvelle page tous les 4 articles par page par exemple ?

Merci pour votre aide.
Débutant complet en php/mysql. Merci pour votre aide.

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

31 mai 2009, 09:23

Pour afficher tes articles côte à côte, tu peux les mettre dans un conteneur (type div) dont tu spécifieras en css que la largeur est de 50% (pour en avoir 2 sur une même ligne), et que l'alignement se fait à gauche du texte (float:left)

L'inconvénient, c'est que si tes articles n'ont pas tous la même hauteur, ça peut faire des trucs assez vilain... Une autre solution peut être d'utiliser un tableau dont c'est quand même le boulot d'afficher des données en colonnes ;) (Pour ça tu peux utiliser le tuto sur les colonnes dynamiques dans la faq)

Enfin, pour faire une nouvelle page tous les 4 articles, il suffit d'utiliser l'attribut LIMIT dans ta requête pour ne présenter que 4 articles à la fois. Dès lors il ne te restera plus qu'à gérer le système de pagination pour spécifier à partir de quel article commencer chaque page (le premier, le cinquième, le neuvième, etc.). Voir la FAQ pour Afficher des éléments page par page
Ce n'est pas en améliorant la bougie que l'on a inventé l'ampoule...

Eléphant du PHP | 440 Messages

31 mai 2009, 11:49

merci pour les tutos. J'ai fais un premier essai avec les colonnes dynamiques. Le code ne fonctionne pas, je ne comprends pas où ça cloche.
<?php  
$nbCols = 2; // nombre de colonnes du tableau  
$cpt = 0; // compteur d'éléments  
?> 

<table>  
  <tr> 
    <th style="width:<?php echo round(100/$nbCols);?>%;"></th>  
    <th style="width:<?php echo round(100/$nbCols);?>%;"></th>  
  </tr> 
            <?php 
    $table = "baskets"; 
	$sql = "SELECT * FROM " . $table. " where validation=1 "; 
    $res = mysql_query($sql); 
		$nb = mysql_num_rows($res);
    $i = 0; 
	   while ($i < $nb)
	   { 
while ($row=mysql_fetch_assoc($rs)) { // parcours des résultats  

    // début d'une ligne  
    if ($cpt%$nbCols==0) // on divise le nb d'élément par le nb de colonnes. Si le reste est de 0 ...  
        echo '<tr>'; // ..., alors on est sur le premier élément d'une ligne  


    // On place chaque élément dans une cellule du tableau  
    echo '<td>'; 
    echo '<font face="Verdana, Arial, Helvetica, sans-serif" size="2"><b>'.mysql_result($res, $i, "nom").'</b></font><br />';
	   echo '<font face="Verdana, Arial, Helvetica, sans-serif" size="2" > '.mysql_result($res, $i, "presentation").'</font><br />';
	echo '<a href="http://'.mysql_result($res, $i, "photo").'" target="_blank"><img src="http://'.mysql_result($res, $i, "photo").'" border="0" width="220"/></a><br />';
		echo '<font face="Verdana, Arial, Helvetica, sans-serif" size="2" >'.mysql_result($res, $i, "prix").'</font><br />';
				echo '<font face="Verdana, Arial, Helvetica, sans-serif" size="2" >'.mysql_result($res, $i, "suite").'</font><br />';

				echo '<font face="Verdana, Arial, Helvetica, sans-serif" size="2" >'.mysql_result($res, $i, "paypal").'</font><br />';
 // affichage de tout ce qu'on veut dans la cellule  
    echo '</td>';  


    // fin d'une ligne 
    if ($cpt%$nbCols==($nbCols-1)) // on divise le nb d'élément par le nb de colonnes. Si le reste est de ($nbCols-1) ...  
        echo '</tr>'; // ..., on est sur le dernier élément d'une ligne 

    $cpt++; // on incrémente le compteur pour savoir où on en est 
}  

// Au cas où ... 
if ($cpt!=0 && $cpt%$nbCols!=0) { // S'il n'y a pas eu assez de cellules dans la boucle pour finir la ligne ... 
    echo '<td colspan="'.($nbCols - ($cpt%$nbCols) ).'">&nbsp;</td>'; // ... on complète avec une cellule vide de la bonne taille... 
    echo '</tr>'; // ... et on ferme la ligne 
	 $i++; 
    } 
          ?></table>
Merci encore pour l'aide.
Débutant complet en php/mysql. Merci pour votre aide.

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

31 mai 2009, 17:00

Si tu utilises une boucles de type while ($i < $nb) et la fonction mysql_result() pour récupérer les résultats, alors tu ne dois pas utiliser le while ($row=mysql_fetch_assoc($rs)) pour le parcours des résultats ... ça fait doublon et doit provoquer des résultats innattendus :)
Ce n'est pas en améliorant la bougie que l'on a inventé l'ampoule...

Eléphant du PHP | 440 Messages

31 mai 2009, 23:39

j'ai retiré le while ($row=mysql_fetch_assoc($rs)), mais ça ne marche pas mieux.

Par contre, j'ai résolu en partie mes problèmes en créant un tableau html et en y insérant des conditions php :
<?php 
    $table = "baskets"; 
	   if ($table.validation==0)
	   {
				echo '<table><tr><td colspan=2><div align="center"></div></td></tr></table>';
    } 
          ?>
pour demander une fusion de cellules si un article n'est pas publié. Mais tel quel ce code ne fonctionne pas.
<?php 
    $table = "baskets"; 
	$sql = "SELECT * FROM " . $table. " where id=1 and validation=1 "; 
    $res = mysql_query($sql); 
	$nb = mysql_num_rows($res);
	    $i = 0; 
	   while ($i < $nb)
	{
    echo '<font face="Verdana, Arial, Helvetica, sans-serif" size="2"><b>'.mysql_result($res, $i, "nom").'</b></font><br />';
	   echo '<font face="Verdana, Arial, Helvetica, sans-serif" size="2" > '.mysql_result($res, $i, "presentation").'</font><br />';
	echo '<a href="http://'.mysql_result($res, $i, "photo").'" target="_blank"><img src="http://'.mysql_result($res, $i, "photo").'" border="0" width="220"/></a><br />';
		echo '<font face="Verdana, Arial, Helvetica, sans-serif" size="2" >'.mysql_result($res, $i, "suite").'.'. '</font>';
				echo '<font face="Verdana, Arial, Helvetica, sans-serif" size="2" >'.mysql_result($res, $i, "prix").'</font><br />';
	 $i++; 
    } 
          ?>
pour afficher l'article.
<?php 
    $table = "baskets"; 
    $nb = mysql_num_rows(mysql_query("SELECT id FROM $table"));
	   if ($nb> 4)
	   {
				echo '<font face="Verdana, Arial, Helvetica, sans-serif" size="2" ><a href="baskets2.php">page suivante</a></font>';
    } 
          ?>
pour passer au besoin en page suivante, la page étant limitée à 4 articles.

C'est donc en partie résolu.
Par contre, le premier code ne va pas.
Débutant complet en php/mysql. Merci pour votre aide.