Vous ne trouvez pas de réponse à votre problème ? Alors posez la question dans le forum. Souvenez-vous qu'il n'y a jamais de question bête, mais rester dans l'ignorance parce que l'on n'ose pas poser une question, ça c'est une erreur !

AFFICHAGE EN TABLEAU : AFFICHER DES DONNÉES DANS UN TABLEAU


Information sur le tutorial

Catégorie :Tutoriaux Date de création : 26/08/2008 15:24:02 Vu : 9 680 fois

Note :
Aucune note

Commentaire sur cette source (6)
Ajouter un commentaire et/ou une note

Description

Création d'un tableau "à la volée" pour afficher ses données, provenant d'un array() ou d'une base de données.

Affichage "en ligne" ou "en colonne".

Tutorial

Mon tutorial original se trouve ici :
http://www.asp-php.net/tutorial/asp-php/tableaux.php

Tables simples 

Structure d'un tableau (table) :

affiche

<table>
   <tr>
      <td>ligne1 colonne1</td>
      <td>ligne1 colonne2</td>
      <td>ligne1 colonne3</td>
      <td>ligne1 colonne4</td>
   </tr>
   <tr>
      <td>ligne2 colonne1</td>
      <td>ligne2 colonne2</td>
      <td>ligne2 colonne3</td>
      <td>ligne2 colonne4</td>
   </tr>
...
</table>

ligne1 colonne1

ligne1 colonne2

ligne1 colonne3

ligne1 colonne4

ligne2 colonne1

ligne2 colonne2

ligne2 colonne3

ligne2 colonne4

...

 

 

 

a- Tableau de NbrCol colonnes par NbrLigne lignes :

<html><body>
<?php
// $NbrCol : le nombre de colonnes
// $NbrLigne : le nombre de lignes
// -------------------------------------------------------
echo '<table>';
for ($i=1; $i<=$NbrLigne; $i++) {
   echo '<tr>';
   for ($j=1; $j<=$NbrCol; $j++) {
         echo '<td>';
          // ------------------------------------------
          // AFFICHAGE ligne $i, colonne $j
         echo $affichage;
          // ------------------------------------------
         echo '</td>';
   }
   echo '</tr>';
   $j=1;
}
echo '</table>';
?>
</body></html>

b- Table de multiplication : exemple amélioré

i X j

1

2

3

4

5

6

7

8

9

1

1

2

3

4

5

6

7

8

9

2

2

4

6

8

10

12

14

16

18

3

3

6

9

12

15

18

21

24

27

4

4

8

12

16

20

24

28

32

36

5

5

10

15

20

25

30

35

40

45

6

6

12

18

24

30

36

42

48

54

7

7

14

21

28

35

42

49

56

63

8

8

16

24

32

40

48

56

64

72

9

9

18

27

36

45

54

63

72

81

 

<html><body>
<?php
// $NbrCol : le nombre de colonnes
// $NbrLigne : le nombre de lignes
$NbrCol = 9;
$NbrLigne = 9;
// --------------------------------------------------------
// on affiche en plus sur les 1ere ligne et 1ere colonne 
// les valeurs a multiplier (dans des cases en couleur)
// le tableau fera donc 10 x 10
// --------------------------------------------------------
echo '<table border="1" width="400">';
// 1ere ligne (ligne 0)
   echo '<tr>';
   echo '<td bgcolor="#CCCCCC">i X j</td>';
   for ($j=1; $j<=$NbrCol; $j++) {
      echo '<td bgcolor="#FFFF66">'.$j.'</td>';
   }
   echo '</tr>';


// -------------------------------------------------------
// lignes suivantes
for ($i=1; $i<=$NbrLigne; $i++) {
   echo '<tr>';
   for ($j=1; $j<=$NbrCol; $j++) {
       // 1ere colonne (colonne 0)
      if ($j==1) {
         echo '<td bgcolor="#FFFF66">'.$i.'</td>';
      }
       // colonnes suivantes
         if ($i==$j) {
            echo '<td bgcolor="#FFCC66">';
         } else {
            echo '<td>';
         }

       // ------------------------------------------
       // AFFICHAGE ligne $i, colonne $j
      echo $i*$j;
       // ------------------------------------------
      echo '</td>';
   }
   echo '</tr>';
   $j=1;
}
echo '</table>';
?>
</body></html>

