verif de validité d'une date: formulaire php

Mammouth du PHP | 843 Messages

26 févr. 2006, 17:13

salut à tous :D

je suis en train de faire un script php qui va me permettre de verifier la validité d'une date inserer dans un champ de formulaire.

pour l'instant je verifie juste le format d'insertion du champs (JJ/MM/AAAA) et aussi si le champs n'est pas vide :wink:

j'ai un soucis avec mon code car si j'entre un date au format valide, j'ai le message suivant:
Un (ou plusieurs) champ(s) obligatoire(s) n'a(ont) pas été correctement rempli(s).
mais pas le message comme quoi le format de la date est invalide :cry:

si par contre je rentre la date dans un format invalide (31-12-2000 par exemple), ça passe sans message d'erreur :cry:

voici le code du formulaire php:
<?php
/**
* Comme il s'agit de XHTML, encadrement de la balise xml pour un affichage
* normal sans message d'erreur de PHP
*/
echo "<?xml version=\"1.0\" encoding=\"iso-8859-1\"?>\n";
?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
     "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html xmlns="http://www.w3.org/1999/xhtml">

<html>

<head>

<title>:: essai date valide ::</title>

<link href="formulaire.css" rel="stylesheet" type="text/css" />


</head>
<body>
<div id="page">
<?php
/**
* On commence par vérifier si le bouton soumettant le formulaire a été
* cliqué, "envoi" étant l'attribut "name" du bouton "submit"
* Sinon, on saute à la ligne 127 de ce code.
*/
if(isset($_POST['envoi']))
{
    /* Récupération des données du formulaire */
    $datenaiss = isset($_POST['datenaiss']) ? trim($_POST['datenaiss']) : "";

    /* Définition de la variable de validation du FORMAT de la date */
    $valid_format_datenaiss = "#(\d{2})/(\d{2})/(\d{4})#";
    /* Définition des variables de verification de la validité de la date */
    $jour = substr($datenaiss, 0, 2);
    $mois = substr($datenaiss, 3, 2);
    $annee = substr($datenaiss, 6, 4);
    /* Traitement de vérification des champs vides ou invalides niveau du format */
    if ($datenaiss == '' || !(preg_match($valid_format_datenaiss,$datenaiss)) || (($datenaiss) && (preg_match($valid_format_datenaiss,$datenaiss)) && (checkdate($mois, $jour, $annee) == false)))
    {
    /* Action à adopter */
?>
                <h3>Informations incomplètes</h3>
                <p>Un (ou plusieurs) champ(s) obligatoire(s) n'a(ont) pas été correctement rempli(s).</p>

<?php
    /* traitement des messages d erreur */

/* Si le champ datenaiss est vide, */
         if(!$datenaiss)
         {
            print "<p>Vous avez omis de mentionner votre date de naissance</p>\n";
         }
/* Si il y a une date inscrite mais au format invalide */
         if(($datenaiss) && !(preg_match($valid_format_datenaiss, $datenaiss)))
         {
            print "<p>Le format de la date de naissance saisie est invalide !</p>\n";
         }
/* Si il y a une date inscrite mais invalide */
         if (($datenaiss) && (preg_match($valid_format_datenaiss,$datenaiss)) && (checkdate($mois, $jour, $annee) == false))
         {
            print "<p>La date de naissance saisie est invalide !</p>\n";
         }

        /**
         * Si les vérifications ont généré des erreurs, affichage du formulaire
         * contenant les données déjà saisies.
         */
?>
<form action="<?php echo($_SERVER['PHP_SELF']); ?>" method="post">
  <fieldset><legend><b>:: Donn&eacute;es personnelles ::</b></legend>
  <label><span class="legende_elmt">Votre date de naissance : </span><input type="text" name="datenaiss" maxlength="10" class="cases" value="<?php echo $datenaiss ?>" /></label><br />
  <div class="c3">
  <input type="submit" class="verif" name="envoi" value="Envoyer" />&nbsp;<input type="reset" class="verif" value="Recommencer" />
  </div>
  </fieldset>
</form>
<?php
    }
    else
    {
        /**
         * Si aucun des champs obligatoire n'est vide et les données sont valides:
         * Traitement des données
         */
        // Affichage du message final des informations reçues
        print "<h3>Merci ! Voici les informations que vous avez fournies</h3>\n";
      print "<p>votre date de naissance valide est $datenaiss</p>";
    }
}
/**
* Si cette page s'ouvre pour la première fois sans que le bouton soumettant le formulaire n'ait
* été cliqué, alors on affiche le formulaire normalement
*/
else
{
?>
<h3>Complétez les informations pour ajouter votre nom à la liste des membres</h3>
<p>Notez que les champs précédés d'une <span class="c1">*</span> doivent obligatoirement être remplis.</p>
<form action="<?php echo($_SERVER['PHP_SELF']); ?>" method="post">
  <fieldset><legend><b>:: Donn&eacute;es personnelles ::</b></legend>
  <label><span class="legende_elmt">Votre date de naissance : </span><input type="text" name="datenaiss" maxlength="10" class="cases" value="" /></label><br />
  <div class="c3">
  <input type="submit" class="verif" name="envoi" value="Envoyer" />&nbsp;<input type="reset" class="verif" value="Recommencer" />
  </div>
  </fieldset>
</form>
<?php
}
?>
</div>
</body>
</html>
si quelqu'un peut m'aider car je ne voit pas d'où vient le problème :?
Modifié en dernier par BeRoots le 27 févr. 2006, 00:27, modifié 4 fois.
:: contactez moi par MP ::
:non: NON au language SMS sur les forums :non:

ViPHP
ViPHP | 1380 Messages

