fusion de cellules

Eléphanteau du PHP | 16 Messages

12 avr. 2017, 11:39

Bonjour,

j'aurais besoin d'une petite aide afin de savoir comment fusionner des cellules identiques dans mon tableau

ma requete:
<?php
mysql_select_db($database_jo, $jo);
$query_Rs10 = "SELECT * FROM programme, jour, epreuve, competition, sexe WHERE programme.JourID=jour.JourID AND programme.JourID=41 AND programme.JeuxID=63 AND programme.EpreuveID=epreuve.EpreuveID AND epreuve.CompetID=competition.CompetID AND epreuve.SexeID=sexe.SexeID ORDER BY competition.Sport, competition.Disicipline, epreuve.Epreuve";
$Rs10 = mysql_query($query_Rs10, $jo) or die(mysql_error());
$row_Rs10 = mysql_fetch_assoc($Rs10);
$totalRows_Rs10 = mysql_num_rows($Rs10);
mon tableau:
<h3><a href="#">10 févier</a></h3>
        <div>
              <?php do { ?>
                <table>
                  <tr>
                    <td class="jour_sport"><?php echo $row_Rs10['Sport']; ?><br>
                      <?php echo $row_Rs10['Disicipline']; ?></td>
                    <td class="heure"><?php echo $row_Rs10['Heure']; ?></td>
                    <td>
                      <? if ($row_Rs10['Finale']==1) echo "<strong>"."<em>"; ?>
                      <?php echo $row_Rs10['Sexe']; ?>&nbsp; <?php echo $row_Rs10['Epreuve']; ?>&nbsp; <?php echo $row_Rs10['Obs']; ?>
                      <? if ($row_Rs10['Finale']==1) echo "</em>"."</strong>"; ?>
                    </td>
                  </tr>
                </table>
                <?php } while ($row_Rs10 = mysql_fetch_assoc($Rs10)); ?>
            </div>
le résultat actuel fait que sport & disciplines sont répétées plusieurs fois si identique, idem pour les heures

qui saurait m'aider
merci pour votre aide
Modifié en dernier par moogli le 12 avr. 2017, 11:47, modifié 1 fois.
Raison : bbcode

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

12 avr. 2017, 12:28

salut,

Coté html il faut commencer par sortir la déclaration de la table de la boucle while.
en schématisant :
<table>
do {
...
}while();
</table>

pourquoi do / while plutôt que while ?
la différence ici
tu devrais utiliser un while car la tu as des erreurs sur la variable $rw_Rs10 si la requête ne retourne pas de données.
dans le même genre évite les shorts tags

coté SQL : se serait pas mal d'avoir une jointure normalisée parce que la c'est un peu la foire ton prédicat on ne sais pas trop qui fait quoi
c'est quand même plus lisible ainsi :)
SELECT Sport, Disicipline, Heure, Finale, Sexe, Epreuve, Obs 
FROM programme 
 join jour using(JourID)
 join epreuve using(EpreuveID)
 join competition using(CompetID)
 join sexe using(SexeID) 
WHERE  JourID=41 
 AND programme.JeuxID=63 
ORDER BY competition.Sport, competition.Disicipline, epreuve.Epreuve

L'extension mysql est dépréciée depuis pas mal de temps et supprimée de php 7 (dernière version qui a maintenant plus d'un an) ce serait pas mal de migre vers mysqli ou PDO pour préparer l'avenir (comme une mise à jour de php ;) )

Pour ce qui est des données.
soit tu dédoublonnes tes données avant (est-ce qu'un distinct SQL ne ferais pas l'affaire ?) soit tu gères ce que l'on appel une césure.
en claire tu gardes l'état précédent dans une variable (en dehors de la boucle) et tu compares avec l'actuel

Pour faire "bien" il est possible d'utiliser l'attribut rowspan sur ta cellule mais pour cela il faut savoir combien tu as de lignes à afficher à chaque fois (et ne pas afficher la première colonne pour les lignes suivantes).
Pour faire cela le plus simple c'est de gérer un tableau que tu remplis a partir des données de la requête sql tu t'en servira ensuite pour l'affichage.

cela peux donner quelque chose de ce genre
<?php
mysql_select_db($database_jo, $jo);
$query_Rs10 = "SELECT Sport, Disicipline, Heure, Finale, Sexe, Epreuve, Obs 
FROM programme 
 join jour using(JourID)
 join epreuve using(EpreuveID)
 join competition using(CompetID)
 join sexe using(SexeID) 
WHERE  JourID=41 
 AND programme.JeuxID=63 
ORDER BY competition.Sport, competition.Disicipline, epreuve.Epreuve";
$Rs10 = mysql_query($query_Rs10, $jo) or die(mysql_error());
$data = [];
while ($row_Rs10 = mysql_fetch_assoc($Rs10)) {
    $data[strtolower($row_Rs10['Sport'] . $row_Rs10['Disicipline'])][$row_Rs10['Heure']][] = $row_Rs10;
}
mysql_free_result($row_Rs10);
// alors la data est un tableau indexé par sport et discipline qui contient un tableau indéxé par les heures qui va contenir une tableau
// ce tableau correspond aux données pour l'heure dans un sport et une discipline données
?>
<h3><a href="#">10 févier</a></h3>
<div>
    <table>
        <?php
        foreach ($data as $sport) {
            $nbHour = count($sport);
            $firstColumnPrint = false;
            $oldHeure = null;
            foreach ($sport as $heure) {
                $secondColumnPrint = false;
                $nbData = count($heure);
                foreach ($heure as $d) {
                    echo '<tr>';
                    if (!$firstColumnPrint) {
                        echo <<<html
<td class="jour_sport" rowspan="{$nbHour}">{$d['Sport']}<br/>{$d['Disicipline']}</td>
html;
                        $firstColumnPrint = true;
                    }
                    if (!$secondColumnPrint) {
                        echo <<<html
<td class="heure" rowspan="{$nbData}">{$d['Heure']}</td>
html;
                        $firstColumnPrint = true;
                    }
                    echo '<td>';
                    if ($row_Rs10['Finale'] == 1) {
                        echo '<strong><em>';
                    }
                    echo $row_Rs10['Sexe'], '&nbsp;', $row_Rs10['Epreuve'], '&nbsp;', $row_Rs10['Obs'];
                    if ($row_Rs10['Finale'] == 1) {
                        echo '</em></strong>';
                    }
                    echo '</td>';
                }
            }
        }
        ?>
    </table>
</div>

@+
Il en faut peu pour être heureux ......

Eléphanteau du PHP | 16 Messages

12 avr. 2017, 12:48

Bonjour,

cela me donne l'erreur suivante:
Warning: mysql_free_result() expects parameter 1 to be resource, boolean given in /Users/marcbook/Sites/ovh/jeux/2018-2020/mobile/jourh2.php on line 74
la ligne 74 corresponds soit à une parenthèse ou à la balise body selon que l'on est dans sublime ou dans chrome

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

12 avr. 2017, 13:20

c'est cette ligne la mysql_free_result($row_Rs10);
je me suis gouré de variable c'est sur le retour de mysql_query qu'il faut passer en paramètre => mysql_free_result($Rs10);

pour info la doc de mysql_free_result http://php.net/mysql_free_result

il faut comprendre le code avant de le copier ;)

@+
Il en faut peu pour être heureux ......

Eléphanteau du PHP | 16 Messages

12 avr. 2017, 14:29

je pensais avoir compris