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 :

Insertion agenda - page de traitement [PHP 5.4]


Sujet :

Langage PHP

  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Août 2011
    Messages
    54
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2011
    Messages : 54
    Points : 36
    Points
    36
    Par défaut Insertion agenda - page de traitement
    Bonjour,

    Cela fait une semaine que je m'arrache les cheveux avec la page de traitement relative à l'insertion de données dans la table de l'agenda (idem pour la page de modification d'ailleurs...).

    Le problème est le suivant : lorsque j'entre une série de date pour le même événement, exemple du 5 janvier au 9 janvier inclus 2016, il enregistre dans la table cinq fois le 5 janvier et non 5, 6, 7, 8, 9.

    Quelqu'un a t-il une idée de ce dysfonctionnement svp ? Je vous propose le code (en abrégé bien sûr, rassurez-vous )

    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
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
     
    <?php
    // Variables vides pour les valeurs par défaut des champs
    $dateDebut = date('d/m/Y', time());
    $dateFin = date('d/m/Y', time());
    $titre='';
    $description='';
     
    // Récupération des paramètres POST
    $dateDebut = $_POST["dateDebut"];
    $dateFin = $_POST["dateFin"];
    $titre = $_POST['titre'];
    $titre = stripslashes($titre);
    $description = str_replace("\n", '<br/>',$_POST['description']);
     
     
    include('connexion_sql.php');
     
            $typeDate = "#^[0-3]?[0-9]/[0-1]?[0-9]/[0-9]{4}$#";
     
            if (preg_match($typeDate, $dateDebut) AND preg_match($typeDate, $dateFin)) {
                $tabDateDeb = explode("/", $dateDebut);
                $timestampDebut = mktime(0, 0, 0, $tabDateDeb[1], $tabDateDeb[0], $tabDateDeb[2]);
     
                $tabDateFin = explode("/", $dateFin);
                $timestampFin = mktime(0, 0, 0, $tabDateFin[1], $tabDateFin[0], $tabDateFin[2]);
     
                $timestampDiff = $timestampFin - $timestampDebut;
                $nbreJours = intval($timestampDiff / 86400)+1;
     
                if($nbreJours <= 0) $nbreJours = 1;
     
     
                if(!empty($titre) AND !empty($description)) {
                    // Traitement de l'enregistrement de l'évènement
                    $id_evenement = time(); // j'ai remplacé $identifiantCommun par $id_evenement
                    $timeDuJour = $timestampDebut;
                    $jour_evenement=date('d', $timeDuJour);
                    $mois_evenement=date('m', $timeDuJour);
                    $annee_evenement=date('Y', $timeDuJour);
     
                    /*for($i=0 ; $i<$nbreJours ; $i++) { // je garde cela en archive
                        $req = $bdd->exec ('INSERT INTO matable_agenda VALUES (" ", ' .date("d", $timeDuJour). ', ' .date("m", $timeDuJour). ', ' .date("Y", $timeDuJour). ', ' .$bdd->quote($identifiantCommun). ')') or die(print_r($bdd->errorInfo()));
                             
                        $timeDuJour += 86400; // On augmente le timestamp d'un jour
                    }
                                 
                        $req = $bdd->exec ('INSERT INTO matable_detail VALUES (' .$bdd->quote($identifiantCommun). ', ' .$bdd->quote($titre). ', ' .$bdd->quote($description). ')') or die(print_r($bdd->errorInfo()));
                    */
     
     
     
     
                    for($i=0 ; $i<$nbreJours ; $i++) {
                        $req = $bdd->prepare ('INSERT INTO matable_agenda
                                                (jour_evenement, mois_evenement, annee_evenement, id_evenement)
                                                VALUES (:jour_evenement, :mois_evenement, :annee_evenement, :id_evenement)')
                                                or die(print_r($bdd->errorInfo()));
     
                        $req->execute(array(
                                            'jour_evenement'=>$jour_evenement,
                                            'mois_evenement'=>$mois_evenement,
                                            'annee_evenement'=>$annee_evenement,
                                            'id_evenement'=>$id_evenement
                                            ));
     
                        $timeDuJour += 86400; // On augmente le timestamp d'un jour
                    }
     
                    $req = $bdd->prepare ('INSERT INTO matable_detail
                                            (id_evenement, titre_evenement, description_evenement)
                                            VALUES (:id_evenement, :titre, :description)')
                                            or die(print_r($bdd->errorInfo()));
     
                    $req->execute(array(
                                        'id_evenement'=>$id_evenement,
                                        'titre'=>$titre,
                                        'description'=>$description
                                        ));
     
     
                        $titre=''; $description=''; $dateDebut = date('d\/m\/Y', time()); $dateFin = date('d\/m\/Y', time());
     
     
                        echo '<p>L\'événement a bien été enregistré !</p>';
                }                  
                else {
                    echo '<p>Oups… ! Le titre ou la description de l\'événement n\'a pas été renseigné(e). <a class="retour" href="javascript:history.go( -1 )" title="Retour sur la page précédente">Recommencer ?</a></p>';
                }
            }
            else {
                echo '<p>Oups… ! La date de l\'événement n\'est pas au format attendu : jj/mm/aaaa. <a class="retour" href="javascript:history.go( -1 )" title="Retour sur la page précédente">Recommencer ?</a></p>';
            }
                //$req->closeCursor();
                echo '<br /><p><a class="retour" href="gestion.php" title="Retour sur la page de gestion">Retour sur la page de gestion</a></p>';
            ?>
    la table_agenda se compose de 5 colonnes : id_calendrier, jour_evenement, mois_evenement, annee_evenement, id_evenement

    et la table_detail se compose de 3 colonnes : id_evenement, titre_evenement, description_evenement


    Je vous remercie de votre aide

  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 : 47
    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,

    Avant de regarder ton problème d'itération, je pense qu'il faille se pencher sur le design de ta base.

    Premièrement, pourquoi enregistrer 5 occurrences d'un même événement juste parce qu'il s'étale sur 5 jours ?
    Un seul enregistrement avec une date de début et une date de fin devrait suffire, non ?

    Deuxièmement, ce n'est plus du tout nécessaire de gérer les dates sous format éclaté : une colonne jour, une colonne mois, une colonne année. Tous les moteurs de base de données proposent une tonne de fonctions pour gérer les dates sans compter que le stockage au format Date/DateTime est généralement optimum... Tu peux donc remplacer sans crainte tes colonnes par une seule : evt_date_debut, evt_date_fin.

    Enfin je te conseille très fortement d'utiliser les outils natifs fournis par PHP dans tous les cas et surtout pour les dates, cela évite des usines à gaz.
    Voici ce que je te propose :
    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
    $err         = [];
    $date_debut  = (isset($_POST['dateDebut']))   ? \DateTime::createFromFormat('d/m/Y', $_POST['dateDebut']) : new \DateTime('now');
    $date_fin    = (isset($_POST['dateFin']))     ? \DateTime::createFromFormat('d/m/Y', $_POST['dateFin'])   : clone $date_debut;
    $titre       = (isset($_POST['titre']))       ? $_POST['titre']       : '';
    $description = (isset($_POST['description'])) ? $_POST['description'] : '';
     
    if (empty($titre) || empty($description))
    {
        $err[] = "Oups… ! Le titre ou la description de l'événement n'a pas été renseigné.";
    }
     
    if (($date_debut === false) || ($date_fin === false))
    {
        $err[] = "Oups… ! La date de l'événement n'est pas au format attendu : jj/mm/aaaa.";
    }
    elseif ($date_debut < $date_fin)
    {
        $err[] = "Oups… ! Dates incohérentes.";
    }
     
    if ( ! empty($err))
    {
        echo '<p>', implode('<br>', $err), '<a class="retour" href="javascript:history.go( -1 )" title="Retour sur la page précédente">Recommencer ?</a></p>';
        exit;
    }
     
     
    $sql  = 'INSERT INTO `matable_agenda` (`evt_date_debut`, `evt_date_fin`, `titre`, `description`) VALUES (:evt_date_debut, :evt_date_fin, :titre, :description)';
    $stmt = $bdd->prepare($sql);
    $exec = $stmt->execute([
        ':evt_date_debut' => $date_debut->format('Y-m-d'),     
        ':evt_date_fin'   => $date_fin->format('Y-m-d'),
        ':titre'          => $titre,
        ':description'    => $description
    ]);
     
    if ($exec)
        echo "<p>L'événement a bien été enregistré !</p>";    
    else
        die ($bdd->errorInfo());

  3. #3
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Août 2011
    Messages
    54
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2011
    Messages : 54
    Points : 36
    Points
    36
    Par défaut
    Bonjour Rawsrc et merci de ta réponse

    Mon problème est résolu avec le déplacement de trois lignes vers l'intérieur de la boucle for.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    $jour_evenement=date('d', $timeDuJour);
                    $mois_evenement=date('m', $timeDuJour);
                    $annee_evenement=date('Y', $timeDuJour);

    Premièrement, pourquoi enregistrer 5 occurrences d'un même événement juste parce qu'il s'étale sur 5 jours ?
    Parce que je souhaite que l'événement s'affiche sur l'agenda (un pavé de date) sur chacune des dates.

    Pour tout le reste du post, tu as entièrement raison, mon code n'est plus approprié à cause de ce qu'il est possible de faire depuis et ton exemple va m'encourager à reprendre mon apprentissage.

    Je n'ai pas repris le code que tu m'as proposé car il y a certaines lignes que je n'ai pas compris comme le raisonnement de ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    $date_debut  = (isset($_POST['dateDebut']))   ? \DateTime::createFromFormat('d/m/Y', $_POST['dateDebut']) : new \DateTime('now');
    $date_fin    = (isset($_POST['dateFin']))     ? \DateTime::createFromFormat('d/m/Y', $_POST['dateFin'])   : clone $date_debut;
    $titre       = (isset($_POST['titre']))       ? $_POST['titre']       : '';
    $description = (isset($_POST['description'])) ? $_POST['description'] : '';
    Il me semble que c'est une formule raccourcie et je ne la comprends pas et si je ne comprends pas, je n'utilise pas.

    Mais grâce à toi, je vais remettre mon ouvrage sur le métier, voire même refondre entièrement mon agenda.

    Merci bien

  4. #4
    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 : 47
    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
    Citation Envoyé par Marie08 Voir le message
    Parce que je souhaite que l'événement s'affiche sur l'agenda (un pavé de date) sur chacune des dates.
    Cela n'implique pas que tu dupliques en base de données un même événement autant de fois que de jours occupés par ledit événement.
    Ce n'est qu'une histoire de SELECT.

    Si ton agenda offre la possibilité de gérer la récurrence d'événements, là dans ce cas de figure, tu devras avoir une table t_evenement séparée.

    Pour ce qui est de cette syntaxe :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $date_debut  = (isset($_POST['dateDebut']))   ? \DateTime::createFromFormat('d/m/Y', $_POST['dateDebut']) : new \DateTime('now');
    c'est très simple, le isset() vérifie que le tableau $_POST contient bien une clé dateDebut, si oui on prend sa valeur que l'on transforme en DateTime() (si renvoie false, cela veut tout simplement dire que la date n'est pas valide), si non on prend la date du jour new \DateTime('now').

    Yapuka lire un peu la doc de PHP

  5. #5
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Août 2011
    Messages
    54
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2011
    Messages : 54
    Points : 36
    Points
    36
    Par défaut
    Merci Rawsrc de toutes ces explications ; je vais garder ce post précieusement et refondre mon agenda dans les "règles de l'art"

    Yapuka lire un peu la doc de PHP
    A cause de ma mémoire de poisson rouge, j'y reviens souvent ! Elle a le mérite d'être claire

    Et ben, y'a du boulot...

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

Discussions similaires

  1. Insertion de page HTM
    Par vileb29 dans le forum Balisage (X)HTML et validation W3C
    Réponses: 1
    Dernier message: 02/02/2007, 14h58
  2. Insertion de page excel dans une BD
    Par ricachu dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 08/06/2006, 14h51
  3. [insertion de pages html dans d'autres pages]
    Par Patriarch24 dans le forum Balisage (X)HTML et validation W3C
    Réponses: 7
    Dernier message: 07/03/2006, 14h56
  4. INSERT fréquents : éviter les traitements inutiles ?
    Par tempirate dans le forum SQL Procédural
    Réponses: 7
    Dernier message: 05/03/2006, 18h25
  5. Probleme d'insertion de page XHTML/CSS/PHP
    Par crocod dans le forum Mise en page CSS
    Réponses: 1
    Dernier message: 14/12/2005, 19h25

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