Partage
  • Partager sur Facebook
  • Partager sur Twitter

Organisation table horaire

Besoin de votre avis !

Sujet résolu
    24 mars 2011 à 0:12:51

    Bonjour,

    J'aimerais savoir comment vous feriez pour organisé une table d'horaires.
    Je m'explique :
    Imaginons qu'une personne à un magasin, ce magasins dispose d'un horaire comme suis :
    Lundi 9, 10, 11, 13, 14, 15, (pause gouté :p ), 17, 18, 19
    Mardi fermer
    Mercredi 10, 11, 13, 14, 15, (pause gouté :p ), 17, 18, 19
    Jeudi 0, 1, 2, 3, 4, 5, 22, 23
    Vendredi idem
    Samedi fermer
    Dimanche 9, 10, 11, 13, 14, 15, (pause gouté :p ), 17, 18, 19


    Tout est exprimé en heure 23 = 23h ou 11h du soir ! :)
    Ceci est bien évidemment un exemple ! (les pause ne sont pas a prendre en compte !)

    J'aimerais donc savoir comment vous organiseriez ceci dans un table.
    Pour ma part, j'aurais fait comme ça :
    // Table magasin :
    id | nom_magasin | ...
    
    // Table jours
    id | id_magasin | d1 | d2 | ... | d7*
    
    // Table heure (je sais pas trop justement !)

    * d7 = dimanche et d1 = lundi

    Donc cette structure actuelle permet d'insérer pour un magasin ses jours d'ouverture (je met d1 d2 d3 etc... en ENUM avec 0 ou 1 (faux ou vrai) pour savoir si ouvert ou pas)

    Mais j'aimerais aussi stocké les heures d'ouvertures (qui pourraient changer en fonction des magasins)

    Évidemment je pourrais le faire de manière textuel ... (table heure relié à table jour : 12,13,14,15,20,22 puis je fait un explode)
    Ce que je voudrait c'est pouvoir faire une recherche dans les tables, actuellement je peux recherche un magasin en fonction de son jour d'ouverture (ex : je cherche un magasin ouvert le lundi)
    Mais je voudrais faire pareil pour l'horaire donc recherche un magasin ouvert avant 10h ou après 20h (nigth shop) par exemple !


    Merci d'avance de votre aide !
    • Partager sur Facebook
    • Partager sur Twitter
      24 mars 2011 à 9:05:06

      Avec les contraintes que tu énonces, je ferais simplement deux tables : magasin(m_id, nom, adresse, ..) et trancheHoraire(th_id, m_id, jour, debut, fin).
      • Partager sur Facebook
      • Partager sur Twitter
        24 mars 2011 à 14:38:18

        Pas bête du tout, cependant on pourrait imaginer qu'il y ait une tranche 10, 11, 12 (10 - 12) puis 13 (ouvert juste 1heure) puis ouvert 17, 18, 19 puis 22 ...

        J'ai un script php qui récupère par jour toutes les heures dans un tableau :

        Image utilisateur

        • Partager sur Facebook
        • Partager sur Twitter
          24 mars 2011 à 15:17:21

          Eh bien tu insères autant de lignes que de tranches horaires d'ouvertures : (:idMag, :jour, 10, 12), (:idMag, :jour, 13, 13) (:idMag, :jour, 17, 19) et (:idMag, :jour, 22, ...).
          • Partager sur Facebook
          • Partager sur Twitter
            24 mars 2011 à 15:28:25

            Ouai mais le problème c'est que mon script gère pas la "période" ...

            Genre comment je pourrais faire pour qu'il sache que ça va de 10 à 13 par exemple ? :)

            Merci de ton aide en tout cas ! :)
            • Partager sur Facebook
            • Partager sur Twitter
              24 mars 2011 à 15:54:01

              Il y a sans doute plusieurs façons de faire. La première idée qui me vient c'est de remettre tes données à plat dans un tableaux 2d :jour => array(heure1, heure2, heure3), ce qui se fait très facilement avec une boucle et un array_merge(). Une fois ce tableau sous la main, deux boucles imbriquées de 1 à 7 pour les jours et de 0 à 23 pour les heures pour générer les checkbox sans oublier de vérifier si data[:jour] n'est pas vide pour cocher la checkbox du jour et vérifier avec array_search() si :heure existe dans data[:jour] pour cocher les checkbox des heures.
              • Partager sur Facebook
              • Partager sur Twitter
                24 mars 2011 à 16:36:35

                Ha pardon j'ai mal du me faire comprendre ...
                Je veux dire comment j'enregistre ça en base de donnée pour gardé ton idée de champs 'debut' et 'fin' ?

                Pour info je génère avec Php le tableau que j'ai montré ci dessus comme ceci :
                <?php 
                $jours = jours(); // Tableau contenant les jours en français (1=lundi)
                for($i = 0; $i <= 7; $i++){
                	$checked = (isset($_POST['jour'][$i]) && $_POST['jour'][$i] == 'on')? 'checked="checked"' : '';
                	
                	echo ($i == 0)? '<tr><th>Heures : </th>' : '<tr><td>'.$jours[$i].' <input type="checkbox" '.$checked.' name="jour['.$i.']" /></td>';
                	
                	for($j = 0; $j < 24; $j++){
                		$checked = (isset($_POST['heure'.$i][$j]) && $_POST['heure'.$i][$j] == 'on')? 'checked="checked"' : '';
                		echo ($i == 0)? '<th>'.$j.'</th>' : '<td><input type="checkbox" '.$checked.' name="heure'.$i.'['.$j.']" /></td>';
                	}
                	echo '</tr>';
                }
                
                ?>
                


                Donc quand je reçois mes champs pour l'horaire (la sortie est celle de l'image dans le post + haut) j'ai quelque chose comme ça avec le print_r() :

                [jour] => Array
                (
                        [1] => on
                        [2] => on
                        [5] => on
                        [7] => on
                )
                
                [heure1] => Array
                (
                        [8] => on
                        [9] => on
                        [10] => on
                        [11] => on
                        [12] => on
                        [13] => on
                        [18] => on
                        [19] => on
                        [22] => on
                        [23] => on
                )
                
                [heure2] => Array
                (
                        [6] => on
                        [8] => on
                        [13] => on
                        [15] => on
                )
                
                [heure5] => Array
                (
                        [10] => on
                        [11] => on
                        [12] => on
                        [13] => on
                        [14] => on
                        [17] => on
                )
                
                [heure7] => Array
                (
                        [9] => on
                        [10] => on
                        [11] => on
                        [12] => on
                        [13] => on
                        [14] => on
                        [15] => on
                        [16] => on
                )


                Je sais que à ce stade, c'est plus de la logique Php mais je préfère ne pas créer un nouveau post !

                Encore merci de ton aide ! :)
                • Partager sur Facebook
                • Partager sur Twitter
                  24 mars 2011 à 18:00:27

                  Bin il te suffit de regrouper pour chaque jour les clés qui se suivent en couple (début, fin) pour obtenir toutes les tranches, ensuite il est très facile de construire le VALUES de la requête d'insertion.

                  Ca avait l'air fun alors je l'ai fait, mais c'est mieux si tu le fais par toi-même d'abord, donc je mets en secret.
                  <?php
                  
                  $postData = array(
                      'heure1' => array(
                          8  => 'on',
                          9  => 'on',
                          10 => 'on',
                          11 => 'on',
                          12 => 'on',
                          13 => 'on',
                          18 => 'on',
                          19 => 'on',
                          22 => 'on',
                          23 => 'on'
                      ),
                      'heure2' => array(
                          6  => 'on',
                          8  => 'on',
                          13 => 'on',
                          15 => 'on'
                      ),
                      'heure5' => array(
                          10 => 'on',
                          11 => 'on',
                          12 => 'on',
                          13 => 'on',
                          14 => 'on',
                          17 => 'on'
                      ),
                      'heure7' => array(
                          9  => 'on',
                          10 => 'on',
                          11 => 'on',
                          12 => 'on',
                          13 => 'on',
                          14 => 'on',
                          15 => 'on',
                          16 => 'on'
                      )
                  );
                  
                  echo 'INSERT INTO t_table(mid, jour, debut, fin)
                  VALUES' . buildScheduleQueryValues($postData, 3 /* id du magasin */);
                  
                  function groupSeq(array $tab)
                  {
                      $result = array();
                      
                      reset($tab);
                      $start = key($tab);
                      $prev  = $start - 1;
                      
                      foreach($tab as $key => $val)
                      {
                          if($prev != $key - 1)
                          {
                              $result[] = array($start, $prev);
                              $start = $key;
                          }
                          
                          $prev = $key;
                      }
                      
                      $result[] = array($start, $key);
                      
                      return $result;
                  }
                  
                  function buildScheduleQueryValues(array $data, $mId)
                  {
                      $query = array();
                  
                      foreach($data as $dayNum => $dayVal)
                      {
                          foreach(groupSeq($dayVal) as $period)
                          {
                              $query[] = '(' . (int)$mId . ', ' . (int)$dayNum[5] . ', ' 
                                       . (int)$period[0] . ', ' . (int)$period[1] . ')';
                          }
                      }
                      
                      return implode(',' . PHP_EOL, $query);
                  }
                  

                  INSERT INTO t_table(mid, jour, debut, fin)
                  VALUES(3, 1, 8, 13),
                  (3, 1, 18, 19),
                  (3, 1, 22, 23),
                  (3, 2, 6, 6),
                  (3, 2, 8, 8),
                  (3, 2, 13, 13),
                  (3, 2, 15, 15),
                  (3, 5, 10, 14),
                  (3, 5, 17, 17),
                  (3, 7, 9, 16)
                  • Partager sur Facebook
                  • Partager sur Twitter
                    24 mars 2011 à 20:44:46

                    Merci je vais analysé ça !

                    Moi j'avais pensé faire ça comme suis :

                    id | id_maga | jour | h0 | h1 | h2 | ... | h23

                    ou hx serait en enum 0 ou 1

                    Pense tu que c'est une bonne idée ? :)
                    • Partager sur Facebook
                    • Partager sur Twitter
                      24 mars 2011 à 20:56:21

                      En général, colXX n'est pas une bonne idée. Il est vrai que dans le cas présent, il est peu probable qu'une 25ème heure vienne s'ajouter, mais cette structure compliquerait quand même tes requêtes. Quelle requête utiliserais-tu pour trouver par exemple tous les magasins ouverts entre 9 et 13h ? Ou tous les magasins ouvert avant telle heure ? Tu n'aurais vraisemblablement pas d'autres choix que de tester la valeur d'un nombre non négligeable de colonnes et de faire des AND ou des OR à tout va.
                      Avec la structure que j'ai proposé, ça serait bien plus simple, il suffirait d'un WHERE sur le début ou la fin pour trouver les tranches horaires adéquates et une simple jointure pour avoir les infos sur les magasins dont on a trouvé les tranches horaires.
                      • Partager sur Facebook
                      • Partager sur Twitter
                        24 mars 2011 à 21:02:16

                        Effectivement !
                        Je n'avais pas pensé à ça !

                        Je vais tester ça =)
                        Encore merci ;)
                        • Partager sur Facebook
                        • Partager sur Twitter
                          28 mars 2011 à 22:16:26

                          Pas stocker des intervalles te mettra dans la galère dès que tu auras des besoins de calcul et franchement, pour être très honnête, ton problème ne parle que d'intervalles, toutes modélisation différente aura des inconvenients pénibles (imagine, par exemple, déjà qu'on te demande finalement une borne à 17h30...)

                          Tracker.
                          • Partager sur Facebook
                          • Partager sur Twitter
                            29 mars 2011 à 8:31:27

                            Effectivement !
                            En tout cas j'ai mis tout ça en place pour le moment aucuns problème ne se pose =)

                            Merci encore ! =)
                            • Partager sur Facebook
                            • Partager sur Twitter

                            Organisation table horaire

                            × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                            × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
                            • Editeur
                            • Markdown