Un horaire enregistrer dans une base de données.

a marqué ce sujet comme résolu.

Bonjour,

j'ai un horaire comme celui-ci:

Horaire

J'aimerais qu'il soit dynamique, donc avec php dans une table mysql. Mon idée était de faire:

  • Lundi 8h-9h = A1
  • Lundi 9h-10h = A2
  • Mardi 8h-9h = B1

Structure d'une partie de la bdd

Jusque là, je ne pense pas avoir de problème. Par contre, j'aimerais que si A1 = A2 alors j'aie un rowspan, pareil si A2 = A3 et que cela se poursuive ainsi de suite. Mais je ne sais pas trop comment m'y prendre.

Si vous avez une idée, je suis preneur !

Bonne soirée, WinXaito

Salut !

En gros, ce que tu souhaites faire, c'est une sorte d'agenda, non ?  :p

Si c'est un agenda scolaire, je pense qu'il devrait être possible de gérer cela en termes d'heures, de durées (ou heure de fin) et de jour de semaine, plutôt que de remplir des cases pré-définies et tenter de les fusionner.

+0 -0

Yop,

Je supposes que tu utilises une boucle pour afficher ton planning et que tu as chaque journée dans des tableaux différents. A chaque indice n de ta boucle d'affichage, tu peux faire une boucle de vérification qui vérifie si au rang n+1 c'est encore vrai. Après, il faut faire attention, et ne pas afficher les cellules qui ont fusionnés.

Je te file un bout du code :

1
<td rowspan="<?php for(i=n;A[i]==A[i+1]; i++); echo(i);?>" ><?php echo(A[n]);n=n+i;  ?></td>

Si tu as pas compris ou que j'ai pas été clair, je peux te filer plus de code ;)

+0 -1

Merci de vos réponses, le problème c'est que la je fais ligne par ligne, y a t'il moyen de faire colonne par colonne ? Voici mon code (Pas encore dynamique)

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
<table>
                        <tr>
                            <th></th>
                            <th>Lundi</th>
                            <th>Mardi</th>
                            <th>Mercredi</th>
                            <th>Jeudi</th>
                            <th>Vendredi</th>
                        </tr>
                        <tr>
                            <th>8h-9h</th>
                            <td>Lundi</td>
                            <td>Mardi</td>
                            <td>Mercredi</td>
                            <td>Jeudi</td>
                            <td>Vendredi</td>
                        </tr>
                        <tr>
                            <th>10h-11h</th>
                            <td>Lundi</td>
                            <td>Mardi</td>
                            <td>Mercredi</td>
                            <td>Jeudi</td>
                            <td rowspan="2">Vendredi</td>
                        </tr>
                        <tr>
                            <th>11h-12h</th>
                            <td>Lundi</td>
                            <td>Mardi</td>
                            <td>Mercredi</td>
                            <td>Jeudi</td>
                        </tr>
                        <tr>
                            <th>12h-13h</th>
                            <td>Lundi</td>
                            <td>Mardi</td>
                            <td>Mercredi</td>
                            <td>Jeudi</td>
                            <td>Vendredi</td>
                        </tr>
                        <tr>
                            <th>13h-14h</th>
                            <td>Lundi</td>
                            <td>Mardi</td>
                            <td>Mercredi</td>
                            <td>Jeudi</td>
                            <td>Vendredi</td>
                        </tr>
                        <tr>
                            <th>14h-15h</th>
                            <td>Lundi</td>
                            <td>Mardi</td>
                            <td>Mercredi</td>
                            <td>Jeudi</td>
                            <td>Vendredi</td>
                        </tr>
                        <tr>
                            <th>15h-16h</th>
                            <td>Lundi</td>
                            <td>Mardi</td>
                            <td>Mercredi</td>
                            <td>Jeudi</td>
                            <td>Vendredi</td>
                        </tr>
                        <tr>
                            <th>16h-17h</th>
                            <td>Lundi</td>
                            <td>Mardi</td>
                            <td>Mercredi</td>
                            <td>Jeudi</td>
                            <td>Vendredi</td>
                        </tr>
                    </table>

Oups c'est complètement faux ce que j'ai dis au dessus, ça n'aurais pas pu marcher dans ton cas avec les tableaux HTML.

Si tu as un tableau $tab[heure][jour] ce code devrait marcher :

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
<?php
for($i=0;$i<count($tab);$i++) // Parcours des Lignes
{
    echo("<tr>");
    for($j=0;$j<count($tab[$i]);$j++) //Parcours des cases de la ligne
    {
        if($tab[$i][$j]!=NULL) 
        {
            $n=$i; 
            $rowspan=1;
            while(($n+1<count($tab))&&($tab[$n][$j]===$tab[$n+1][$j])) // Je parcours les cases des heures suivantes pour voir si elles ont la même valeur
            {
                $rowspan++;
                $n++;
            }
            for($n;$n>$i;$n--) // Et je passe ses cases à NULL
            {
                $tab[$n][$j]=NULL;
            }
            echo("<td rowspan= ".$rowspan.">".$tab[$i][$j]."</td>"); // J'affiche la case
        }
    }
    echo('</tr>');
?>

Il y a quelques problèmes pour l'affichage quand tu te retrouves avec une ligne complètement vide, mais tu peux traiter ça avec une boucle/condition au besoin. J'ai pas voulu alourdir encore plus un code qui me parait déjà bien long. Il y a surement une méthode plus courte ;)

