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

    Informations forums :
    Inscription : novembre 2007
    Messages : 196
    Points : 94
    Points
    94

    Par défaut [Requête SQL] Problème d'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
    Rédacteur/Modérateur
    Avatar de jreaux62
    Homme Profil pro
    Webdesigner
    Inscrit en
    août 2008
    Messages
    12 341
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Webdesigner
    Secteur : Arts - Culture

    Informations forums :
    Inscription : août 2008
    Messages : 12 341
    Points : 24 784
    Points
    24 784

    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 ) );
    "Si tu suis le chemin qui s'appelle « plus tard », tu arriveras à la place qui s'appelle « jamais »."
    François Camille Prévot (1910-1996), instituteur puis Directeur d'école et... mon grand-père.
    "Pose ta question, tu seras idiot une seconde. Ne la pose pas, tu seras idiot toute ta vie."
    Albert Einstein (1879-1955).
    Mes tutos DVP
    Gestion-Affichage de Nouvelles
    Affichage en tableau HTML
    Fonctions de redimensionnement d'images

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

    Informations forums :
    Inscription : novembre 2007
    Messages : 196
    Points : 94
    Points
    94

    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
    196
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : novembre 2007
    Messages : 196
    Points : 94
    Points
    94

    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 Avatar de arthur57
    Homme Profil pro
    Développeur informatique
    Inscrit en
    mars 2014
    Messages
    216
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

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

    Informations forums :
    Inscription : mars 2014
    Messages : 216
    Points : 358
    Points
    358

    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 émérite
    Avatar de Dendrite
    Femme Profil pro
    Développeuse informatique
    Inscrit en
    juin 2008
    Messages
    1 622
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 52
    Localisation : France, Paris (Île de France)

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

    Informations forums :
    Inscription : juin 2008
    Messages : 1 622
    Points : 2 576
    Points
    2 576
    Billets dans le blog
    5

    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'] ) );
    }
    Mes billets de blog : un billet = une problématique précise
    It's easier to be friends with lots of people online than one person in person!

  7. #7
    Modérateur
    Avatar de rawsrc
    Homme Profil pro
    Dev indep
    Inscrit en
    mars 2004
    Messages
    4 592
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Dev indep

    Informations forums :
    Inscription : mars 2004
    Messages : 4 592
    Points : 11 358
    Points
    11 358
    Billets dans le blog
    5

    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.
    # Dans la Création, tout est permis mais tout n'est pas utile...

  8. #8
    Membre émérite
    Avatar de Dendrite
    Femme Profil pro
    Développeuse informatique
    Inscrit en
    juin 2008
    Messages
    1 622
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 52
    Localisation : France, Paris (Île de France)

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

    Informations forums :
    Inscription : juin 2008
    Messages : 1 622
    Points : 2 576
    Points
    2 576
    Billets dans le blog
    5

    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...
    Mes billets de blog : un billet = une problématique précise
    It's easier to be friends with lots of people online than one person in person!

  9. #9
    Modérateur
    Avatar de rawsrc
    Homme Profil pro
    Dev indep
    Inscrit en
    mars 2004
    Messages
    4 592
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Dev indep

    Informations forums :
    Inscription : mars 2004
    Messages : 4 592
    Points : 11 358
    Points
    11 358
    Billets dans le blog
    5

    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é
    # Dans la Création, tout est permis mais tout n'est pas utile...

  10. #10
    Responsable Livres

    Avatar de MaitrePylos
    Homme Profil pro
    DBA & Dev PHP
    Inscrit en
    juin 2005
    Messages
    4 574
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : Belgique

    Informations professionnelles :
    Activité : DBA & Dev PHP
    Secteur : Service public

    Informations forums :
    Inscription : juin 2005
    Messages : 4 574
    Points : 10 368
    Points
    10 368

    Par défaut

    Sinon, chouette conf sur le sujet

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

Discussions similaires

  1. probléme d'insertion des dates en sql server 2005
    Par maradona_9 dans le forum JDBC
    Réponses: 1
    Dernier message: 17/04/2012, 10h30
  2. [AC-2003] Requête SQL : problème pour passer une date
    Par phoon dans le forum Requêtes et SQL.
    Réponses: 2
    Dernier message: 03/11/2009, 07h29
  3. [SQL] problème d'insertion dans ma base ou problème de requête sql
    Par maroco31 informatik dans le forum PHP & SGBD
    Réponses: 4
    Dernier message: 06/06/2007, 08h16
  4. [T-SQL] Problème de conversions de dates
    Par kooljy dans le forum MS SQL-Server
    Réponses: 2
    Dernier message: 08/06/2006, 14h19
  5. [Requête SQL] Problème pour echantilloner
    Par jool dans le forum Langage SQL
    Réponses: 6
    Dernier message: 27/08/2005, 09h08

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