colonnes dynamiques

Eléphant du PHP | 440 Messages

03 juin 2009, 09:13

Bonjour,

j'essaie de créer un tableau de 2 colonnes et 2 lignes, de façon à avoir sur une page 4 articles.

Voici le code utilisé :
<?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> 
Tel quel ça ne fonctionne pas. Apparemment while ($i < $nb) est de trop. Mais si je l'enlève, j'ai une erreur pour la ligne while ($row=mysql_fetch_assoc($rs))

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

Avatar du membre
ViPHP
ViPHP | 3008 Messages

03 juin 2009, 09:38

En parcourant rapidement ton code, je vois qu'il te manque un "}"

De plus, ça ne serait pas :
while ($row=mysql_fetch_assoc($res))
au lieu de
while ($row=mysql_fetch_assoc($rs))
?

Eléphant du PHP | 440 Messages

03 juin 2009, 10:03

j'ai modifié la ligne while, merci.
Par contre, pour le }, je vois pas où ?? :(

Qu'est-ce que je fais du premier while ? Je laisse ou j'enlève ?
Débutant complet en php/mysql. Merci pour votre aide.

Avatar du membre
ViPHP
ViPHP | 3008 Messages

03 juin 2009, 11:12

<?php
$req = "SELECT * FROM ta_table LIMIT 0,4";
   
  //--- Résultat ---//
  $res = mysql_query($req);
  //met les données dans un tableau
  while($data = mysql_fetch_assoc($res))
  {
  $tablo[]=$data;
  }
  //détermine le nombre de colonnes
  $nbcol=2;

  echo '<table>';
  $nb=count($tablo);
  for($i=0;$i<$nb;$i++){
   
  //les valeurs à afficher
  $valeur1=$tablo[$i]['champ1'];
  $valeur2=$tablo[$i]['champ2'];

  if($i%$nbcol==0)
  echo '<tr>';
  echo '<td>',$valeur1,'<br/>',$valeur2,'</td>';

  if($i%$nbcol==($nbcol-1))
  echo '</tr>';

  }
  echo '</table>';

?>
Ce code t'affiche les résultats sur 2 colonnes. J'ai mis un LIMIT pour que ça n'affiche que 4 comme tu veux. Tu devras donc faire un affichage page par page pour voir le reste (une petite recherche sur google).

ViPHP
AB
ViPHP | 5818 Messages

03 juin 2009, 13:19

Pour l'affichage page par page qu'il te reste à faire, y a un tuto dans phpdebutant :wink:

Eléphant du PHP | 440 Messages

03 juin 2009, 14:22

Merci à Charabia pour ce code qui fonctionne très bien. Comment je fais pour la mise en forme ?

Sur cette ligne : echo '<td align="center">',$valeur1,'<br/>',$valeur2,'<br/>',$valeur3,'<br/>',$valeur4,'<br/>',$valeur5,'<br/>',$valeur6,'</td>';

je voudrais indiquer une police, une taille ; sur $valeur4, un lien. Ce que j'ai essayé ne va pas.
Comment concaténer $valeur2 et $valeur3 : $valeur2.$valeur3 ??
Débutant complet en php/mysql. Merci pour votre aide.

Avatar du membre
ViPHP
ViPHP | 3008 Messages

03 juin 2009, 14:26

Pour concaténer, tu peux utiliser les "," comme dans l'exemple ou des points. Ensuite tu intègres le HTML. Par exemple
echo '<td class="centrage"><span class="style1">'.$valeur1.'</span><br/>'.$valeur2;
Il faut que tu passes par les CSS et que tu laisses de côté les font qui ne sont plus utilisées.

Eléphant du PHP | 440 Messages

03 juin 2009, 14:58

ok, ça avance, merci.

Code : Tout sélectionner

'<img src=http://"$valeur3" border="0" width="220">'
affiche un carré blanc avec croix rouge, mais pas l'image.
$valeur3 affiche l'adresse de l'image www.etc... qui est correcte

Qu'est-ce qui cloche ?
Débutant complet en php/mysql. Merci pour votre aide.

Avatar du membre
ViPHP
ViPHP | 3008 Messages

03 juin 2009, 15:01

C'est normal tu ne concatènes pas. Regarde bien le code que j'ai mis au dessus. La concaténation se fait soit par des virgules, soit par des points. Je n'en vois nulle part dans ta ligne.

Met ton code autour des balises PHP, tu verras de suite une différence de couleur qui devrait t'interpeler.

Eléphant du PHP | 440 Messages

03 juin 2009, 15:14

Code : Tout sélectionner

echo '<td align="center"><font face="Verdana, Arial, Helvetica, sans-serif" size="2" >','<b>',$valeur1,'</b>','<br/>',$valeur2,'<br/>','<a href=http://"$valeur3" target="_blank">','<img src=http://"$valeur3" border="0" width="220"/>','</a>','<br/>',$valeur4,'<br/>',$valeur5,'<br/>',$valeur6,'</font></td>';
Voilà la ligne complète. Je vois pas ce qui manque !
Débutant complet en php/mysql. Merci pour votre aide.

Avatar du membre
ViPHP
ViPHP | 3008 Messages

03 juin 2009, 15:24

wow wow !
1. Utilise les styles à la place de tous tes fonts, c'est fortement conseillé. Si tu persistes, ton code sera de plus en plus "crade" si on peut dire.
2. Met ton code entre les balises PHP et non code, tu verras ainsi la coloration qui est fort utile.

Je vois bien une concaténation sur toutes les valeurs sauf...la 3.

Comparaison :
Ton code :
echo '<td align="center"><font face="Verdana, Arial, Helvetica, sans-serif" size="2" >','<b>',$valeur1,'</b>','<br/>',$valeur2,'<br/>','<a href=http://"$valeur3" target="_blank">','<img src=http://"$valeur3" border="0" width="220"/>','</a>','<br/>',$valeur4,'<br/>',$valeur5,'<br/>',$valeur6,'</font></td>'; 
mon code :
echo '<td class="centrage"><span class="style1"><strong>'.$valeur1.'</strong><br />'.$valeur2.'<br /><a href="http://'.$valeur3.'"><img src="http://'.$valeur3.'" width="220" height="" alt="" /></a><br />'.$valeur4.'<br />'.$valeur5.'<br />'.$valeur4.'</span></td>';
Vois-tu la couleur au niveau des $valeur3 ?

Le but n'étant pas de recopier sans comprendre le code fourni, mais d'essayer d'adapter ton code avec les nouvelles corrections. J'ai l'impression que tu copies colles et que tu changes juste les valeurs...

Eléphant du PHP | 440 Messages

03 juin 2009, 15:57

Ca fonctionne parfaitement. Super. Merci encore.

Pour le passage en page suivante, en quoi mon code ne va-t-il pas ?
<?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 2</a></font>';
    	} 
          ?>
