IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage PHP Discussion :

Enregistrer des dates récurrentes.


Sujet :

Langage PHP

  1. #1
    Membre à l'essai
    Femme Profil pro
    Ergonome
    Inscrit en
    Août 2014
    Messages
    52
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Ergonome

    Informations forums :
    Inscription : Août 2014
    Messages : 52
    Points : 24
    Points
    24
    Par défaut Enregistrer des dates récurrentes.
    Bonjour,

    J'essaye de faire un truc assez simple qui consiste à enregistrer des dates dans ma base de données mysql à partir d'un formulaire. Le formulaire possède donc un champ date_debut, un champ date_fin et un champ date_fin_fin.
    Oui, car on imagine qu'il s'agit d'évènement récurrent. Donc par exemple je choisis du lundi 20 avril (date_debut) au mercredi 22 avril (date_fin) et je mets 07 mai pour la date_fin_fin. Ainsi je veux enregistrer dans ma base chaque lundi au mercredi du 20 avril jusqu'au 7 mai. En gros cela donnerait :
    20-04-2020 / 22-04-2020
    27-04-2020 / 29-04-2020
    04-05-2020 / 06-05-2020

    Pour le moment j'ai fait un code mais il m'enregistre plutôt ceci :

    20-04-2020 / 22-04-2020
    20-04-2020 / 29-04-2020
    20-05-2020 / 06-05-2020
    27-04-2020 / 22-04-2020
    27-04-2020 / 29-04-2020
    27-04-2020 / 06-05-2020
    04-05-2020 / 22-04-2020
    04-05-2020 / 29-04-2020
    04-05-2020 / 06-05-2020

    Voici mon code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
    <?php
     
    	if (isset($_POST['date_debut'],$_POST['date_fin'],$_POST['date_fin_fin']))
    	{
     
    		$date_debut = $_POST['date_debut']; 
    		$date_fin = $_POST['date_fin'];
    		$date_fin_fin = $_POST['date_fin_fin'];
     
    		//on regarde c'est quel jour de la semaine pour date debut et date fin
    		$jourdebut = date("l", strtotime($date_debut));
    		$jourfin = date("l", strtotime($date_fin));
     
    		//on va chercher tous les jours entre date_debut et date_fin_fin qui correspondent aux deux jours de la semaine
     
     
    		$date_debut2 = new DateTime(implode(' ', [$_POST['date_debut'], empty($_POST['time_debut']) ? '12:00' : $_POST['time_debut']]));
     
    		//on définit la date de fin avec un jour de plus pour qu'il inclut la date de fin
    		$date_retour3 = new DateTime(''.$_POST['date_fin_fin'].' +1 day');
    		$date_retour3 = $date_retour3->format('Y-m-d');
     
    		$date_fin_fin2 = new DateTime(implode(' ', [$date_retour3, empty($_POST['time_fin']) ? '12:00' : $_POST['time_fin']]));
     
     
    		//on définit l'intervalle
    		$interval = new DateInterval('P1D');
     
     
    		$periode = new DatePeriod($date_debut2, $interval, $date_fin_fin2) ;
     
    		$tableau = [];
    		$tableau2 = [];
     
    		foreach ($periode as $dateeee) {
    			if ($dateeee->format('l') ==  $jourdebut)
    			{
    				echo '<br />';
    				echo $dateeee->format('d-m-Y'); 
    				echo '<br />';
     
    				$tableau[] = $dateeee->format('Y-m-d'); 
     
     
     
    			}
    			if ($dateeee->format('l') ==  $jourfin)
    			{
    				echo '<br />';
    				echo $dateeee->format('d-m-Y'); 
    				echo '<br />';
    				$tableau2[] = $dateeee->format('Y-m-d'); 
    			}	
     
     
    		}//fin foreach periode as dateeee
     
     
     
    		foreach ($tableau as $lesdebuts)
    		{
    			foreach ($tableau2 as $lesfins)
    			{
    				$stmt = $bdd->prepare('INSERT INTO test_dates (date_debut,date_fin) VALUES(:date_debut,:date_fin)');
    				$stmt->execute(array(':date_debut' => $lesdebuts,':date_fin' => $lesfins));
     
    			}
    		}
     
     
    	} //fin if (isset
    Quelqu'un a une idée ?
    Sinon, je me doute que de faire des évènements récurrents ainsi peut être qu'il y a plus optimale comme manière de procéder que la direction dans laquelle je suis partie ? ou pas ?

    Merci pour vos pistes :-)

  2. #2
    Expert éminent sénior
    Avatar de rawsrc
    Homme Profil pro
    Dev indep
    Inscrit en
    Mars 2004
    Messages
    6 142
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Dev indep

    Informations forums :
    Inscription : Mars 2004
    Messages : 6 142
    Points : 16 545
    Points
    16 545
    Billets dans le blog
    12
    Par défaut
    salut,

    tu dois être beaucoup plus méfiante à l'égard des données en provenance de l'extérieur, tu dois tout vérifier et revérifier. Les données reçues doivent coller parfaitement à ce qui est attendu.
    Tiens, voici comment je l'aurais codé :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    if (isset($_POST['date_debut'], $_POST['date_fin'], $_POST['date_fin_fin'])) {
     
        // on vérifie la validité des dates reçues, si erreur renvoie false
        $debut   = DateTime::createFromFormat('Y-m-d', $_POST['date_debut']);
        $fin     = DateTime::createFromFormat('Y-m-d', $_POST['date_fin']);
        $fin_fin = DateTime::createFromFormat('Y-m-d', $_POST['date_fin_fin']);
     
        // cohérence des données
        if ($debut && $fin && $fin_fin && ($debut < $fin) && ($fin <= $fin_fin)) {
            // préparation du sql
            $stmt = $bdd->prepare('INSERT INTO test_dates (date_debut, date_fin) VALUES (:date_debut, :date_fin)');
            $stmt->bindParam(':date_debut', $sql_debut);
            $stmt->bindParam(':date_fin', $sql_fin);
     
            while ($fin <= $fin_fin) {
                $sql_debut = $debut->format('Y-m-d');
                $sql_fin   = $fin->format('Y-md');
                $stmt->execute();
                $debut->modify('+7 days');
                $fin->modify('+7 days');
            }
        }
    }

  3. #3
    Membre à l'essai
    Femme Profil pro
    Ergonome
    Inscrit en
    Août 2014
    Messages
    52
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Ergonome

    Informations forums :
    Inscription : Août 2014
    Messages : 52
    Points : 24
    Points
    24
    Par défaut
    Merci beaucoup pour ta réponse.
    C'est exactement ça.
    Et merci pour le côté validité des données reçues parce que je vais pouvoir l'appliquer à d'autres endroits de mon code du coup.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 14
    Dernier message: 23/04/2018, 14h37
  2. Pb Enregistrement des date avec Delphi6
    Par Meyer Phil dans le forum Bases de données
    Réponses: 8
    Dernier message: 16/09/2013, 10h52
  3. [AC-2010] Créer des enregistrements par date à partir d'une période
    Par tangono dans le forum Access
    Réponses: 1
    Dernier message: 23/04/2013, 11h46
  4. [MySQL] Problème d'enregistrement des dates
    Par vainuiz dans le forum PHP & Base de données
    Réponses: 5
    Dernier message: 01/12/2011, 21h10
  5. Retourné des enregistrement suivant des dates
    Par seb.49 dans le forum Langage SQL
    Réponses: 4
    Dernier message: 20/07/2006, 15h42

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo