Partage
  • Partager sur Facebook
  • Partager sur Twitter

problème d'acceptation de date incomplète

symfony

    16 octobre 2020 à 21:39:23

    Bonsoir à tous,

    J'essaye de fournir en BDD une date incomplète, j'ai changé en BDD l'option, j'ai fais en procédural le test ça fonctionne mais pas sur symfony.

    Sur Symfony, je détaille une date en 3 input 

                ->add('dateNaissance', DateType::class, [
                    'required' => false,
                    'years' => range(2020, 1700),
                    'input' => 'datetime',
                    'label' => "Date de naissance"
                ])

    Dans l'envoi en BDD et dans la récupération, je ne pense pas que j'aurais de problème, 

    mon problème vient plutôt du navigateur, le fait de ne rien mettre ne se transforme pas en NULL

    j'ai le message d'erreur : cette valeur n'est pas valide

    Ce que je voudrais savoir c'est comment "tromper" le navigateur ?

    merci par avance

    • Partager sur Facebook
    • Partager sur Twitter

    la chance sourit aux audacieux

      16 octobre 2020 à 22:45:05

      Salut

      Je ne pense pas qu'il soit possible de rendre facultatif les listes de choix pour le mois et le jour. D'ailleurs, tu noteras que c'est le champ complet qui est requis ou non, et pas une de ses parties, ce qui implique une validation sur la date entière. Or, une année n'est pas une date (pas plus qu'un mois, mais passons), donc la validation ne passera pas.

      La solution que je verrais là tout de suite serait de faire ton propre type de champ qui pourrait ainsi s'afficher presque comme le type Date, mais il n'y aurait pas la validation et tu pourrais ainsi avoir tes dates partielles.

      • Partager sur Facebook
      • Partager sur Twitter
        16 octobre 2020 à 23:09:52

        Salut, 

        Oui, c'est ce que je pensais, le format date est sans failles. J'aurais espéré une solution déjà existante pour régler le problème 

        Il faudrait que je fasse comme ce que j'ai fais en procédural alors, créer 3 variables non ORM et les fusionner dans le Controller...

        if($_POST) 
        {
            $jour = ($_POST['jour']) ? $_POST['jour'] : 00;
            $mois = ($_POST['mois']) ? $_POST['mois'] : 00;
            $annee = ($_POST['annee']) ? $_POST['annee'] : 0000;
        
            $date = $annee . "-" . $mois . "-" . $jour;
        
        
            $requete = $pdoObject->prepare("INSERT INTO date (date) VALUES (:date)");
            $requete->bindValue(":date", $date, PDO::PARAM_STR);
            $requete->execute();
        
        }


        mais bon niveau possibilité dans le navigateur étant de type number je peux mettre tout chiffre le 50 décembre 2000, quand c'est faux l'envoi se fait mais le résultat en bdd est 0000-00-00

        ---------------------------------------

        J'ai testé sur Symfony 

        j'ai créé 3 variables non ORM jn mn an (jour naissance mois naissance année naissance)

        voilà mon controller 

                                if(!empty($user->getJn()))
                                {
                                    if(strlen($user->getJn()) == 1)
                                    {
                                        $j = 0 . $user->getJn();
                                    }
                                    else
                                    {
                                        $j = $user->getJn();
                                    }
                                }
                                else
                                {
                                    $j = 00;
                                }
        
        
        
                                if(!empty($user->getMn()))
                                {
                                    if(strlen($user->getMn()) == 1)
                                    {
                                        $m = 0 . $user->getMn();
                                    }
                                    else
                                    {
                                        $m = $user->getMn();
                                    }
                                    
                                }
                                else
                                {
                                    $m = 00;
                                }
        
                                
        
                                if(!empty($user->getAn()))
                                {
                                    $a = $user->getAn();
                                }
                                else
                                {
                                    $a = 0000;
                                }
        
                                $dateformat = new DateTime("$a-$m-$j");
        
                                dd($dateformat); die;
        
                                $user->setDateNaissance($dateformat);

        le die me retourne bien la structure d'un format date 2020-10-16

        envoyé en BDD aucun soucis retour sur le navigateur pareil

        maintenant quand je mets un input vide gardons l'exemple 2020-10-16

        j'ai mis 2020-rien(00)- 16 en bdd j'ai 2019-12-16.... pourtant j'ai accepté les zéros en bdd



        même le die met 2019-12-16



        -
        Edité par PierreRichard78 16 octobre 2020 à 23:58:00

        • Partager sur Facebook
        • Partager sur Twitter

        la chance sourit aux audacieux

          16 octobre 2020 à 23:59:54

          Tu peux mettre des listes de choix, ce qui limiterait déjà à 31 jours, et si tu as trois valeurs, valider la date avec date_create(), fonction qui a le relatif avantage sur la construction d'un objet qu'elle retourne false si la valeur n'est pas bonne plutôt que de jeter une exception.

          Mais j'ai vaguement l'impression de faire un bref voyage dans le temps, mettons de quatre mois environ. On ne serait pas à un jour près  :p

          Edit

          Pour le temps, je ne croyais pas si bien dire o_O

          Mais du coup, je vais me répéter : une date avec uniquement des zéros pour un des composants (ou pour tous) n'est PAS valide. Soit tu enregistres les trois parties séparément, soit tu convertis en quelque chose de valide que tu contrôles, soit tu laisses MySQL faire comme il l'entend.

          -
          Edité par Ymox 17 octobre 2020 à 0:02:21

          • Partager sur Facebook
          • Partager sur Twitter
            17 octobre 2020 à 0:09:15

            les dates le temps ... tout est lié on dirait ^^

            oui je relance le sujet il y a 4 mois j'avais laissé tomber, je m'y remets et pourtant j'ai testé hier en procédural me disant que mon idée n'est pas si mauvaise la preuve que ça fonctionne mais sur symfony les fonctions sur les dates posent trop de contraintes, une des solutions mais qui va poser d'autres problèmes est de définir son propre format de date qui sous entend trop de conditions

            encore le mois il n'y en a que 12 et ça ne changera pas mais les jours ... 3 possibilités dont une qui change tous les 4 ans donc croisement avec les années aussi 

            je vais voir avec date_create(), il suffit seulement que le zéro passe 

            ---

            pour répondre à ton edit, oui 4 mois tu as une horloge dans la tête

            et je comprends ce que tu répètes ce qui me fruste c'est qu'en procédural je peux avoir des zéros

            la différence ici lors de l'envoi ça change toute la date

            -
            Edité par PierreRichard78 17 octobre 2020 à 0:11:00

            • Partager sur Facebook
            • Partager sur Twitter

            la chance sourit aux audacieux

              17 octobre 2020 à 0:19:01

              Je doute sincèrement que ta base de données accepte une date 2020-00-16 ou même 2020-05-00 sans que ce soit converti en autre chose pour l'enregistrement. Il reste donc bien la possibilité d'enregistrer les trois valeurs séparément, tout en appuyant que valider une année c'est très simple, une année et un mois c'est possible aussi, une année et un jour dans celle ci pareil en fait (YYYY-DDD, le jour obligatoirement sur 3 chiffres donc un peu de calcul peut être nécessaire), mais pour PHP déjà ce sera converti en une date, et je ne serais pas surpris que pour MySQL aussi avec une colonne de type date si tu arrives à lui faire manger ces formats.

              -
              Edité par Ymox 17 octobre 2020 à 10:23:12

              • Partager sur Facebook
              • Partager sur Twitter
                17 octobre 2020 à 0:28:46

                j'arrive à rentrer ce format de date

                 

                avec la fonction de mon second post

                et le fait que j'ai reparamétré mon PhpMyAdmin

                dans les entity symfony à part DateTimeInterface il n'existe rien d'autres ?

                ---

                ah oui JJJ définir le jour de l'année ça devient hard 

                -
                Edité par PierreRichard78 17 octobre 2020 à 0:31:02

                • Partager sur Facebook
                • Partager sur Twitter

                la chance sourit aux audacieux

                  17 octobre 2020 à 10:35:03

                  Ce n'est pas phpMyAdmin que tu paramètres, mais MySQL. phpMyAdmin est juste une interface qui permet d'y accéder.

                  Non, Symfony ne propose rien d'autre pour manipuler des dates. Mais tu peux les manipuler comme de simples chaînes de caractères, voire un tableau que Doctrine pourrait enregistrer au format JSON.

                  Pourquoi souhaites-tu à tout prix enregistrer au format DATETIME des choses qui n'en sont pas vraiment ? Et as-tu vraiment besoin de la partie TIME ? Quel est ton besoin ?

                  • Partager sur Facebook
                  • Partager sur Twitter
                    17 octobre 2020 à 11:02:46

                    Je te dis DateTime car je parle de la classe mais oui sinon en MySQL il s'agit d'un type Date.

                    J'ai pensé en faire un tableau de chaînes de caractères mais il n'y aura plus de respect des dates à moins de mettre une couche de conditions.

                    Mon besoin est de pouvoir renseigner une date complète comme incomplète 

                    que me conseillerais-tu de faire ?

                    • Partager sur Facebook
                    • Partager sur Twitter

                    la chance sourit aux audacieux

                      17 octobre 2020 à 11:04:21

                      De toute manière tu vas devoir valider les parties comme l'entiereté de la date selon ce qui est fourni, rien n'est prévu pour ça. En ce qui me concerne, j'enregistrerais un tableau des parties de la date sinon chaque partie séparément dans des propriétés ad-hoc

                      Ton besoin est technique, j'aimerais le besoin client  ;)

                      -
                      Edité par Ymox 17 octobre 2020 à 11:05:14

                      • Partager sur Facebook
                      • Partager sur Twitter
                        17 octobre 2020 à 11:21:15

                        le besoin client est de pouvoir sur le formulaire informer une date entière 2020-10-17 mais aussi juste 2020 ou octobre 2020, même 17/10

                        tant qu'une info sur les 3 est donnée la date est enregistrée.

                        je pensais qu'il y aurait un bundle ou qqch déjà existant.

                        Je dois casser ma bdd, le champ date soit être un tableau ou devenir 3 champs nullables

                        de 0 à 31

                        de 0 à 12

                        de 0 à année actuelle

                        • Partager sur Facebook
                        • Partager sur Twitter

                        la chance sourit aux audacieux

                          17 octobre 2020 à 21:59:11

                          D'accord, donc maintenant, je demande "pour quelle raison faut-il pouvoir saisir une date incomplète" ?

                          • Partager sur Facebook
                          • Partager sur Twitter
                            18 octobre 2020 à 11:07:33

                            Salut

                            Dans le cas, où tu ne connais pas une date complète.

                            Ce topic était de savoir s'il était possible de contrer les fonctions PHP de Date, la réponse est non

                            donc j'ai créé 3 champs jour mois année des integers nullables 

                            année de 0 à l'année actuelle

                            mois de 0 à 12

                            et pour jour, 4 tableaux 0 à 28, à 29, à 30 et à 31

                            et avec de l'ajax en fonction du mois choisi le tableau approprié s'affiche.

                            Maintenant je fais de même pour les années bissextiles

                            Par contre, l'idéal est de mettre année mois jour à l'américaine 

                            car lorsque je choisi un mois, la donnée dans le jour est effacé par le nouveau tableau

                            • Partager sur Facebook
                            • Partager sur Twitter

                            la chance sourit aux audacieux

                              18 octobre 2020 à 11:18:35

                              La date incomplète, elle va servir à faire des calculs d'âge, ou d'autres calculs ? Ceux-ci se doivent d'être précis ?

                              Parce que j'aurais envie de dire que si l'utilisateur ne saisit qu'une année, pour suivant quels calculs, enregistrer le premier janvier n'est pas forcément un problème, pareil pour la saisie d'une année et d'un mois qui deviendrait le premier du mois. Quand à savoir le jour d'un mois mais pas lequel ni l'année, je ne suis pas certain que ce soit super pertinent…

                              -
                              Edité par Ymox 18 octobre 2020 à 11:19:17

                              • Partager sur Facebook
                              • Partager sur Twitter
                                18 octobre 2020 à 20:28:54

                                Salut,

                                non ce n'est pas pour calculer l'âge, c'est juste un complément d'informations mais qui n'est pas forcément total. 

                                l'idée du premier du mois est bien sauf que des gens naissent le premier du mois donc pas bon pour la fonction

                                Je crois qu'au final pas le choix, 3 champs en BDD auxquels après je vais un peu m'embêter à respecter les dates 

                                je classe les mois par nombre de jours. janvier mars mail juillet août octobre décembre = 31 jours

                                avril juin septembre novembre = 30 jours

                                et février = 28 ou 29 

                                avec ajax j'appelle le tableau des jours en fonction du mois sélectionné mais par contre la logique est de faire année mois jour, à l'envers de ce qu'on connait en france

                                • Partager sur Facebook
                                • Partager sur Twitter

                                la chance sourit aux audacieux

                                problème d'acceptation de date incomplète

                                × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                                × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
                                • Editeur
                                • Markdown