Affichage "en ligne" avec array()

Affichage d'un certains nombres de données dans un tableau :
- On veut que le tableau fasse un nombre déterminé de colonnes.
Mais on ne connait pas à l'avance le nombre de données récupérées :
- il faut donc pouvoir afficher (automatiquement) autant de lignes que nécessaire.

Récupération des éléments d'un tableau Array()

A noter : le premier indice d'un array() est 0 (zéro)

a- AVEC calcul du nombre de lignes AVANT affichage

L'exemple ci-dessous affiche :

le code généré :

elt0

elt1

elt2

elt3

elt4

elt5

 

 

<table border="1">
   <tr>
      <td>elt0</td>
      <td>elt1</td>
      <td>elt2</td>
      <td>elt3</td>
   </tr>
   <tr>
      <td>elt4</td>
      <td>elt5</td>
      <td>&nbsp;</td>
      <td>&nbsp;</td>
   </tr>
</table>

 

<html><body>
<?php
// $NbreData : le nombre de données à afficher
// $NbrCol : le nombre de colonnes
// $NbrLigne : calcul automatique AVANT affichage
// -------------------------------------------------------
// (exemple)
$NbrCol = 4;
$tableau = array('elt0','elt1','elt2','elt3','elt4','elt5');
// -------------------------------------------------------
$NbreData = sizeof($tableau);
// -------------------------------------------------------
// calcul du nombre de lignes
if (round($NbreData/$NbrCol)!=($NbreData/$NbrCol)) {
   $NbrLigne = round(($NbreData/$NbrCol)+0.5);
} else {
   $NbrLigne = $NbreData/$NbrCol;
}
// -------------------------------------------------------
// affichage
if ($NbreData != 0) {
$k = 0;
echo '<table border="1">';
for ($i=1; $i<=$NbrLigne; $i++) {
   echo '<tr>';
   for ($j=1; $j<=$NbrCol; $j++) {
      if ($k<$NbreData) {
         echo '<td>';
          // ------------------------------------------
          // AFFICHAGE de l'element
         echo $tableau[$k];
          // ------------------------------------------
         echo '</td>';
         $k++;
      } else {    //  case vide
         echo '<td>&nbsp;</td>';
      }
   }
   echo '<tr>';
   $j=1;
}
echo '</table>';
} else {
echo 'pas de données à afficher';
}
?>
</body></html>

b- SANS calcul du nombre de lignes

C'est une façon différente d'aborder le problème :
- affichage "tant qu'il y a des données ..." (while ...)

- L'astuce : on utilise la propriété "modulo" (Mod en ASP et % en PHP )
qui renvoie le reste de la division entière du 1er chiffre par le 2ème
Exemple :

1 % 4 = 1

2 % 4 = 2

3 % 4 = 3

4 % 4 = 0

5 % 4 = 1

6 % 4 = 2

7 % 4 = 3

8 % 4 = 0

9 % 4 = 1

...

 

 

Donc :
- quand le modulo = 1 : première colonne
- quand le modulo = 0 : dernière colonne

Le nombre de lignes (NbrLigne) est incrémenté au fur et à mesure :
- on le récupère A LA FIN. éventuellement
- ou on l'intercepte en cours de route (pour pagination)

L'exemple ci-dessous affiche :

le code généré :

elt0

elt1

elt2

elt3

elt4

elt5

 

 

<table border="1">
   <tr>
      <td>elt0</td>
      <td>elt1</td>
      <td>elt2</td>
      <td>elt3</td>
   </tr>
   <tr>
      <td>elt4</td>
      <td>elt5</td>
   </tr>
</table>

 

