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

PHP & Base de données Discussion :

[Requête SQL] insert de date


Sujet :

PHP & Base de données

  1. #1
    Membre régulier
    Homme Profil pro
    Inscrit en
    Novembre 2007
    Messages
    274
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Novembre 2007
    Messages : 274
    Points : 114
    Points
    114
    Par défaut [Requête SQL] insert de date
    Bonjour à tous,

    Je viens vers vous pour un problème que je n'arrive pas à résoudre.

    Mon but est d'enregistré une date de debut et de fin, mais voilà, la date de fin ne s'enregistre jamais comme il faudrait.

    Structure de ma table
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    id (INT) Auto-incrément (primary key)  // ID unique de l'élément
    idel (INT)  // ID de l'élément pour lequel on enregistre ces dates
    idu (INT) // ID de l'utilisateur
    debut (DATE YYYY-MM-DD) // Date de début
    fin (DATE YYYY-MM-DD) // Date de fin
    Je passe par un formulaire qui envoi ce dernier vers une page d'exécution dont voici le traitement
    PS : Les dates sont introduite dans le formulaire au format JJ/MM/AAAA
    PS bis : Je passe les détails de vérification
    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
     
    <?php
        $idu = (isset($_POST['idu'])) ? $_POST['idu'] : 0; // ID de l'utilisateur
        $idel = (isset($_POST['idel'])) ? $_POST['idel'] : 0; // ID de l'élément pour lequel définir des dates
        $debut = (isset($_POST['debut'])) ? $_POST['debut'] : strftime("%d/%m/%Y",time());
        $fin = (isset($_POST['fin']) && $_POST['fin'] != '') ? $_POST['fin'] : strftime("%d/%m/%Y",time());
        // Reformatge des dates
        list($d, $m, $y) = explode('/', $debut);
        $debut_sql = $y."-".$m."-".$d;
        list($df, $mf, $yf) = explode('/', $fin);
        $fin_sql = $yf."-".$mf."-".$df;
     
        // La requête d'insert
        $req = "INSERT INTO ma_table VALUES('0','".$idel.",'".$idu."','".$debut_sql."','".$fin_sql."')";
        // L'exécution de la requête
        $qry = $pdo->query($req);
     
        // Pour débogage j'affiche la requête
        echo $req;
    Et voici ce que m'affiche '$req'
    INSERT INTO ma_table VALUES('0','1','2','2011-05-01','2012-04-31')
    L'affichage de la requête final, montre clairement que les données sont correctes, le nombre de colonne aussi
    Pourtant ma date de fin reste à 0000-00-00, et aucune erreur SQL, je ne comprend donc pas pourquoi ni comment cela est possible car dans l'absolu tout me semble correcte et compris le format de la date.

    D'avance merci pour votre participation
    Spliffer

  2. #2
    Invité
    Invité(e)
    Par défaut
    Bonjour,

    il faut préparer la requête.

    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
        // La requête d'insert
        $req = "INSERT INTO ma_table VALUES (NULL, ?, ?, ?, ?)";
        // préparation de la requête
        $qry = $pdo->prepare( $req );
        // exécution de la requête
        $qry->execute( array( $idel, $idu, $debut_sql, $fin_sql ) );

  3. #3
    Membre régulier
    Homme Profil pro
    Inscrit en
    Novembre 2007
    Messages
    274
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Novembre 2007
    Messages : 274
    Points : 114
    Points
    114
    Par défaut
    Même résultat en DB, la date de fin est toujours 0000-00-00

  4. #4
    Membre régulier
    Homme Profil pro
    Inscrit en
    Novembre 2007
    Messages
    274
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Novembre 2007
    Messages : 274
    Points : 114
    Points
    114
    Par défaut
    Bon je vais aller me cacher je crois....

    En faite effectivement il n'y à pas 31 jours au moi d'avril mais 30 donc la date que j’entrais n'était évidemment pas correcte
    Problème résolu et désolé du dérangement pour une telle faute de ma part en plus....

  5. #5
    Membre averti
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2014
    Messages
    219
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2014
    Messages : 219
    Points : 336
    Points
    336
    Par défaut
    Bonjour,

    Je suppose que tu es sur mysql, une date invalide renvoie 0000-00-00
    https://dev.mysql.com/doc/refman/5.7..._invalid_dates

    edit: en effet 31 jours en avril ce n'est pas très valide
    Si débugger est l'art de corriger les bugs, alors programmer est l'art d'en créer.

  6. #6
    Membre expert
    Avatar de Dendrite
    Femme Profil pro
    Développeuse informatique
    Inscrit en
    Juin 2008
    Messages
    2 129
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 58
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeuse informatique
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Juin 2008
    Messages : 2 129
    Points : 3 627
    Points
    3 627
    Billets dans le blog
    8
    Par défaut
    Bonjour...

    PS : Les dates sont introduite dans le formulaire au format JJ/MM/AAAA
    PS bis : Je passe les détails de vérification
    Pourtant c'est bien en PHP qu'il faut vérifier les dates avant de les balancer dans la base.
    Et vérifier une date, ce n'est pas vérifier son format seulement, c'est vérifier sa validité irl...

    Cette fonction (bien que non testée) pourrait t'aider...


    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
     <?php
    function retourne_dates($input_date_en){
      try {
        if(! empty(trim($input_date_en))){//sinon parametre vide retournerait date du jour
          $dt = new DateTime($input_date_en);
          if($dt->format('Y')>0){ //éviter les saisies du genre "0000-00-00"
            $row['date_fr']=$dt->format('d/m/Y');
            $row['date_en']=$dt->format('Y-m-d');
            return $row;
          }    
          else{
            return false;
          }
        }
        else{
          return false;
        }
      } 
      catch (Exception $e) {
        return false;
      }
    }
    $req = "INSERT INTO ma_table VALUES (NULL, ?, ?, ?, ?)";
    $qry = $pdo->prepare( $req );
    $debut=retourne_dates($_POST['debut']);
    $fin=retourne_dates($_POST['fin']);
    if($debut!==false && $fin!==false){
      $qry->execute( array( $idel, $idu, $debut['date_en'], $fin['date_en'] ) );
    }
    PDO, une soupe et au lit !
    Partir de la fin est un bon moyen de retrouver son chemin. Bibi - 2020

  7. #7
    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,

    @Dendrite
    Ce genre de fonction trouvée sur le net est souvent moisi.
    Pourquoi encapsuler le traitement dans un try { } catch { } alors que Datetime renvoie false quand la date n'est pas constructible ?
    Bref, perte inutile de ressources et de temps.
    Ensuite où t'as vu que le format Y-m-d était le format anglais ? Le format anglais d'une date est m/d/Y. Donc, le code induit une erreur grossière.
    Enfin, les formulaires renvoient les dates saisies dans le format normalisé : Y-m-d quelle que soit la locale utilisée (heureusement)

    CONSEIL :
    Dans votre code PHP, il faut toujours manipuler les dates soit :
    - sous format Datetime()
    - soit sous format texte Y-m-d
    Aucune autre tolérance ne devrait être permise.

  8. #8
    Membre expert
    Avatar de Dendrite
    Femme Profil pro
    Développeuse informatique
    Inscrit en
    Juin 2008
    Messages
    2 129
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 58
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeuse informatique
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Juin 2008
    Messages : 2 129
    Points : 3 627
    Points
    3 627
    Billets dans le blog
    8
    Par défaut
    Valeurs de retour ¶
    Retourne une nouvelle instance DateTime. Style procédural retourne FALSE en cas d'erreur.
    Quand je lis ça dans le manuel, j'en conclue que le style objet ne retourne pas false ? Allez savoir...

    english = de langue anglaise, pas anglais au sens restrictif comme l'équipe de foot...
    PDO, une soupe et au lit !
    Partir de la fin est un bon moyen de retrouver son chemin. Bibi - 2020

  9. #9
    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 Dendrite Voir le message
    Quand je lis ça dans le manuel, j'en conclue que le style objet ne retourne pas false ? Allez savoir...
    T'as raison, DateTime lève bien une exception en cas de problème de date invalide, donc le try catch est bien approprié

  10. #10
    Modérateur

    Avatar de MaitrePylos
    Homme Profil pro
    DBA
    Inscrit en
    Juin 2005
    Messages
    5 496
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : Belgique

    Informations professionnelles :
    Activité : DBA
    Secteur : Service public

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 496
    Points : 12 596
    Points
    12 596
    Par défaut
    Sinon, chouette conf sur le sujet

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

Discussions similaires

  1. [AC-2010] Requête SQL INSERT avec DATES
    Par fclus dans le forum Requêtes et SQL.
    Réponses: 1
    Dernier message: 28/04/2015, 13h13
  2. Réponses: 4
    Dernier message: 10/04/2007, 11h10
  3. Requêtes SQL pour les Dates et numériques
    Par Ramage03 dans le forum Langage SQL
    Réponses: 3
    Dernier message: 23/03/2006, 17h26
  4. [SQL2K] requête SQL, comparer des dates
    Par cortex024 dans le forum MS SQL Server
    Réponses: 10
    Dernier message: 16/03/2006, 14h32
  5. Requête sql regroupement de dates
    Par rocs dans le forum Langage SQL
    Réponses: 1
    Dernier message: 28/07/2005, 16h40

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