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 :

mise au format SQL d'une date


Sujet :

Langage PHP

  1. #1
    Expert confirmé
    Avatar de laurentSc
    Homme Profil pro
    Webmaster débutant perpétuel !
    Inscrit en
    Octobre 2006
    Messages
    10 470
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Webmaster débutant perpétuel !
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2006
    Messages : 10 470
    Points : 5 831
    Points
    5 831
    Billets dans le blog
    1
    Par défaut mise au format SQL d'une date
    Bonjour,

    je récupère des dates dans ce format : MMM-DD, YYYY (MMM in letters). Je souhaite les enregistrer dans une BDD MySQL, donc d'abord, il faut les mettre au format YYYY-MM-DD HH:MM:SS. Je fais donc une fonction PHP pour les convertir, mais erreur dont je ne trouve pas la cause :
    Code php : 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
     function convert_date($olddate) {
        //to convert month from letters to figures
            function convert_month_letters_to_figures($Month_Letter) {
                switch($Month_Letter) {
                    case 'Jan' :$month=1; break;
                    case 'Feb' :$month=2; break;
                    case 'Mar' :$month=3; break;
                    case 'Apr' :$month=4; break;
                    case 'May' :$month=5; break;
                    case 'Jun' :$month=6; break;
                    case 'Jul' :$month=7; break;
                    case 'Aug' :$month=8; break;
                    case 'Sep' :$month=9; break;
                    case 'Oct' :$month=10; break;
                    case 'Nov' :$month=11; break;
                    case 'Dec' :$month=12; break;
                }
                return($month);
            }
     
            list($mmdd,$year)=explode(',',$olddate);
    ...
    }

    Notice: Undefined offset: 1 in C:\wamp64\www\ticket\classes\Ticket.php on line 21
    Merci de m'aider

  2. #2
    Membre confirmé Avatar de ma5t3r
    Homme Profil pro
    Développeur freelance
    Inscrit en
    Mai 2015
    Messages
    320
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur freelance
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2015
    Messages : 320
    Points : 492
    Points
    492
    Par défaut
    Salut,

    En considérant que la chaîne passée en paramètre est au bon format.
    A toi de traiter les éventuelles erreurs possibles.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
     
        function get_date_sql($date = 'Jan-11, 2019') {
            $months_text = array ('', 'Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec');
            $first = explode(',', $date);
            $mj = explode('-', $first[0]);
     
            $my_date = new DateTime();
            $month = array_search($mj[0], $months_text);
            $my_date->setDate($first[1], $month, $mj[1]);
     
            return $my_date->format('Y-m-d H:i:s');
        }

  3. #3
    Expert confirmé
    Avatar de laurentSc
    Homme Profil pro
    Webmaster débutant perpétuel !
    Inscrit en
    Octobre 2006
    Messages
    10 470
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Webmaster débutant perpétuel !
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2006
    Messages : 10 470
    Points : 5 831
    Points
    5 831
    Billets dans le blog
    1
    Par défaut
    Merci pour ta réponse. Ton code est plus concis que le mien et semble répondre à mon besoin. Mais en voulant l'utiliser, j'ai ce message d'erreur :
    Fatal error: Uncaught Error: Class 'classes\Ticket\DateTime' not found in C:\wamp64\www\ticket\classes\Ticket.php on line 168
    Y a quelque chose à faire pour utiliser la classe DateTime ?

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

    soit tu remets new DateTime() sur l'espace de nom global : new \DateTime(),
    soit tu déclares ta dépendance dans l'en-tête avec use DateTime; et comme ça tu pourras faire directement new DateTime()

  5. #5
    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
    sincèrement, depuis le temps laurentSc, tu pourrais quand même faire un effort mon vieux (surtout pour ce qui est des dates, PHP fournit tout ce qu'il faut nativement) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    $date = DateTime::createFromFormat('M-d, Y', 'Jan-11, 2019');
    echo $date->format('Y-m-d'); // 2019-01-11
    Faut juste aller potasser la doc

  6. #6
    Expert confirmé
    Avatar de laurentSc
    Homme Profil pro
    Webmaster débutant perpétuel !
    Inscrit en
    Octobre 2006
    Messages
    10 470
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Webmaster débutant perpétuel !
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2006
    Messages : 10 470
    Points : 5 831
    Points
    5 831
    Billets dans le blog
    1
    Par défaut
    Ca paraît simple et pourtant
    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    function get_date_sql($date = 'Jan-11, 2019') {
            $months_text = array ('', 'Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec');
            $first = explode(',', $date);
            $mj = explode('-', $first[0]);
     
            //$my_date = new DateTime();
            $my_date = DateTime::createFromFormat('M-d, Y', $date);
    //echo $my_date->format('Y-m-d'); // 2019-01-11
            $month = array_search($mj[0], $months_text);
            $my_date->setDate($first[1], $month, $mj[1]);
     
            return $my_date->format('Y-m-d H:i:s');
        }
    donne
    Fatal error: Uncaught Error: Call to a member function setDate() on bool in C:\wamp64\www\ticket\classes\Ticket.php on line 10

  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 : 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
    tu as déclaré ta dépendance ?
    sinon comme ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $my_date = \DateTime::createFromFormat('M-d, Y', $date);
    et vire moi tout le code inutile, cela t'évitera l'erreur avec setDate()

  8. #8
    Membre confirmé Avatar de ma5t3r
    Homme Profil pro
    Développeur freelance
    Inscrit en
    Mai 2015
    Messages
    320
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur freelance
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2015
    Messages : 320
    Points : 492
    Points
    492
    Par défaut
    OOPS !
    Pourquoi faire simple quand on peut faire compliqué ?

    C'est le format MMM-DD, YYYY du départ qui m'a induit en erreur.
    Pourtant, je me suis posé la question

  9. #9
    Expert confirmé
    Avatar de laurentSc
    Homme Profil pro
    Webmaster débutant perpétuel !
    Inscrit en
    Octobre 2006
    Messages
    10 470
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Webmaster débutant perpétuel !
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2006
    Messages : 10 470
    Points : 5 831
    Points
    5 831
    Billets dans le blog
    1
    Par défaut
    Si virer le code inutile, c'est juste enlever les lignes commentées, donc comme ça :
    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    function get_date_sql($date = 'Jan-11, 2019') {
            $months_text = array ('', 'Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec');
            $first = explode(',', $date);
            $mj = explode('-', $first[0]);
     
            $my_date = DateTime::createFromFormat('M-d, Y', $date);
            $month = array_search($mj[0], $months_text);
            $my_date->setDate($first[1], $month, $mj[1]);
     
            return $my_date->format('Y-m-d H:i:s');
        }
    ça n'enlève pas le message d'erreur.

    Et au fait, j'ai bien au début de la page, la dépendance : use DateTime;

  10. #10
    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
    vire ta fonction entièrement et essaie juste avec ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    $d = 'Jan-01, 2019';
    $date = \DateTime::createFromFormat('M-d, Y', $d);
    echo $date->format('Y-m-d');
    pour cette transformation tu n'as pas besoin à vrai dire d'une fonction, la classe DateTime suffit amplement
    Fonction nettoyée :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    function get_date_sql($date = 'Jan-11, 2019') {
        $my_date = \DateTime::createFromFormat('M-d, Y', $date); 
        return $my_date->format('Y-m-d H:i:s');
    }

  11. #11
    Expert confirmé
    Avatar de laurentSc
    Homme Profil pro
    Webmaster débutant perpétuel !
    Inscrit en
    Octobre 2006
    Messages
    10 470
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Webmaster débutant perpétuel !
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2006
    Messages : 10 470
    Points : 5 831
    Points
    5 831
    Billets dans le blog
    1
    Par défaut
    J'ai quand même gardé la fonction car elle est appelée plus loin dans le code, donc ça m'a paru plus simple.

    La voici :
    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    function get_date_sql($date = 'Jan-11, 2019') {
            $date = \DateTime::createFromFormat('M-d, Y', $date);
            var_dump($date);
            return $date->format('Y-m-d');
        }
    et le var_dump donne
    C:\wamp64\www\ticket\classes\Ticket.php:164:boolean false
    Pourquoi c'est un booléen ?

  12. #12
    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
    parce que DateTime renvoie false s'il échoue. Cela veut dire qu'il n'est pas arrivé à parser la chaîne.
    En tout cas ton bout de code fonctionne impec sur mon serveur de dev.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    function get_date_sql($date = 'Jan-11, 2019') {
        $date = \DateTime::createFromFormat('M-d, Y', $date);
        var_dump($date);
        return $date->format('Y-m-d');
    }
    echo get_date_sql();
    me renvoie :
    object(DateTime)[1]
      public 'date' => string '2019-01-11 20:53:45.000000' (length=26)
      public 'timezone_type' => int 3
      public 'timezone' => string 'UTC' (length=3)
    
    2019-01-11

  13. #13
    Modératrice
    Avatar de Celira
    Femme Profil pro
    Développeuse PHP/Java
    Inscrit en
    Avril 2007
    Messages
    8 633
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 39
    Localisation : France

    Informations professionnelles :
    Activité : Développeuse PHP/Java
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2007
    Messages : 8 633
    Points : 16 372
    Points
    16 372
    Par défaut
    Citation Envoyé par rawsrc Voir le message
    sincèrement, depuis le temps laurentSc, tu pourrais quand même faire un effort mon vieux (surtout pour ce qui est des dates, PHP fournit tout ce qu'il faut nativement) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    $date = DateTime::createFromFormat('M-d, Y', 'Jan-11, 2019');
    echo $date->format('Y-m-d'); // 2019-01-11
    Faut juste aller potasser la doc
    Attention, il me semble que ça ne fonctionne qu'avec les mois en anglais. Si il veut les abbréviations en français, il va falloir le faire à la main.

  14. #14
    Expert confirmé
    Avatar de laurentSc
    Homme Profil pro
    Webmaster débutant perpétuel !
    Inscrit en
    Octobre 2006
    Messages
    10 470
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Webmaster débutant perpétuel !
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2006
    Messages : 10 470
    Points : 5 831
    Points
    5 831
    Billets dans le blog
    1
    Par défaut
    Tout compte fait, c'est pas la fonction qui est en cause : le format entrant des dates n'était pas celui attendu ! C'est bizarre car dans le fichier csv d'où il vient, c'est bien ce format-là (M d, Y)(y a pas de tiret finalement) mais à l'entrée de la fonction, il est devenu M d Y. Je vois pas pourquoi mais avec
    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     function get_date_sql($date = 'Jan-11, 2019') {
            $date1 = \DateTime::createFromFormat('M d, Y', $date);
            if ($date1==false) {$date1=\DateTime::createFromFormat('M d Y', $date);}
             if ($date1!=false) return( $date1->format('Y-m-d'));
             else return(false);
        }
    plus de souci.

  15. #15
    Membre confirmé Avatar de ma5t3r
    Homme Profil pro
    Développeur freelance
    Inscrit en
    Mai 2015
    Messages
    320
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur freelance
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2015
    Messages : 320
    Points : 492
    Points
    492
    Par défaut
    Tu nous a bien cassé les pieds avec ton format d'entrée MMM-DD, YYYY pour t'apercevoir que tu induisais tout le monde en erreur.

    Tout ça pour un simple formatage de date. Je suis plié (sans ironie)

  16. #16
    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
    ça se voit que tu ne connais pas encore laurentSc...


    @laurentSc
    sois gentil et vire moi la date par défaut de ta fonction

  17. #17
    Expert confirmé
    Avatar de laurentSc
    Homme Profil pro
    Webmaster débutant perpétuel !
    Inscrit en
    Octobre 2006
    Messages
    10 470
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Webmaster débutant perpétuel !
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2006
    Messages : 10 470
    Points : 5 831
    Points
    5 831
    Billets dans le blog
    1
    Par défaut
    Faut pas le prendre mal, car même si je me suis trompé sur le format d'entrée de la fonction, la discussion m'a permis d'avoir un code qui répond à mon besoin, et bien plus concis que si je l'avais fait sans votre aide.

    PS : j'ai retiré la valeur par défaut de la fonction.

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

Discussions similaires

  1. [MySQL] comment rechercher une date au format datetime avec une date au format date
    Par Menoly dans le forum PHP & Base de données
    Réponses: 2
    Dernier message: 15/06/2007, 11h14
  2. Réponses: 13
    Dernier message: 27/12/2006, 18h52
  3. [T-SQL] insérer une date et une heure ?
    Par ionix dans le forum Adaptive Server Enterprise
    Réponses: 5
    Dernier message: 10/11/2006, 16h11
  4. Mise en forme conditionnelle pour une date
    Par Michel DELAVAL dans le forum Access
    Réponses: 4
    Dernier message: 03/10/2006, 22h31
  5. Manipuler le format retourné pour une date.
    Par BlackMinou dans le forum Oracle
    Réponses: 3
    Dernier message: 05/04/2006, 19h01

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