<html><body>
<?php
// $NbreData : le nombre de données à afficher
// $NbrCol : le nombre de colonnes
// $NbrLigne : calcul automatique a la FIN
// -------------------------------------------------------
// (exemple)
$NbrCol = 4;
$tableau = array('elt0','elt1','elt2','elt3','elt4','elt5');
// -------------------------------------------------------
$NbreData = sizeof($tableau);
// -------------------------------------------------------
// affichage
$NbrLigne = 0;
if ($NbreData != 0) {
$k = 0;
$j = 1;
echo '<table border="1">';
while ($k < $NbreData) {
   if ($j%$NbrCol == 1) {
      $NbrLigne++;
      echo "<tr>";
      $fintr = 0;
   }
   echo '<td>';
    // ------------------------------------------
    // AFFICHAGE de l'element
   echo $tableau[$k];
    // ------------------------------------------
   echo '</td>';
   $k++;
   if ($j%$NbrCol == 0) {
      echo "</tr>"; 
      $fintr = 0;
   }
   $j++;
}
if ($fintr!=1) { echo '</tr>'; }
echo '</table>';
} else {
echo 'pas de données à afficher';
}
?>
</body></html>

Affichage "en ligne" avec base de données

Affichage de données récupérées par une requête dans une base de données.
- On veut afficher dans chaque case les données provenant d'un enregistrement
- On veut que le tableau fasse un nombre déterminé de colonnes.
Mais on ne connait pas à l'avance le nombre de données récupérées :
- il faut donc pouvoir afficher (automatiquement) autant de lignes que nécessaire.

Dans la partie "AFFICHAGE des DONNEES de la fiche" : Tout est possible !
- afficher plusieurs données,
- afficher des images,
- les organiser dans un tableau,
- ajouter des liens hypertext,
- ...

Même principe que "b- SANS calcul du nombre de lignes" :

- affichage "tant qu'il y a des données ..." while ...
- L'astuce : on utilise la propriété "modulo"

Exemple
La table MATABLE :

champs

valeurs

NUM

1

2

3

4

5

6

7

8

9

10

DONNEE

banane

betterave

boule

pomme

ananas

baie

bille

citron

bonbon

ballon

TYPE

fruit

legume

jouet

fruit

fruit

fruit

jouet

fruit

douceur

jouet

La requête : toutes les données commençant par un "b", classées par ordre alphabétique.

L'exemple ci-dessous affiche :

le code généré :

baie
fruit

ballon
jouet

banane
fruit

betterave
legume

bille
jouet

bonbon
douceur

boule
jouet

 

<table border="1">
   <tr>
      <td>baie<br><i>fruit</i></td>
      <td>ballon<br><i>jouet</i></td>
      <td>banane<br><i>fruit</i></td>
      <td>betterave<br><i>legume</i></td>
   </tr>
   <tr>
      <td>bille<br><i>jouet</i></td>
      <td>bonbon<br><i>douceur</i></td>
      <td>boule<br><i>jouet</i></td>
   </tr>
</table>

 

<?php  include("_connexion.php") ; ?>
<html><body>
<?php
// $NbreData : le nombre de données à afficher
// $NbrCol : le nombre de colonnes
// $NbrLigne : calcul automatique a la FIN
// -------------------------------------------------------
// (exemple)
$NbrCol = 4;
// requete
$table = 'MATABLE';
$condition = ' WHERE DONNEE LIKE \'b%\' ORDER BY DONNEE ASC';
$query = 'SELECT * FROM '.$table.$condition;
$result = mysql_query($query);

// -------------------------------------------------------
$NbreData = mysql_num_rows($result);
// -------------------------------------------------------
// affichage
$NbrLigne = 0;
if ($NbreData != 0) {
$j = 1;
echo '<table border="1">';
while ($val = mysql_fetch_array($result)) {
   if ($j%$NbrCol == 1) {
      $NbrLigne++;
      echo "<tr>";
      $fintr = 0;
   }
   echo '<td>';
    // ------------------------------------------
    // AFFICHAGE des DONNEES de la fiche
   echo $val['DONNEE'];
   echo '<br>';
   echo '<i>'.$val['TYPE'].'</i>';
    // ------------------------------------------
   echo '</td>';
   if ($j%$NbrCol == 0) {
      echo "</tr>"; 
      $fintr = 1;
   }
   $j++;

}
if ($fintr!=1) { echo '</tr>'; }
echo '</table>';
} else {
echo 'pas de données à afficher';
}
?>
</body></html>
<?php
// deconnexion de la base
mysql_close(); 
?>

