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 :

preg_match , checkdate et champ date


Sujet :

Langage PHP

  1. #21
    Membre éprouvé Avatar de redoran
    Homme Profil pro
    Développeur-Amateur
    Inscrit en
    Juin 2010
    Messages
    1 346
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : Algérie

    Informations professionnelles :
    Activité : Développeur-Amateur
    Secteur : Santé

    Informations forums :
    Inscription : Juin 2010
    Messages : 1 346
    Points : 1 031
    Points
    1 031
    Par défaut
    j'ai un peut travailler le code mais apparemment j'arrive pas a contrôlé le champs (M: 00-01) au dessous du champ date
    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
     
    if (isset($_POST['validform'])) 
    	{
    		// On vérifie que les élément sont valides
    		if ( empty($_POST['datedec']) || !preg_match('#^([0-9]{2})/([0-9]{2})/([0-9]{4})$#', $_POST['datedec']))
    			{
    				$erreurs_msg['datevide'] = 'Veuillez saisir une date valide SVP.';
    			}
    		elseif ( preg_match('#^([0-9]{2})/([0-9]{2})/([0-9]{4})$#', $_POST['datedec']))
    			{
    				list($j,$m,$y)=explode("/",$_POST['datedec']);
     
    				if (!checkdate ($m,$j,$y))
    					{
    					$erreurs_msg['daterron'] = 'Date non valide.';	
    					exit;
    					}
     
    			} 
     
     
    // j'arrive pas a accédé a ce contrôle////
     
    elseif ((empty($_POST['m'])) or (!is_numeric($_POST['m'])))
    			{
    			$erreurs_msg['m'] = 'Veuillez saisir un nombre dans la case M: 00-01 SVP.';
    			}

  2. #22
    Expert éminent sénior

    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    7 920
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 7 920
    Points : 10 726
    Points
    10 726
    Par défaut
    si je te dis d'utiliser Intl ou date_create_from_format c'est pas pour rien ...

  3. #23
    Membre éprouvé Avatar de redoran
    Homme Profil pro
    Développeur-Amateur
    Inscrit en
    Juin 2010
    Messages
    1 346
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : Algérie

    Informations professionnelles :
    Activité : Développeur-Amateur
    Secteur : Santé

    Informations forums :
    Inscription : Juin 2010
    Messages : 1 346
    Points : 1 031
    Points
    1 031
    Par défaut
    Salam ; stealth35 j'ai essayé avec DateTime::createFromFormat()
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    if($_POST['datedec']!="")
    {
    $date2=DateTime::createFromFormat('j-m-Y',$_POST['datedec']);
    $date2->format('j/m/Y');
    echo $date2;
    }
    else
    {
    $date2 = NULL;
    echo "date non valide";
    }
    voila le code de mon teste apparemment sa marche pas !!! et je me demande comment sa peut contrôlé la validité d'une date sauf erreur de ma part.

  4. #24
    Expert éminent sénior

    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    7 920
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 7 920
    Points : 10 726
    Points
    10 726
    Par défaut
    ton format à la base c'est j/m/Y pas j-m-Y

  5. #25
    Modérateur
    Avatar de grunk
    Homme Profil pro
    Lead dév - Architecte
    Inscrit en
    Août 2003
    Messages
    6 691
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Lead dév - Architecte
    Secteur : Industrie

    Informations forums :
    Inscription : Août 2003
    Messages : 6 691
    Points : 20 222
    Points
    20 222
    Par défaut
    Citation Envoyé par stealth35 Voir le message
    ton format, JJ/MM/AAAA est un format non standard, le format (français) est JJ/MM/AA, si t'as l'extension Intl pas de problème, sinon oublie et fait un format plus standard AAAA-MM-JJ
    Et tu le tiens d'où ton standard ? Le seul vrai standard c'est la norme ISO 8601 qui préconise le format yyyy-mm-dd.

    Ensuite il est convenu que la date en france peut s'écrire dd/mm/yyyy ou dd/mm/yy mais si tu as des documents officiel sur l'utilisation de 2 digits pour l'année je suis preneur.

    J'ai une préférence pour l'année à 4 digit.

    J'aurais faitu n truc comme ça pour tester les date au format français (2ou 4 digit pour l'année) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    function checkMyDate($date)
    {
    	if(preg_match('`^\d{1,2}/\d{1,2}/(\d{4}|\d{2})$`',$date ))
    	{
    		list($d,$m,$y) = explode('/',$date);
    		return checkdate($m,$d,$y);	
    	}
    	return false;
    }
    Pry Framework php5 | N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  6. #26
    Membre éprouvé Avatar de redoran
    Homme Profil pro
    Développeur-Amateur
    Inscrit en
    Juin 2010
    Messages
    1 346
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : Algérie

    Informations professionnelles :
    Activité : Développeur-Amateur
    Secteur : Santé

    Informations forums :
    Inscription : Juin 2010
    Messages : 1 346
    Points : 1 031
    Points
    1 031
    Par défaut
    ton format à la base c'est j/m/Y pas j-m-Y
    ta proposition ne mache pas faut respecté le format j-m-y.
    je crois que je vais retourné sur mon code parce que je voi pas comment le DateTime::createFromFormat() va contrôlé la validité de la date

  7. #27
    Expert éminent sénior

    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    7 920
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 7 920
    Points : 10 726
    Points
    10 726
    Par défaut
    Citation Envoyé par grunk Voir le message
    Et tu le tiens d'où ton standard ? Le seul vrai standard c'est la norme ISO 8601 qui préconise le format yyyy-mm-dd.

    Ensuite il est convenu que la date en france peut s'écrire dd/mm/yyyy ou dd/mm/yy mais si tu as des documents officiel sur l'utilisation de 2 digits pour l'année je suis preneur.

    J'ai une préférence pour l'année à 4 digit.

    J'aurais faitu n truc comme ça pour tester les date au format français (2ou 4 digit pour l'année) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    function checkMyDate($date)
    {
    	if(preg_match('`^\d{1,2}/\d{1,2}/(\d{4}|\d{2})$`',$date ))
    	{
    		list($d,$m,$y) = explode('/',$date);
    		return checkdate($m,$d,$y);	
    	}
    	return false;
    }
    c'est le format standard Unicode, (donc ICU), avant on écrivait 21/05/98 (et pas 21/05/1998), le format à été sans doute choisie à cette période

    attention pour les regex faut pas utiliser l'opérateur d’exécution

  8. #28
    Expert éminent sénior

    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    7 920
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 7 920
    Points : 10 726
    Points
    10 726
    Par défaut
    Citation Envoyé par redoran Voir le message
    ta proposition ne mache pas faut respecté le format j-m-y.
    je crois que je vais retourné sur mon code parce que je voi pas comment le DateTime::createFromFormat() va contrôlé la validité de la date
    si le format format n'est pas bon il retourne false, en tout cas je te conseil d'apprendre les base de PHP avec te lancé dans un projet, et surtout de cherché dans le forum, puisque c'est un sujet traité de nombreuse fois

  9. #29
    Modérateur
    Avatar de grunk
    Homme Profil pro
    Lead dév - Architecte
    Inscrit en
    Août 2003
    Messages
    6 691
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Lead dév - Architecte
    Secteur : Industrie

    Informations forums :
    Inscription : Août 2003
    Messages : 6 691
    Points : 20 222
    Points
    20 222
    Par défaut
    Citation Envoyé par redoran Voir le message
    ta proposition ne mache pas faut respecté le format j-m-y.
    Effectivement faut peut être remplacé les / par des - ...

    Citation Envoyé par stealth35 Voir le message
    c'est le format standard Unicode, (donc ICU), avant on écrivait 21/05/98 (et pas 21/05/1998), le format à été sans doute choisie à cette période
    ok, pour ceux que ça intéresse : http://www.localeplanet.com/icu/fr-FR/index.html

    Par contre utiliser intl si le site n'est pas multi langue me semble un peu "compliqué" non ?
    Pry Framework php5 | N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  10. #30
    Expert éminent sénior

    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    7 920
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 7 920
    Points : 10 726
    Points
    10 726
    Par défaut
    Citation Envoyé par grunk Voir le message
    Par contre utiliser intl si le site n'est pas multi langue me semble un peu "compliqué" non ?
    oui et non, je pense que c'est une bon habitude d’utiliser ce genre de chose, c'est pareil pour les format de nombre ou de monnaie

    en mode non strict on peux utiliser plusieurs format

  11. #31
    Membre éprouvé Avatar de redoran
    Homme Profil pro
    Développeur-Amateur
    Inscrit en
    Juin 2010
    Messages
    1 346
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : Algérie

    Informations professionnelles :
    Activité : Développeur-Amateur
    Secteur : Santé

    Informations forums :
    Inscription : Juin 2010
    Messages : 1 346
    Points : 1 031
    Points
    1 031
    Par défaut
    Salam ;grunk
    Citation:
    Envoyé par redoran Voir le message
    ta proposition ne marche pas faut respecté le format j-m-y.
    Effectivement faut peut être remplacé les / par des - ...
    selon la doc oui +1
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    $date = date_create_from_format('j/m/Y', '15/02/2009');
    echo date_format($date, 'd/m/Y');
     
    // aussi sa marche avec code ci-dessous
     
    $date = date_create_from_format('j/m/Y', '15/02/2009');
    echo date_format($date, 'd-m-Y');
     
    // sa marche pas ici (on a un warning)
     
    $date = date_create_from_format('j/m/Y', '15-02-2009');
    echo date_format($date, 'd-m-Y');
    donc en résumé l'erreur était dans le signe de séparation (- ou /) de la date.
    alors si en remplace la date par une $_POST[datedec'] on doit avant contrôlé le format non... stealth35

    stealth35:
    en tout cas je te conseil d'apprendre les base de PHP avec te lancé dans un projet, et surtout de cherché dans le forum, puisque c'est un sujet traité de nombreuse fois
    ; merci pour le conseil c'est très encourageant de votre part
    stealth35 je crois que mon problème avec mon code c'est un problème de structuration du if...elseif....

  12. #32
    Membre éprouvé Avatar de redoran
    Homme Profil pro
    Développeur-Amateur
    Inscrit en
    Juin 2010
    Messages
    1 346
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : Algérie

    Informations professionnelles :
    Activité : Développeur-Amateur
    Secteur : Santé

    Informations forums :
    Inscription : Juin 2010
    Messages : 1 346
    Points : 1 031
    Points
    1 031
    Par défaut
    Re; stealth35:
    selon la doc php http://www.php.net/manual/fr/datetim...fromformat.php
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    $date = date_create_from_format('j/m/Y', '29/02/2007');
    echo date_format($date, 'd/m/Y');
    ce code affiche 01/03/2007 lors du contrôle avec une date 29/02/2007
    sauf ignorance de ma part faut ajouter d'autre contrôles!!! sinon est ce que ta un exemple concret avec cette methode.

  13. #33
    Expert éminent sénior

    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    7 920
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 7 920
    Points : 10 726
    Points
    10 726
    Par défaut
    c'est pas un problème, la date final est correct

  14. #34
    Membre éprouvé Avatar de redoran
    Homme Profil pro
    Développeur-Amateur
    Inscrit en
    Juin 2010
    Messages
    1 346
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : Algérie

    Informations professionnelles :
    Activité : Développeur-Amateur
    Secteur : Santé

    Informations forums :
    Inscription : Juin 2010
    Messages : 1 346
    Points : 1 031
    Points
    1 031
    Par défaut
    stealth35
    c'est pas un problème, la date final est correct
    là le 30/02/2007 sa n'existe pas en 2007 , c'est le 01/03/2007 donc théoriquement la date n'est pas valide et je ne sais comment le système (appache !!!) attribue cette valeur a la place du 30/02/2007. peut être que les plus initier peuvent nous éclaircirent sur le sujet.
    entre autre je remercie celira , Bovino , grunk et toi même stealth36 pour votre patience dans le post.
    j'ai un secret et ne le dite a personne , je crois que je suis sur la piste du trésor perdu une fois arrivé je vous envoi le tuyau.
    aller je vous donne un indice:
    le secret est dans
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     ...!checkdate($date[2], $date[1], $date[3])...
    la patience vient à bout de tout

  15. #35
    Expert éminent sénior

    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    7 920
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 7 920
    Points : 10 726
    Points
    10 726
    Par défaut
    Citation Envoyé par redoran Voir le message
    stealth35 là le 30/02/2007 sa n'existe pas en 2007 , c'est le 01/03/2007 donc théoriquement la date n'est pas valide et je ne sais comment le système (appache !!!) attribue cette valeur a la place du 30/02/2007. peut être que les plus initier peuvent nous éclaircirent sur le sujet.
    tu la rends valide avec le DateTime ...

  16. #36
    Membre éprouvé Avatar de redoran
    Homme Profil pro
    Développeur-Amateur
    Inscrit en
    Juin 2010
    Messages
    1 346
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : Algérie

    Informations professionnelles :
    Activité : Développeur-Amateur
    Secteur : Santé

    Informations forums :
    Inscription : Juin 2010
    Messages : 1 346
    Points : 1 031
    Points
    1 031
    Par défaut
    Salam :
    je crois que mon problème avec mon code c'est un problème de structuration du if...elseif....
    effectivement c'était ça.
    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
     
    ....
    if (isset($_POST['validform'])) 
    	{
    		// On vérifie que les élément sont valides
     
    		if ( empty($_POST['com']) || ($_POST['com']=="Choisissez..."))
    			{
    			$erreurs_msg['com'] = 'Veuillez choisir une commune SVP.';
    			}
    		elseif ( empty($_POST['datedec']) || !preg_match('#^([0-9]{2})/([0-9]{2})/([0-9]{4})$#', $_POST['datedec']))
    			{
    			$erreurs_msg['datevide'] = 'Veuillez saisir une date valide SVP.';
    			}
    		elseif (preg_match("#^([0-9]{2})/([0-9]{2})/([0-9]{4})$#", $_POST['datedec'],$date) && !checkdate($date[2], $date[1], $date[3])) 
    			{
    			$erreurs_msg['daterron'] = 'Date non valide.';	
    			}
    .....
    voila la mouture d'une semaine de travail ( bien sur d'un débutant en php) , je suis preneur de toute autre solution sinon une optimisation de ce code.

  17. #37
    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
    Bonjour,

    Voilà une fonction tirée d'une classe Date utilisée pour vérifier la validité d'une date :
    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
       /**
        * Jours et mois codés sur 2 digits et le reste pour l'année
        * Les différentes parties de la date peuvent être séparées par n'importe quel glyph non numérique #-/a[espace]
        * ATTENTION : une date comme '501231' sera interprétée comme le 31 décembre de l'an 50 !
        * @param string $p Date au format YMMDD
        * @return bool
        */
       static public function isDate($p)
       {
          $date = preg_replace('/[^\d]/u', '', $p);
          if (strlen($date) > 4) {
             $d = substr($date, -2, 2);
             $m = substr($date, -4, 2);
             $y = substr($date, 0, -4);
             // année au-delà des limites pour checkdate()
             if ($y > 32767) {
                // on remplace l'année par 2000 pour une année bissextile et par 2001 pour le reste
                // est bissextile : siecle -> ssi multiple de 400 - sinon ssi multiple de 4
                $is_leap = ($y % 100) ? (($y % 4) === 0) : (($y % 400) === 0);
                $y = ($is_leap) ? 2000 : 2001;
             }
             return checkdate($m, $d, $y);
          }
          return false;
       }
    Le mieux c'est quand même de manipuler toutes les dates au format YYYYMMDD. A t'en inspirer.

Discussions similaires

  1. formater un champ date dans un select
    Par sbeu dans le forum MS SQL Server
    Réponses: 4
    Dernier message: 24/04/2006, 16h44
  2. Champ Date à '01/01/0001' -> Pb conversion de variant !!!
    Par AnnSo dans le forum Bases de données
    Réponses: 6
    Dernier message: 04/06/2004, 16h54
  3. récuperer année d'un champ date
    Par tomm dans le forum Bases de données
    Réponses: 11
    Dernier message: 12/05/2004, 16h24
  4. [CR] Problème de sélection sur un champ date
    Par noluc dans le forum SAP Crystal Reports
    Réponses: 2
    Dernier message: 21/11/2003, 16h56
  5. procedure stockée champ date
    Par tripper.dim dans le forum SQL
    Réponses: 5
    Dernier message: 25/04/2003, 09h47

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