8768 sujets

Développement web côté serveur, CMS

Bonjour, voilà j'ai une page ou je dois afficher les données d'une table de ma base de données sous forme de tableau, j'ai plusieurs champs avec le même nom mais un nom de formation different et je voudrais regroupé en une colonne les lignes avec le même nom. Merci.

voilà mon code :
<?php include("script/bdd.php"); ?>
<!doctype html>
<html>
<head>
<meta charset="utf-8">
<title>Document sans titre</title>
</head>

<body>

<?php 
$requete= $bdd->query( 'SELECT * FROM archive ORDER BY nom ASC ' ); ?>
<table width="80%" border="1">
  <tr>
    <td> Nom </td>
    <td>Prenom</td>
    <td>formation</td>
    <td>Note</td>  
  </tr>
<?php  while($donnees=$requete->fetch()) {      //print_r($nuple);?>
<tr> 
 <td> <?php echo($donnees['nom']); ?>    </td>
  <td> <?php echo ($donnees['prenom']);?> </td>
<td> <?php echo($donnees['nom_formation']); ?>    </td>
<td> <?php echo ($donnees['note']);?> </td>
 </tr>

<?php } ?>
</table>

</body>
</html>
Alors quelle est clairement la question ?
Tu ne chercherais pas "group_concat()" ? Ce n'est pas très évident de comprendre ce que tu veux faire.
Voilà une capture :

upload/58632-Capture.PNG

Je voudrais grouper les lignes des colones nom et prénom identique et laisser les lignes de formation comme tel.
Modifié par vegapunk (02 Jun 2015 - 22:09)
Je ne saurais pas faire dans ton contexte PHP, mais je pense que dans le principe tu vas devoir tester la valeur nom pour la comparer avec les précédentes valeurs nom déjà sorties, et en cas d'égalité appliquer un attribut HTML rowspan pour faire fusionner verticalement des cellules de tableaux.

Le résultat HTML devra être de la forme suivante :
<tr>
  <td rowspan="2">Nom</td>
  <td rowspan="2">Prénom</td>
  <td>Formation 1</td>
  <td>Note 1</td>
</tr>
<tr>
  <td>Formation 2</td>
  <td>Note 2</td>
</tr>


D’ailleurs si tu pouvais soigner la sémantique dans ton tableau, c’est extrêmement important à la fois pour les navigateurs et les moteurs de recherche, mais aussi et surtout pour les utilisateurs. Ça devrait ressembler à ça, à l’intérieur du <table> :

<thead>
  <tr>
    <th>Nom</th>
    <td>Prénom</th>
    <th>Formation</th>
    <th>Note</th>
  </tr>
</thead>
<tbody>
  <tr>
    <td rowspan="2">Nom</td>
    <td rowspan="2">Prénom</td>
    <td>Formation 1</td>
    <td>Note 1</td>
  </tr>
  <tr>
    <td>Formation 2</td>
    <td>Note 2</td>
  </tr>
</tbody>
en fait pour être précis, tu vas devoir refaire ton tableau php pour faire facilement ce dont tu as besoin. A vue de nez il va devoir ressembler à ça :

$array=array(
[0]=>
    ['prenom']=>'Paul',
    ['nom']=>'Valery',
    ['Formation']=>array(
          [0]=>'Français',
          [1]=>'PHP'),
    ['Note']=>array(
          [0]=>12,
          [1]=>15),
[1]=>
    ['prenom']=>'Paul',
    ['nom']=>'Valery',
    ['Formation']=>array(
          [0]=>'Français',
          [1]=>'Anglais',
          [2]=>'Javascript'),
    ['Note']=>array(
          [0]=>10,
          [1]=>8,
          [2]=>19)
);


Pour faire ça :
-> ta requête doit être triée par ce que tu veux (nom + prénom; ou ID -ça serait idéal-)
-> tu parcours le tableau et tu compares tes champs de tri à leur valeur précédente, si ce sont les même, tu n'ajoutes que formation et note, en gros

$i=0;$nom_prec='';$prenom_prec='';
while
{
        if($nom_prec!=$donnees['nom']||$prenom_prec!=$donnees['prenom'])
        {
              $i++;
              $array[$i]['nom']=$donnees['nom']; //idem avec le prénom et avec tout ce qui est commun
              $nom_prec=$donnees['nom']; //tu changes le flag 1
              $prenom_prec=$donnees['prenom']; //tu changes le 2ème flag
        }
        $array[$i]['formation'][]=$donnees['formation']; //idem avec toutes les données que tu peux avoir en plusieurs fois
}


- une fois que tu as ce tableau, tu construis celui en html, à l'aide de foreach et de count, un truc du genre :
<table width="80%" border="1">
<thead>
  <tr>
    <th>Nom</th>
    <th>Prénom</th>
    <th>Formation</th>
    <th>Note</th>
  </tr>
</thead>
<tbody>
<?php foreach($array as $i=>$champs): 
      if(count($champs['formation'])>1){$row=' rowspan="count($champs['formation'])" '}else{$row='';} ?>
<tr>
    <td<?php echo $row;?>><?php echo $champs['nom'];?></td>
    <td<?php echo $row;?>><?php echo $champs['prenom'];?></td>
    <td><?php echo $champs['formation'][0] ?></td>
    <td><?php echo $champs['note'][0]; ?></td>
</tr>
     <?php if(count($champs['formation']>1): for($j=1;$j<count($champs['formation']);$j++):>
<tr>
     <td><?php echo $champs['formation'][$j] ?></td>
     <td><?php echo $champs['note'][$j]; ?></td>
</tr>
     <?php endfor;endif; ?>
<?php endforeach; ?>
</tbody>
</table>