+0 -0

Wow, faut que j'essaye un peu de comprendre le code, si je comprend bien, on fait ligne par ligne. Dans ton code pas de problème, je ne comprend juste pas comment tu défini $tab[heure][jour]

je me suis ensuite dit de créer la ligne à l'aide d'une fonction, mais je ne sais pas comment faire pour que ça fonctionne avec le rowspan, je suis un peu confus.

```

Oui ligne par ligne, et case par case c'est ça.

J'avais supposé que c'était déjà fait ;) Que tu utilises du mysql_ , mysqli_ ou de la PDO pour récupérer les données de ta table, avec la fonction fetch ou équivalent, tu devrais te retrouver avec un tableau à une dimension contenant tout tes données classés dans l'ordre de la table. Pour les classés dans un tableau du type $tab[heure][jour] il suffit de faire un boucle de cette façon:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
<?php
$jour=0;
$heure=0;
$nb_heures_max_par_jour=8;
for ($i=0; $i < count($data); $i++) // $data est la variable dans laquelle tu as stocké ton fetch
{ 
    $tab[$heure][$jour]=$data[$i]; // Ici matiere est le nom du champ que tu as donné dans ta BDD qui stocke la matiere
    $heure++; // On passe a l'heure suivante

    if($heure==$nb_heures_max_par_jour) // Si l'heure est égal au nombre d'heures maximums dans une journée
    {
        $heure=0; // L'heure repasse a 0
        $jour++;// On passe au jour suivant
    }
}
?>
+0 -0

Pour la structure SQL si tu peux la modifier, ce n'est pas mieux de fixer l'heure de début et l'heure de fin plutôt que de t’embêter avec "A1", "A2"… ?

Par exemple :

  • Lundi à 00:01:00 = 60
  • Mardi à 12:30:00 = ((24h + 12h) * 60min + 30min) * 60sec = 131400.

Je trouve que ça serait beaucoup plus simple, surtout si tu as besoin de faire :

1
2
3
SELECT *
FROM horaire
WHERE 88200 <= debut AND fin <= 151200

Ça éviterait de faire :

1
2
3
SELECT *
FROM horaire
WHERE periode = "D4" OR periode = "D5" OR periode = "D6" OR periode = "D7" OR periode = "D8"

Bien que dans ce cas IN est pratique.

1
2
/* ... */
WHERE periode IN("D4", "D5", "D6", "D7", "D8")

(La solution avec un champ INT est plus rapide).

+1 -0

@Benj9 si je comprend bien, $data = ceci:

1
2
$req = $bdd->query("SELECT * FROM horaire");
$data = $req->fetch();

@A-312 je ne vois pas vraiment ce que ça changerais avec des int par rapport au code que je viens de mettre ci-dessus (Pour autant que se soit juste et que j'aie bien compris

Et vraiment merci de m'aider les gas, et désoler d'avoir un peu de pêne à assimiler tout ceci

?

J'avais pas vu que tu avais répondu.

Oui mais il faut que tu l'exploites dans une boucle pour pouvoir stocker dans un tableau a 2 dimensions et ensuite utiliser ma méthode.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
<?php
$heure = 0;
$jour = 0;
$nb_max_heure_par_jour = 8;
while($data = $req->fetch())
{
    $tab[$heure][$jour]=$data["NomDuChampDeTaBdd"];
    $heure++; // On passe a l'heure suivante

    if($heure==$nb_heures_max_par_jour) // Si l'heure est égal au nombre d'heures maximums dans une journée
    {
        $heure=0; // L'heure repasse a 0
        $jour++;// On passe au jour suivant
    }

}?>

Si je fais un récapitulatif de ce que tu dois faire (tu le code comme tu veux,mon code est absolument pas le seul code possible):

  • Récupérer les informations de ta base de données
  • Les stocker dans un tableau a 2 dimensions (une matrice)
  • Afficher ce tableau :
    • Tu affiches le tableau ligne par ligne une case après l'autre (si la case est différente de NULL)
    • Pour chaque case affiché tu fais une boucle qui compte le nombre d'heures consécutives de la même matière
    • Tu rajoutes le rowspan correspondant à la case
    • Tu passe les heures consécutives à NULL (histoire de pas les réafficher)
  • Et voilà !
+0 -0

Léger H.S. à suivre :

1
    echo('</tr>');

Benj9

Pitié, pas de parenthèses à echo, require, include ou toute autre instruction : ce ne sont pas des fonctions !

viki53

Effectivement pour echo je n'en utilisait pas, par contre pour include et require je ne le savais pas ! Merci :) (Si ce n'est pas des fonction, ce son quoi ? Et comme un var_dump on doit mettre les paranthèse ?)

Et merci benj9, je regarderai ça demain ou après demain soir.

Connectez-vous pour pouvoir poster un message.
Connexion

Pas encore membre ?

Créez un compte en une minute pour profiter pleinement de toutes les fonctionnalités de Zeste de Savoir. Ici, tout est gratuit et sans publicité.
Créer un compte