_Bonjour,

voilà mon script :

<?php 
if (isset($_GET'id']) and !empty($_GET'id']) and is_numeric($_GET'id']))
{
    $sQuery = "SELECT COUNT(*) FROM site_progression_cat";
    if ($sRetour = $db->query($sQuery))
    {
        if ($sRetour->fetchColumn() > 0)
        {
            $sQuery = "SELECT site_progression.nom AS sp_nom, site_progression.cat_id, site_progression.difficult, site_progression.progress, site_progression_cat.id, site_progression_cat.nom FROM site_progression, site_progression_cat WHERE site_progression.cat_id = site_progression_cat.id AND site_progression.id = ".$_GET'id'].""; 
            ?><div class="tableau">

                <div class="tr"> 
                    <div class="th tdbord cell1">Modules</div> 
                    <div class="th tdbord cell2">Difficulté</div> 
                    <div class="th tdbord cell3">Progression</div> 
                </div> <?php 
            foreach ($db->query($sQuery) as $sRow)
            { ?>

                    <div class="tr"> 
                        <div class="td tdbord puce1"><?php echo $sRow'nom']; ?></div> 
                        <div class="td tdbord puce2"></div> 
                        <div class="td tdbord puce3"></div> 
                    </div>
                    <div class="tr"> 
                        <div class="td tdbord cell1 scell"><?php echo $sRow'sp_nom']; ?></div> 
                        <div class="td tdbord cell2 difffac"><?php echo calculDiff_progress($sRow'difficult']); ?></div> 
                        <div class="td tdbord cell3 prog100"><?php echo $sRow'progress']; ?>%</div> 
                    </div> 
            <?php } ?></div><?php 
        }
    }
}
?>

Le but de ce script est de lister la progression de mes modules par catégorie.
Mais le seul problème c'est que quand j'ai deux modules à lister dans la même catégorie, elle refait une catégorie...
Une image pour mieux comprendre :

Merci d'avance...
_

2 réponses


Qyy
Réponse acceptée

Bonjour,

J'ai de nombreuses remarques par rapport à votre code :

* remplacer la ligne 2 par :
if(intval($_GET'id']) > 0)
serait largement suffisant,

* il est préférable de présenter les données tabulaires à l'aide de tableaux plutôt que de div.

* il est potentielement préjudiciable d'insérer directement une valeur fournie par l'utilisateur sans traitement dans une requette sql.

Ci-dessous, une approche moins risquée qui devrais vous fournir le résultat escompté.

Cependant, elle à été rédigé à la volé et contiens surement de nombreuses erreurs...
L'idée est là malgré tout.

N'hésitez pas à demander plus de précisions si vous vous n'en sortez pas avec ça.

<?php   
$html = '';
$contenu = '';
if (intval($_REQUEST'id']) > 0)
{
  $requette = "
  SELECT
    IF(ISNULL(c.nom), 'Erreur : pas de catégorie', c.nom) AS cat,
    p.nom,
    p.difficult,
    CONCAT(p.progress, '%')
  FROM
    site_progression p
      LEFT OUTER JOIN site_progression_cat c
        ON c.id = p.id
  WHERE
    p.id = ".intval($_REQUEST'id']);
  $retourRequette = $db->query($requette);

  if ($retourRequette !== false && $retourRequette->rowCount > 0)
  {
    $arrayRequette =
      $retourRequette->fetchAll(PDO::FETCH_ASSOC|PDO::FETCH_GROUP));

    foreach($arrayRequette as $categorie => $lignes)
    {
      $contenu .= nouvelleLigneCategorie($categorie);

      foreach($lignes as $ligne)
      {
        $contenu .= nouvelleLigneDetail(
                      $ligne'nom'],
                      calculDiff_progress($ligne'difficult']),
                      $ligne'progress']
                    );
      }
    }

    $html = nouveauTableau($contenu);
  }
  else
  {
    // pas d'information ou erreur lors de la requette.

    // Enlever ça avant la mise en prod :
    var_dump($retourRequette);
  }
}
else
{
  $html = 'Requette mal formée.';
}
echo $html;
function nouveauTableau($contenu)
{
  $retour = 
  '<table>
    <tr>
      <th scope="col">Modules</tr>
      <th scope="col">>Difficulté</tr>
      <th scope="col">Progression</tr>
    </tr>'
    .$contenu
  .'</table>';

  return $retour;
}
function nouvelleLigneCategorie($categorie)
{
  $retour = '
    <tr>
      <td colspan="3">'.$categorie.'</td>
    </tr>
  ';

  return $retour;
}
function nouvelleLigneDetail($module, $difficulte, $progression)
{
  $retour = '
    <tr>
      <td>'.$module.'</td>
      <td>'.$difficulte.'</td>
      <td>'.$progression.'</td>
    </tr>
  ';

  return $retour;
}
?>

Ce que tu cherche à faire n'est pas faisable comme tu le fait. Tu dois faire la requête est construire un tableau indexé par l'id de la catégorie par exemple et ensuite parcourir ce tableau et former ton tableau en fonction.