Affichage "en Colonne"

Les scripts précédents affichent les données "en ligne".

Affichage des résultats "en colonne" :
- pour un nombre de lignes (NbreLigne) défini,
- il faut pouvoir afficher (automatiquement) autant de colonnes que nécessaire.


a- Solution 1 (la plus simple)
Exemple avec Array() (même principe avec Base de données)

Principe :
- une table d'une ligne (invisible),
- dans chaque cellule : création d'une table d'1 colonne et NbreLigne lignes,
- ajout de cellules supplémentaires "tant qu'on a des données ..."

L'exemple ci-dessous affiche :

le code généré :

elt0

elt1

elt2

elt3

elt4

elt5

elt6

elt7

elt8

elt9

<table><tr>
   <td valign="top">
      <table border="1">
      <tr><td>elt0</td></tr>
      <tr><td>elt1</td></tr>
      <tr><td>elt2</td></tr>
      </table>
   </td>
   <td valign="top">
      <table border="1">
      <tr><td>elt3</td></tr>
      <tr><td>elt4</td></tr>
      <tr><td>elt5</td></tr>
      </table>
   </td>
   <td valign="top">
      <table border="1">
      <tr><td>elt6</td></tr>
      <tr><td>elt7</td></tr>
      <tr><td>elt8</td></tr>
      </table>
   </td>
   <td valign="top">
      <table border="1">
      <tr><td>elt9</td></tr>
      </table>
   </td>
</tr></table>

 

<html><body>
<?php
// $NbreData : le nombre de données à afficher
// $NbrLigne : le nombre de lignes
// $NbrCol : le nombre de colonnes : calcul automatique
// -------------------------------------------------------
// (exemple)
$NbrLigne = 3;
$tableau = array('elt0','elt1','elt2','elt3','elt4','elt5','elt6','elt7','elt8','elt9');
// -------------------------------------------------------
$NbreData = sizeof($tableau);
// -------------------------------------------------------
$NbrCol = 0;
// affichage
if ($NbreData != 0) {
$k = 0;
echo '<table><tr>';
while ($k < $NbreData) {
   echo '<td valign="top">';
   echo '<table border="1">';
   for ($i=1; $i<=$NbrLigne; $i++) {
      if ($k < $NbreData) {
         echo '<tr><td>';
          // --------------------------------------
          // AFFICHAGE de l'element
         echo $tableau[$k];
          // --------------------------------------
         echo '</td></tr>';
         $k++;
      }
      if ($i == $NbrLigne) {
         echo '</table>';
         echo '</td>';
      }
   }
   $NbrCol++;
}
echo '</tr></table>';
} else {
echo 'pas de données à afficher';
}
?>
</body></html>

b- Solution 2, avec Array()

La solution 1 est efficace, mais pas satisfaisante si on souhaite bien aligner toutes les cellules.

Principe :
- une seule table,
- le remplissage se fait ligne par ligne en testant le "modulo" :
Exemple
10 éléments (elt0 à elt9) sur 3 lignes.
On doit les afficher dans cet ordre : (voir le code généré)

ligne 0 :

elt0 - elt3 - elt6 - elt9

0 Mod 3 = 3 Mod 3 = 6 Mod 3 = 9 Mod 3 = 0

ligne 1 :

elt1 - elt4 - elt7

1 Mod 3 = 4 Mod 3 = 7 Mod 3 = ... = 1

ligne 2 :

elt2 - elt5 - elt8

2 Mod 3 = 5 Mod 3 = 8 Mod 3 = ... = 2

 

L'exemple ci-dessous affiche :

le code généré :

elt0

elt3

elt6

elt9

elt1

elt4

elt7

 

elt2

elt5

elt8

 

<table border="1">
   <tr>
      <td>elt0</td>
      <td>elt3</td>
      <td>elt6</td>
      <td>elt9</td>
   </tr>
   <tr>
      <td>elt1</td>
      <td>elt4</td>
      <td>elt7</td>
   </tr>
   <tr>
      <td>elt2</td>
      <td>elt5</td>
      <td>elt8</td>
   </tr>
</table>

 

<html><body>
<?php
// $NbreData : le nombre de données à afficher
// $NbrLigne : le nombre de lignes
// $NbrCol : le nombre de colonnes : calcul automatique
// -------------------------------------------------------
// (exemple)
$NbrLigne = 3;
$tableau = array('elt0','elt1','elt2','elt3','elt4','elt5'
                                               ,'elt6','elt7','elt8','elt9');
// -------------------------------------------------------
$NbreData = sizeof($tableau);
// -------------------------------------------------------
// affichage
if ($NbreData != 0) {
$i = 0;
$NbrCol = 0;
echo '<table border="1">';
   for ($i=0; $i<$NbrLigne; $i++) {
      echo '<tr>';
      $j = 0;
      while (($i+($j*$NbrLigne))%$NbrLigne==$i && ($i+($j*$NbrLigne))<$NbreData) {
         echo '<td>';
          // --------------------------------------
          // AFFICHAGE de l'element
         $k = ($i+($j*$NbrLigne));
         echo $tableau[$k];
          // --------------------------------------
         echo '</td>';
         $j++;
         if ($NbrCol<$j) { $NbrCol=$j; }
      }
      echo '</tr>';
   }
echo '</table>';
} else {
echo 'pas de données à afficher';
}
?>
</body></html>

c- Solution 2, avec base de données

Le script utilisant les indices de tableau :
- création d'un tableau array() contenant les données récupérées.

L'exemple ci-dessous affiche :

le code généré :

baie
fruit

bille
jouet

ballon
jouet

bonbon
douceur

banane
fruit

boule
jouet

betterave
legume

 

<table border="1">
   <tr>
      <td>baie<br><i>fruit</i></td>
      <td>bille<br><i>jouet</i></td>
   </tr>
   <tr>
      <td>ballon<br><i>jouet</i></td>
      <td>bonbon<br><i>douceur</i></td>
   </tr>
   <tr>
      <td>banane<br><i>fruit</i></td>
      <td>boule<br><i>jouet</i></td>
   </tr>
   <tr>
      <td>betterave<br><i>legume</i></td>
   </tr>
</table>

 

<?php  include("_connexion.php") ; ?>
<html><body>
<?php
// $NbreData : le nombre de données à afficher
// $NbrLigne : le nombre de lignes
// $NbrCol : calcul automatique
// -------------------------------------------------------
// (exemple)
$NbrLigne = 4;
// requete
$table = 'MATABLE';
$condition = 
' WHERE DONNEE LIKE \'b%\' ORDER BY DONNEE ASC';
$query = 'SELECT * FROM '.$table.$condition;
$result = mysql_query($query);
// -------------------------------------------------------
$NbreData = mysql_num_rows($result);
// ------------------------------------------------------- 
// creation d'un tableau array() par donnees
$k=0;
while ($val = mysql_fetch_array($result)) {
   $tableau1[$k] = $val['DONNEE'];
   $tableau2[$k] = $val['TYPE'];
   $k++;
}
// -------------------------------------------------------
// affichage
if ($NbreData != 0) {
$i = 0;
$NbrCol = 0;
echo '<table border="1">';
   for ($i=0; $i<$NbrLigne; $i++) {
      echo '<tr>';
      $j = 0;
      while (($i+($j*$NbrLigne))%$NbrLigne==$i && ($i+($j*$NbrLigne))<$NbreData) {
         echo '<td>';
          // --------------------------------------
          // AFFICHAGE de l'element
         $k = ($i+($j*$NbrLigne));
         echo $tableau1[$k];
         echo '<br>';
         echo '<i>'.$tableau2[$k].'</i>';
          // --------------------------------------
         echo '</td>';
         $j++;
         if ($NbrCol<$j) { $NbrCol=$j; }
      }
      echo '</tr>';
   }
echo '</table>';
} else {
echo 'pas de données à afficher';
}
?>
</body></html>
<?php
mysql_close(); 
?>

Astuce :
Au lieu de créer un tableau array() pour chaque donnée récupérée (tableau1, tableau2, ...),
il est possible de créer un seul tableau array() :
- en PHP, c'est très simple et très pratique.

<?php
// ...
// ------------------------------------------------------- 
// creation d'un seul array avec toutes les donnees
$k=0;
while ($val = mysql_fetch_array($result)) {
   $tableau[$k] = $val;
   $k++;
}
// -------------------------------------------------------
// affichage
// ...
          // --------------------------------------
          // AFFICHAGE de l'element
         $k = ($i+($j*$NbrLigne));
         echo $tableau[$k]['DONNEE'];
         echo '<br>';
         echo '<i>'.$tableau[$k]['TYPE'].'</i>';
          // --------------------------------------
// ...
?>

 

26 août 2008 15:29:56 :
mise en page
26 août 2008 15:46:03 :
mise en page bis
26 août 2008 16:01:49 :
mise en page 3 (pas moyen !)
26 août 2008 16:06:02 :
Note aux ADMIN : c'est nul de devoir justifier a chaque fois l'"explication de la modification" AVANT la "prévisualisation" Ce serait bien mieux de le faire APRES : avant de "VALIDER la modification" A bon entendeur ...
26 août 2008 16:10:05 :
mise en page (encore!)
signaler à un administrateur
Commentaire de oumsofiane1 le 11/10/2008 21:13:11

merci pour ce tutorial que je trouve très interessant, je voudrais bien savoir si c'est possible comment avancer dans une base de donnée, avec des boutons suivants, et précédent, pour afficher par exemple tout les éléments d'une BDD à fure à a mesure que l'utilisateur regarde.

signaler à un administrateur
Commentaire de jreaux62 le 21/03/2009 19:19:39

PAGINATION
(affichage sur plusieurs pages)

Plusieurs tutos ici :
http://www.phpcs.com/r/global.aspx?r=Pagination+php

Autre sources :
- Pagination
http://www.asp-php.net/tutorial/asp-php/pagination.php
- Comment créer un système de navigation (pagination)
http://php.developpez.com/faq/?page=concepts#concepts-pagination
- Créer un système de pagination automatique en PHP (exemple sur un livre d'or!)
http://antoine-herault.developpez.com/tutoriels/php/pagination-automatique-en-php/

signaler à un administrateur
Commentaire de Firy le 27/03/2009 23:09:12

Merçi de votre aide c'est trés importants

signaler à un administrateur
Commentaire de hippolyte_only le 15/04/2009 14:37:05

je suis une debutante en developpement web et je voudrais que vous m apportiez de laide a ce niveau. svp pouvez vous mapprtez des docs de php et mysql. merci de votre bonne comprehension

signaler à un administrateur
Commentaire de gouri le 15/05/2009 21:46:26

je vous remercie pour ce doc. il m'a ete tres utile  

signaler à un administrateur
Commentaire de Sebounet31 le 01/06/2009 21:20:20

Je te mets 8 parce que le problèmes des boucles imbriquées est incompréhensible pour les débutants comme moi et un peu de démystification fait du bien. Plus les inser dans bdd qui peuvent être bien utiles... ++

Ajouter un commentaire



Nos sponsors

Sondage...

CalendriCode

Juillet 2009
LMMJVSD
  12345
6789101112
13141516171819
20212223242526
2728293031  

Consulter la suite du CalendriCode

Comparez les prix Nouvelle version

Photothèque Nouveau !



Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés
Temps d'éxécution de la page : 0,109 sec

Google Coop CodeS-SourceS Google Coop CodeS-SourceS


Certaines images présentes sur le site (notament certains avatars) sont issues des collections IconShock, donc si vous souhaitez utiliser ces icons vous devez les acheter, ne les copiez pas et ne utilisez pas dans vos sites et applications sans les avoir commandé.