26 févr. 2006, 17:28

// remplacer
    if ($datenaiss == '' || (preg_match($valid_format_datenaiss,$datenaiss)))

// par 
    if ($datenaiss == '' || (!preg_match($valid_format_datenaiss,$datenaiss)))
ripat

Mammouth du PHP | 843 Messages

26 févr. 2006, 21:53

ok merci j'avais pas vue 8)

pour ne pas trop surcharger le sujet je vait rééditer le code de mon premier post :wink:

j'ai fait pas mal de rajout pour qu'on ai une verification complete de la date.

mais maintenant j'ai un message d'erreur:
Parse error: parse error in c:\program files\easyphp1-8\www\chart_php2\admin\form_test_datevalid2.php on line 152
la derniere ligne de ce code est la 151 :?

cela fait quelque heure dejà que je m'arrache les cheveux à trouver l'erreur mais pas moyen :cry:

si quelqu'un y voit plus claire que moi :wink:

merci d'avance ;)
:: contactez moi par MP ::
:non: NON au language SMS sur les forums :non:

Mammouth du PHP | 19672 Messages

26 févr. 2006, 22:01

Erreur classique : une accolade fermante oubliée ligne 128 juste avant le else.
Codez en pensant que celui qui maintiendra votre code est un psychopathe qui connait votre adresse :axe:

Mammouth du PHP | 843 Messages

26 févr. 2006, 22:47

en faite il s'agissait bien d'une acolade mais en fin de boucle "bissextile" :wink:

Enfin aucun message d'erreur maintenant :)

passons donc aux choses serieuse :P

mon nouveau problème est que j'ai mon message d'erreur via un print (celui du cas n°1) qui ce fait dans toutes les situations possibles :cry:

je pense que ça vient de ma façon de faire pour regarder si chaques variables $jour $mois et $année sont comprise dans les intervales correspondant, stipuler dans les variables $verif_jour, $verif_mois, et $verif_annee...
if ($jour != $verif_jour || $mois != $verif_mois || $annee != $verif_annee)
voyez vous une autre alternative à cette condition?

merci d'avance :wink:
:: contactez moi par MP ::
:non: NON au language SMS sur les forums :non:

Mammouth du PHP | 19672 Messages

26 févr. 2006, 23:06

Pour valider une date en PHp, il y a infiniment plus simple : checkdate()
Codez en pensant que celui qui maintiendra votre code est un psychopathe qui connait votre adresse :axe:

Mammouth du PHP | 843 Messages

26 févr. 2006, 23:49

quand tu dit infiniment plus simple, c'est bien vrai :wink:

j'ai re-re-re-éditer mon code dans le premier message :lol:

par contre je suit obliger de faire comme suit pour eviter un message d'erreur de php si l'utilisateur mais des lettre dans la date (ex: gg/dd/zzzz) :cry:
    @$valid_date = checkdate($mois, $jour, $annee);
sinon tout à l'air de fonctionner.

puis je faire autrement pour eviter l'utilisation de @ ?
:: contactez moi par MP ::
:non: NON au language SMS sur les forums :non:

Mammouth du PHP | 19672 Messages

26 févr. 2006, 23:58

Tu aurais une autre méthode: utiliser le même masque PCRE pour valider ta date avec preg_match sans utiliser checkdate :
<?php
//...
$chaine_date = $jour ."/". $mois ."/". $annee;
if(!preg_match($valide_format_datenaiss, chaine_date))
{
    //... etc...
}
//...
?>
Comme le masque est bon pour une date de naissance, il est tout aussi bon pour n'importe quelle date.
Codez en pensant que celui qui maintiendra votre code est un psychopathe qui connait votre adresse :axe:

Mammouth du PHP | 19672 Messages

27 févr. 2006, 00:01

quoique j'ai dit une connerie: tu peux utiliser checkdate, mais après avoir validé le format avec preg_match...
Codez en pensant que celui qui maintiendra votre code est un psychopathe qui connait votre adresse :axe:

Mammouth du PHP | 843 Messages

27 févr. 2006, 00:24

bon je re-re-re-re-re-edite encore le code du premier post :lol:

comme ça j'ai plus de problème aparament :k

quand pense tu?
:: contactez moi par MP ::
:non: NON au language SMS sur les forums :non:

Mammouth du PHP | 19672 Messages

27 févr. 2006, 00:35

ça a de l'allure :)

Si ça fonctione à ton goût, c'est tout ce qui importe, il te reste à mettre [Résolu] ;)
Codez en pensant que celui qui maintiendra votre code est un psychopathe qui connait votre adresse :axe:

Mammouth du PHP | 843 Messages

27 févr. 2006, 00:43

une p'tite question avant de fermer le sujet:

est ce que ce formulaire est bien protegé contre les injections?
:: contactez moi par MP ::
:non: NON au language SMS sur les forums :non:

Mammouth du PHP | 19672 Messages

27 févr. 2006, 10:46

Un formulaire en soi ne risque strictement rien d'une injection: on parle d'injection SQL quand des données sont envoyées sans certaines précautions vers un serveur de base de données et que certaines informations écrites d'une certaine manière peuvent modifier considérablement le résultat de la requête au point de permettre un accès admin à la base à un internaute.

Pour l'instant, ton code ne comporte aucune commande SQL, donc la porte est toujours fermée.
Codez en pensant que celui qui maintiendra votre code est un psychopathe qui connait votre adresse :axe:

Mammouth du PHP | 843 Messages

27 févr. 2006, 15:31

Merci Cyrano pour ton aide et tes conseils :wink:

tout fonctionne à merveille donc je ferme le sujet

++
:: contactez moi par MP ::
:non: NON au language SMS sur les forums :non: