Actualiser dates sans dates manquantes

Bonjour,

Je bloque sur une fonction, pas facile à expliquer.

J'ai un itinéraire avec une colonne date et une colonne le numero de la journée.

J'ai supprimé des jours entre d'autres et du coup j'ai des dates et numéros manquants.

J'ai un bouton en haut de chacune de ses deux colonnes avec lesquel je souhaite actuialiser la colonne date et numéro, afin de combler ces vide. 

Exemple:
j'ai dans ma colonne numero journée:
1
2
4
5
8
9

et je souhaite après appuyer sur le bouton avoir
1
2
3
4
5
6

J'étais parti sur une solution de boucle avec incrémentation +1 de numéro journée, avec en WHERE la date, mais si j'ai un vide entre deux dates, il me le rajoute dans les numéros journée.

Je recherche donc a incrémenter sans faire référence a l'autre colonne date, et en prenant le prochain numéro de cette mème colonne, mais je ne sais pas l'écrire.

Merci


Windows / Chrome 103.0.0.0

6 réponses

  • Votes
  • Date
  • Date décroissante
  1. Modérateur

    Bonjour

    Pourrais tu nous montrer la structure de ta table 

    Ainsi que quelques données d'exemple avec ces "trous” puis les mêmes données souhaitées (sans trous) 


    1. Bonjour,

      Voici ma table: 'itineraire'
      id / code1 / date / jour / hotel

      et voici un exemple avec des vides:
      id / code1 / date / jour / hotel
      27 / MARTIN / 2022-11-12 / 1 / Bordeaux
      28 / MARTIN / 2022-11-13 / 2 / Bordeaux
      22 / MARTIN / 2022-11-14 / 3 / Bordeaux
      31 / MARTIN / 2022-11-16 / 5 / Bordeaux
      32 / MARTIN / 2022-11-17 / 6 / Bordeaux
      33 / MARTIN / 2022-11-18 / 7 / Bordeaux

      et ce que je souhaite obtenir:
      id / code1 / date / jour / hôtel
      27 / MARTIN / 2022-11-12 / 1 / Bordeaux
      28 / MARTIN / 2022-11-13 / 2 / Bordeaux
      22 / MARTIN / 2022-11-14 / 3 / Bordeaux
      31 / MARTIN / 2022-11-15 / 4 / Bordeaux
      32 / MARTIN / 2022-11-16 / 5 / Bordeaux
      33 / MARTIN / 2022-11-17 / 6 / Bordeaux

      l'id n'est pas nécessairement dans l'ordre chronologique, car je peux avoir supprimé ou rajouté des lignes au milieu de ma suite. Donc pas possible de le prendre en référence pour réaliser la fonction de suite de date ou de jour sans vide..

      Ma seule référence est l'ordre de la colonne date ou jour.

      Merci

      1. Contributeur

        bonjour, peux-tu montrer un exemple plus complet?
        faut-il simplement renuméroter la colonne "jour" dans toute la table, par ordre de "date", en commençant par 1?
        et mettre à jour la colonne "jour", pour avoir chaque fois la date du jour suivant?

      2. Contributeur
        @yg_be

        Je partirais d'une requête qui présente les enregistrements par date.
        Ensuite j'examinerais chaque enregistrement, et, si nécessaire, je le modifierais, avec en WHERE l'id.

      3. Contributeur
        @yg_be

        Donc:

        • select * from itineraire order by date
        • prendre la première date et le premier jour dans le premier enregistrement
        • une boucle pour parcourir tous les enregistrements suivants
        • pour chaque enregistrement, prendre son id, et UPDATE itineraire SET date= ..., jour = ... WHERE id = ...
      4. @yg_be

        Oui c'et exactement ça, numéroter les jours dans l'ordre des dates, en commençant par 1, et sans sauter de numéro mème si ça c'et cas pour les dates. Car justement ensuite, je peux faire une boucle des dates en partant de la premiere avec un +1 day en me basant sur les numéros jours. 

        Ou alors est-il possible aussi de faire de même pour les dates ? en partant de la première, faire un +1 day sans référence aux numéros jour ?

    2. Contributeur

      bonjour,

      peux-tu montrer le code PHP que tu as essayé, il suffit peut-être de légèrement l'adapter.

      1. //////////////////// mise a jour date //////////////////////////////////////////


           $sqldatex = mysqli_query ($connect, "SELECT * FROM itineraires WHERE code1='$itineraire'  AND jour='1' ") or die(mysqli_error());
           $row_sqldatex = mysqli_fetch_assoc($sqldatex);
           
           $date1 = $row_sqldatex['date'];
           $jour = 1;
                      
        if(isset($_POST['maj_date'])) 
                 {
                  
                  while ($jour < 25)
        {
                  $date1=strftime("%Y-%m-%d", strtotime("$date1 +1 day"));
                  $jour = $jour +1;

                  $majdate = "UPDATE itineraires SET date='$date1' WHERE code1='$itineraire' AND  jour='$jour'";
                  
                     // Exécution de la requête
                  $enr=mysqli_query($connect, $majdate);
                  
                     // Contrôle sur la requête
           if(!$enr) {
            die('Erreur SQL !'.$majdate.'<br />'.mysqli_error());
           }
           else {
            echo "";
             
          }
          }
                 }

        //////////////////// mise a jour date //////////////////////////////////////////

        //////////////////// mise a jour jour //////////////////////////////////////////


           $sqljourx = mysqli_query ($connect, "SELECT * FROM itineraires WHERE code1='$itineraire'  AND jour='1' ") or die(mysqli_error());
           $row_sqljourx = mysqli_fetch_assoc($sqljourx);
           
           $date1 = $row_sqljourx['date'];
           $jour = 1;
                      
        if(isset($_POST['maj_jour'])) 
                 {
                  
                  while ($jour < 25)
        {
                  $date1=strftime("%Y-%m-%d", strtotime("$date1 +1 day"));
                  $jour = $jour +1;

                  $majjour = "UPDATE itineraires SET jour='$jour' WHERE code1='$itineraire' AND date='$date1'";
                  
                     // Exécution de la requête
                  $enr=mysqli_query($connect, $majjour);
                  
                     // Contrôle sur la requête
           if(!$enr) {
            die('Erreur SQL !'.$majjour.'<br />'.mysqli_error());
           }
           else {
            echo "";
             
          }
          }
                 }

        1. Contributeur

          Ma suggestion, c'est d'utiliser la requête "select * from itineraire order by date", sans clause WHERE.
          De récupérer la date du premier enregistrement.
          Le cas échéant, de changer le jour du premier enregistrement, en faisant un "UPDATE ...  WHERE id = ...".
          Ensuite, de faire une boucle en faisant à chaque fois mysqli_fetch_assoc pour traiter les enregistrements suivants.
          Pour chacun des enregistrements suivants, faire un "UPDATE ...  WHERE id = ...".

      2. Merci pour vos réponses.

        Mais je coince toujours.

        En fait je voudrais faire une incrémentation depuis une valeur donnée (dans l'exemple 10) avec un update en boucle, sur une colonne.
        Exemple:

            10 => 1
            13 => 2
            17 => 3
            18 => 4
        

        C'est simple avec des mots, mais pas si simple à mettre en place. En tout les cas moi je coince.

        1. Contributeur

          As-tu adapté ton code en fonction de mes suggestions?

        2. @yg_be

          Oui. Mais je n'ai toujours pas le resultat souhaité.

             $sqljourx = mysqli_query ($connect, "SELECT * FROM itineraires WHERE code1='$codeitineraire' AND jour='1' ORDER BY date ASC") or die(mysqli_error());
             $row_sqljourx = mysqli_fetch_assoc($sqljourx);
             
             $ddate = $row_sqljourx['date'];
             $jjour = 0;
          			  
          if(isset($_POST['maj_jour'])) 
                   {
          		  
          		  while ($row = mysqli_fetch_assoc($sqljourx)) 
          {
          		  $ddate=strftime("%Y-%m-%d", strtotime("$ddate +1 day"));
          		  $jjour = $jjour +1;
          
                    $majjour = "UPDATE itineraires SET jour='$jjour' WHERE code1='$codeitineraire' AND version='$version' ORDER BY '$ddate' ASC";
          		  
          		     // Exécution de la requête
                    $enr=mysqli_query($connect, $majjour);
          		  
          		     // Contrôle sur la requête
             if(!$enr) {
              die('Erreur SQL !'.$majjour.'<br />'.mysqli_error());
             }
             else {
          	echo "";
          	 
            }
            }
                   }
      3. Ok j'ai bien noté pour le langage code.
        Je ne peux pas prendre l'id en référence car il n'est pas toujours dans un ordre chronologique.
        J'ai plusieurs itinéraire dans ce tableau, différenciés par le code1.

        Le jour=1, est pour partir du premier jour de l'itinéraire x. Puis rajouter 1 en suivant l'ordre des dates, même si il y a une date qui passe du 15/07 au 17/07.

        Je ne sais pas l'écrire semble t-il et je ne comprends pas comment faire autrement.

        1. Contributeur

          L'ordre chronologique est respecté grâce au "ORDER BY date" de la requête.
          Il est indispensable, ensuite, d'utiliser l'id dans l'UPDATE, sinon on ne met pas à jour le bon enregistrement, respectant l'ordre chronologique.
          Il faut supprimer le "jour=1"  de la requête, sinon cela empêche de traiter tous les enregistrements du même itinéraire.