Débutant complet en php/mysql. Merci pour votre aide.

Avatar du membre
ViPHP
ViPHP | 3008 Messages

03 juin 2009, 15:59

Ton code dit simplement si le nombre d'enregistrement dépasse 4, j'affiche un lien page 2. Que fais-tu des pages 3, 4, 5,...Etc si tu as beaucoup d'enregistrements ?

Base toi sur le lien que t'a donné AB pour faire ça.

Eléphant du PHP | 440 Messages

03 juin 2009, 16:18

ok, ça a l'air plus clair que ce que j'avais vu par ailleurs.

j'ai une erreur au niveau de cette ligne :
SELECT * FROM baskets ORDER BY id ASC limit 4,4
Je ne suis pas sûr de comprendre ce que je dois mettre après limit. Le principe étant qu'une nouvelle page se crée tous les 4 enregistrements.
Débutant complet en php/mysql. Merci pour votre aide.

Avatar du membre
ViPHP
ViPHP | 3008 Messages

03 juin 2009, 16:21

La clause LIMIT :

La clause LIMIT permet de ne pas retourner tous les enregistrements d'une table. Par exemple si vous souhaitez afficher les 10 premières news de votre site, voici un exemple de requête :

mysql_query('SELECT titre,date FROM news LIMIT 0,10');

Dans la clause LIMIT, le premier nombre (ici 0) représente l'enregistrement de départ à afficher, et le deuxième nombre (ici 10), le nombre d'enregistrements à retourner.
+ http://www.phpdebutant.org/article84.php