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 :

Utilisation de checkdate


Sujet :

Langage PHP

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Février 2008
    Messages
    314
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 314
    Points : 118
    Points
    118
    Par défaut Utilisation de checkdate
    J'essaie d'utiliser checkdate sous la forme
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    if (checkdate(substr($POST['DateDebut'], 2, 2), substr($POST['DateDebut'], 0, 2), substr($POST['DateDebut'], 4, 4))) {
    Je le triture dans tous les sens, mais j'ai toujours l'erreur: Warning: checkdate() expects parameter 1 to be long

  2. #2
    Membre éclairé Avatar de Geoffrey74
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mars 2007
    Messages
    515
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mars 2007
    Messages : 515
    Points : 760
    Points
    760
    Par défaut
    Bonjour,

    de quel type sont les données dans le tableau $POST ?

  3. #3
    Membre régulier
    Profil pro
    Inscrit en
    Février 2008
    Messages
    314
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 314
    Points : 118
    Points
    118
    Par défaut
    VARCHAR, C'est l'utilisateur qui rentre lui-même la date. on peut y trouver tout type de caractère.

  4. #4
    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
    Ah ben ça, je ne connaissais pas checkdate (pourtant c'est pas récent comme fonction). Comme quoi on en apprend tous les jours...

    Fais-tu une validation du format reçu avant de faire cette validation ? Par exemple, si tu attends une date au format jj/mm/aaaa, vérifie que c'est bien ce format que tu reçois avant de valider que c'est bien une date correcte.

    Ensuite, debug avec quelques var_dump pour vérifier que les offsets de substr sont bien placés

    Sinon, en alternative, tu peux utiliser la fonction proposée en commentaire, qui fait les deux vérifications en une seule fonction :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    function validateDate($date, $format = 'Y-m-d H:i:s')
    {
        $d = DateTime::createFromFormat($format, $date);
        return $d && $d->format($format) == $date;
    }
    Modératrice PHP
    Aucun navigateur ne propose d'extension boule-de-cristal : postez votre code et vos messages d'erreurs. (Rappel : "ça ne marche pas" n'est pas un message d'erreur)
    Cherchez un peu avant poser votre question : Cours et Tutoriels PHP - FAQ PHP - PDO une soupe et au lit !.

    Affichez votre code en couleurs : [CODE=php][/CODE] (bouton # de l'éditeur) et [C=php][/C]

  5. #5
    Membre régulier
    Profil pro
    Inscrit en
    Février 2008
    Messages
    314
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 314
    Points : 118
    Points
    118
    Par défaut
    J'attends 8 caractères sous la forme JJMMAAAA.

    Mon idée en utilisant checkdate, c'est de me dire que soit elle correspond à une date valide est le résultat est true, soit elle ne correspond pas et c'est false.

    Exemple: 31012016 = true, dgheurxf = false

  6. #6
    Membre éclairé Avatar de Geoffrey74
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mars 2007
    Messages
    515
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mars 2007
    Messages : 515
    Points : 760
    Points
    760
    Par défaut
    Pense à transtyper tes données, car checkdate à besoin de int et non de varchar.

  7. #7
    Membre régulier
    Profil pro
    Inscrit en
    Février 2008
    Messages
    314
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 314
    Points : 118
    Points
    118
    Par défaut
    Celira par sa remarque, m'a attiré l'attention sur le transtypage, aussi je teste si mon résultat est numérique, et cela maintenant fonctionne

    Merci à Vous 2

    Résolut

  8. #8
    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
    Tester que c'est numérique, c'est bien. Mais que va-t-il se passer si ton utilisateur rentre "4" ou "01010101010101" ?
    Donc il faut que tu fasses une vérification du format avant, par exemple par une regex :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    if (preg_match('#([0-9]{8})#', $POST['DateDebut'])) {
        // format OK, on continue
        if (checkdate(substr($POST['DateDebut'], 2, 2), substr($POST['DateDebut'], 0, 2), substr($POST['DateDebut'], 4, 4))) {
            // date OK
        } else {
            // ceci n'est pas une date
        }
    } else {
        // format incorrect
    }
    Ou alors tu laisses tomber checkdate et tu utilises la fonction que je t'ai donné :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    if (validateDate($POST['DateDebut'], 'dmY')) {
        // date OK
    }
    Modératrice PHP
    Aucun navigateur ne propose d'extension boule-de-cristal : postez votre code et vos messages d'erreurs. (Rappel : "ça ne marche pas" n'est pas un message d'erreur)
    Cherchez un peu avant poser votre question : Cours et Tutoriels PHP - FAQ PHP - PDO une soupe et au lit !.

    Affichez votre code en couleurs : [CODE=php][/CODE] (bouton # de l'éditeur) et [C=php][/C]

  9. #9
    Membre régulier
    Profil pro
    Inscrit en
    Février 2008
    Messages
    314
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 314
    Points : 118
    Points
    118
    Par défaut
    ! Très intéressant. Je retiens et test le tout et vous donne le résultat demain matin.

    Cordialement.

  10. #10
    Membre régulier
    Profil pro
    Inscrit en
    Février 2008
    Messages
    314
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 314
    Points : 118
    Points
    118
    Par défaut
    Bonjour,

    J'ai inclus la fonction comme conseillée:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    	function validateDate_($DateDebut, $format = 'dmY') {
    			 $Resultat = DateTime::createFromFormat($format, $DateDebut);
    			 return $Resultat && $Resultat->format($format) == $DateDebut; }
    J'ai testé nombre de possibilités fausses, puis vraies, le résultat correspond à mon attente.

    ! Un grand merci.

  11. #11
    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
    Ben, c'est une fonction "maison", donc il faut que tu la définisses quelque part dans ton script (ou dans un autre fichier que tu inclus) une seule fois. Et ensuite tu t'en sers comme d'une fonction native.

    Les fonctions définies par l'utilisateur
    PHP : Le tutoriel pour grands débutants pressés - Les fonctions
    Modératrice PHP
    Aucun navigateur ne propose d'extension boule-de-cristal : postez votre code et vos messages d'erreurs. (Rappel : "ça ne marche pas" n'est pas un message d'erreur)
    Cherchez un peu avant poser votre question : Cours et Tutoriels PHP - FAQ PHP - PDO une soupe et au lit !.

    Affichez votre code en couleurs : [CODE=php][/CODE] (bouton # de l'éditeur) et [C=php][/C]

  12. #12
    Membre régulier
    Profil pro
    Inscrit en
    Février 2008
    Messages
    314
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 314
    Points : 118
    Points
    118
    Par défaut
    Bonjour,

    J'ai inclus la fonction comme conseillée:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    	function validateDate_($DateDebut, $format = 'dmY') {
    			 $Resultat = DateTime::createFromFormat($format, $DateDebut);
    			 return $Resultat && $Resultat->format($format) == $DateDebut; }
    J'ai testé nombre de possibilités fausses, puis vraies, le résultat correspond à mon attente.

    ! Un grand merci.

  13. #13
    Membre régulier
    Profil pro
    Inscrit en
    Février 2008
    Messages
    314
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 314
    Points : 118
    Points
    118
    Par défaut
    J'ai appliqué cette même procédure de contrôle à l'heure de début et de fin.

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

Discussions similaires

  1. utiliser les tag [MFC] [Win32] [.NET] [C++/CLI]
    Par hiko-seijuro dans le forum Visual C++
    Réponses: 8
    Dernier message: 08/06/2005, 15h57
  2. Réponses: 4
    Dernier message: 05/06/2002, 14h35
  3. utilisation du meta type ANY
    Par Anonymous dans le forum CORBA
    Réponses: 1
    Dernier message: 15/04/2002, 12h36
  4. [BCB5] Utilisation des Ressources (.res)
    Par Vince78 dans le forum C++Builder
    Réponses: 2
    Dernier message: 04/04/2002, 16h01
  5. Réponses: 2
    Dernier message: 20/03/2002, 23h01

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