verif de champs obligatoire d'un formulaire

Mammouth du PHP | 843 Messages

25 févr. 2006, 18:27

j'ai essaye mais ça marche pas :cry:

j'ai inscrit la date 35/02/2000 et ça passe quand même :?

vu que je me suis inspirer de ton formulaire, je verifie chaque condition avec php pour voir si il n'y a pas de champs vide ou invalide. sinon on affiche un message d'erreur en print pour l'utilisateur.

n'est il pas possible de recuperer la valeur du JS dans une variable afin de pouvoir afficher un message d'erreur au cas où la date est invalide?
:: contactez moi par MP ::
:non: NON au language SMS sur les forums :non:

Mammouth du PHP | 19672 Messages

25 févr. 2006, 18:49

Fais donc voir le code que tu as fait, il y a sûrement une boulette et si ça passe quand même, c'est que le JavaScript ne fonctionne pas et ne retourne rien du tout, ni true ni false mais une erreur qu'on pourrait voir en console JavaScript.
Codez en pensant que celui qui maintiendra votre code est un psychopathe qui connait votre adresse :axe:

Mammouth du PHP | 843 Messages

25 févr. 2006, 19:10

ooops j'ai envoyer en bouble :x
j'efface pour gagner en place :wink:
Modifié en dernier par BeRoots le 25 févr. 2006, 19:15, modifié 1 fois.
:: contactez moi par MP ::
:non: NON au language SMS sur les forums :non:

Mammouth du PHP | 843 Messages

25 févr. 2006, 19:12

ok mais sa risque d'etre un peu lourd :oops:
<!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>:: Formulaire d'inscription ::</title>

<script language="javascript" type="text/javascript" src="date_valid.js"></script>

<link href="css/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 220 de ce code.
*/
if(isset($_POST['envoi']))
{
    /* Récupération des données du formulaire */
    $pseudo    = isset($_POST['pseudo'])    ? trim($_POST['pseudo'])    : "";
    $pass      = isset($_POST['pass'])      ? trim($_POST['pass'])      : "";
    $passverif = isset($_POST['passverif']) ? trim($_POST['passverif']) : "";
    $prenom    = isset($_POST['prenom'])    ? trim($_POST['prenom'])    : "";
    $nom       = isset($_POST['nom'])       ? trim($_POST['nom'])       : "";
    $phone     = isset($_POST['phone'])     ? trim($_POST['phone'])     : "";
    $email     = isset($_POST['email'])     ? trim($_POST['email'])     : "";
    $postal    = isset($_POST['postal'])    ? trim($_POST['postal'])    : "";
    $ville     = isset($_POST['ville'])     ? trim($_POST['ville'])     : "";
    $datenaiss = isset($_POST['datenaiss']) ? trim($_POST['datenaiss']) : "";



    /**
     * Définition des variables servant au traitement de l'adresse électronique et du numéro de
     * téléphone: on utilise ici des expressions régulières.
     */
    $valid_mail = "#^[^-_\.][a-z0-9-_\.]+[^-_\.]@[^-_\.][a-z0-9-_\.]+[^-_\.]\.[a-z]{2,4}$#";
    $valid_phone = "#^\d{10}$#";
    $valid_postal = "#^\d{5}$#";
    $valid_datenaiss = "#(\d{2})/(\d{2})/(\d{4})#";
    /**
     * Traitement de vérification des champs vides ou invalides (téléphone et/ou email)
     * Conditions de mauvaises réponses (champ vide par exemple)
     */
    if ($pseudo == '' || $pass == '' || $passverif == '' || $prenom == '' || $nom == '' || $email == '' || $phone == '' || $postal == '' || $ville == '' || $datenaiss == '' || !(preg_match($valid_phone,$phone)) || $email == '' || !(preg_match($valid_mail, $email)) || !(preg_match($valid_postal, $postal)) || !(preg_match($valid_datenaiss,$datenaiss)))
    {
        /* 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
        if ($pseudo == '')
        {
            /* Si le champ pseudo est vide, */
            print "<p>Vous n'avez pas précisé votre pseudo</p>\n";
        }
        if ($pass == '')
        {
            /* Si le champ pass est vide, */
            print "<p>Vous n'avez pas précisé votre mot de pass</p>\n";
        }
        if ($passverif == '')
        {
            /* Si le champ pass est vide, */
            print "<p>Vous n'avez pas reprécisé votre mot de pass</p>\n";
        }
        if ($passverif != $pass)
        {
            /* Si le champ pass et passverif sont different */
            print "<p>Veuillez repréciser votre mot de pass !</p>\n";
        }
        if ($prenom == '')
        {
            /* Si le champ prenom est vide, */
            print "<p>Vous n'avez pas précisé votre prénom</p>\n";
        }
        if ($nom == '')
        {
            /* Si le champ nom est vide, */
            print "<p>Vous n'avez pas précisé votre nom</p>\n";
        }
        if ($phone == '')
        {
            /* Si le champ phone est vide, */
            print "<p>Vous n'avez pas précisé votre numéro de téléphone</p>\n";
        }
        if (($phone) && !(preg_match($valid_phone,$phone)))
        {
            print "<p>Le numéro de téléphone doit comporter seulement des chiffres, de 6 à 10 chiffres sans espaces ni tirets !</p>\n";
        }
        if(!$email)
        {
            /* Si le champ email est vide, */
            print "<p>Vous avez omis de mentionner une adresse électronique</p>\n";
        }
        if(($email) && !(preg_match($valid_mail, $email))) /* Si il y a une adresse inscrite mais invalide */
        {
            /* On vérifie LES DEUX conditions réunies (avec le sugne "&&"): si on ne vérifie que la validité, en ne
            mettant pas d'adresse dans le formulaire, on obtient l'affichage des deux messages, or l'adresse à
            ce moment là n'est pas invalide, elle est absente: le message d'invalidité ne s'applique donc pas. */
            print "<p>L'adresse électronique saisie est invalide !</p>\n";
        }
        if(!$postal)
        {
            /* Si le champ email est vide, */
            print "<p>Vous avez omis de mentionner votre code postal</p>\n";
        }
        if(($postal) && !(preg_match($valid_postal, $postal)))
        {
            /* Si il y a un code postal inscrit mais invalide */
            print "<p>Le code postal saisie est invalide !</p>\n";
        }
        if ($ville == '')
        {
            /* Si le champ ville est vide, */
            print "<p>Vous n'avez pas précisé votre ville</p>\n";
        }
        if(!$datenaiss)
        {
            /* Si le champ datenaiss est vide, */
            print "<p>Vous avez omis de mentionner votre date de naissance</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" onSubmit="return valideDate(champ);">
  <fieldset><legend><b>:: Donn&eacute;es de connexion ::</b></legend>
  <label><span class="legende_elmt">Votre pseudo : </span><span class="c2">*</span> <input type="text" name="pseudo" maxlength="20" class="cases" value="<?php echo $pseudo ?>" /></label><br />
  <label><span class="legende_elmt">Votre mot de pass : </span><span class="c2">*</span> <input type="password" name="pass" maxlength="20" class="cases" value="" /></label><br />
  <label><span class="legende_elmt">Confirmation mot de pass : </span><span class="c2">*</span> <input type="password" name="passverif" maxlength="20" class="cases" value="" /></label><br />
  </fieldset>
  <fieldset><legend><b>:: Donn&eacute;es personnelles ::</b></legend>
  <label><span class="legende_elmt">Votre prénom : </span><span class="c2">*</span> <input type="text" name="prenom" maxlength="40" class="cases" value="<?php echo $prenom ?>" /></label><br />
  <label><span class="legende_elmt">Votre Nom de famille : </span><span class="c2">*</span> <input type="text" name="nom" maxlength="40" class="cases" value="<?php echo $nom ?>" /></label><br />
  <label><span class="legende_elmt">Votre numéro de téléphone : </span><span class="c2">*</span> <input type="text" name="phone" maxlength="10" class="cases" value="<?php echo $phone ?>" /></label><br />
  <label><span class="legende_elmt">Votre adresse électronique : </span><span class="c2">*</span> <input type="text" name="email" maxlength="40" class="cases" value="<?php echo $email ?>" /></label><br />
  <label><span class="legende_elmt">Votre code postal : </span><input type="text" name="postal" maxlength="5" class="cases" value="<?php echo $postal ?>" /></label><br />
  <label><span class="legende_elmt">Votre ville : </span><input type="text" name="ville" maxlength="40" class="cases" value="<?php echo $ville ?>" /></label><br />
  <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
         */
        $href_email = str_replace("@", "%40", $email);
        // Affichage du message final des informations reçues
        print "<h3>Merci ! Voici les informations que vous avez fournies</h3>\n";
        print "<p>Informations sur le contact:</p>\n";
        print "<p>". $prenom ." ". $nom ."<br />\n";
        print "On peut vous joindre au ".$phone."<br />\n";
        if($ville != "")
        {
            print "Vous résidez à ".$ville."<br />\n";
        }
        print "On peut vous envoyer un courrier électronique à: <a href=\"mailto:". $prenom ."%20". $nom ."%20%3c". $href_email ."%3e\">".$email."</a><br />\n";
      print("<p>Retour vers le formulaire de base, cliquez <a href=\"". $_SERVER['PHP_SELF'] ."\" title=\"Retour vers le formulaire\">ICI</a></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" onSubmit="return valideDate(champ);">
  <fieldset><legend><b>:: Donn&eacute;es de connexion ::</b></legend>
  <label><span class="legende_elmt">Votre pseudo : </span><span class="c2">*</span> <input type="text" name="pseudo" maxlength="20" class="cases" value="" /></label><br />
  <label><span class="legende_elmt">Votre mot de pass : </span><span class="c2">*</span> <input type="password" name="pass" maxlength="20" class="cases" value="" /></label><br />
  <label><span class="legende_elmt">Confirmation mot de pass : </span><span class="c2">*</span> <input type="password" name="passverif" maxlength="20" class="cases" value="" /></label><br />
  </fieldset>
  <fieldset><legend><b>:: Donn&eacute;es personnelles ::</b></legend>
  <label><span class="legende_elmt">Votre prénom : </span><span class="c2">*</span> <input type="text" name="prenom" maxlength="40" class="cases" value="" /></label><br />
  <label><span class="legende_elmt">Votre Nom de famille : </span><span class="c2">*</span> <input type="text" name="nom" maxlength="40" class="cases" value="" /></label><br />
  <label><span class="legende_elmt">Votre numéro de téléphone : </span><span class="c2">*</span> <input type="text" name="phone" maxlength="10" class="cases" value="" /></label><br />
  <label><span class="legende_elmt">Votre adresse électronique : </span><span class="c2">*</span> <input type="text" name="email" maxlength="40" class="cases" value="" /></label><br />
  <label><span class="legende_elmt">Votre code postal : </span><input type="text" name="postal" maxlength="5" class="cases" value="" /></label><br />
  <label><span class="legende_elmt">Votre ville : </span><input type="text" name="ville" maxlength="40" class="cases" value="" /></label><br />
  <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>
le js est le même que celui que tu m'a donné et il est dans le même dossier que ce fichier php, le nom semble correct :wink:
:: contactez moi par MP ::
:non: NON au language SMS sur les forums :non:

Mammouth du PHP | 19672 Messages

25 févr. 2006, 19:34

Ok, alors quelques modifications s'imposent.

Dans la balise <form, deux choses : ajoute un attribut id et supprime le paramètre dans l'appel de vérification JavaScript. ça va donner:
<form id="formulaire" action="<?php echo($_SERVER['PHP_SELF']); ?>" method="post" onSubmit="return valideDate();">
Dans le JavaScript maintenant, tu vas modifier autre chose.
  1. Supprimer le paramètre de la fonction valideDate;
  2. Créer une variable qui va récupérer la valeur du champ date de naissance
Le début de la fonction va donc ressembler à:
function valideDate()
{
    var champ = document.forms['formulaire'].elements['datenaiss'].value;
    /* Extraction des différentes parties de la date */
    var tab = champ.split("/"); 
    //...
Refais ensuite le test.

Question subsidiaire: as-tu compris quelque chose à mes modifications ou c'est un peu abstrait encore ?
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, 00:46

j'ai à peu près compris je pense :oops:

maintenant ça fonctionne mais je n'ai pas de message d'erreur comme avec mes champs verifier depuis php

c'est pour cela que je voudrai recuperer la valeur boléenne du JS afin de traiter le message d'erreur depuis php et donc eviter le bloquage du submit pour le formulaire :?

n'aurai je pas eut meilleur temps à faire tout çà en php?

sinon si quelqu'un voit pour la recuperation de la variable js dans php :wink:
:: contactez moi par MP ::
:non: NON au language SMS sur les forums :non:

Mammouth du PHP | 19672 Messages

26 févr. 2006, 12:50

Aucun intérêt: si on crée une validation JavaScript, c'est pour une question de rapidité : le JavaScript s'exécute coté client, et sera donc toujours plus rapide qu'une validation coté serveur qui exige des échanges réseau client/serveur.

Mais, ça ne te dispense pas d'une validation coté serveur pour assurer la sécurité au cas où tu tomberais sur un internaute ayant désactivé JavaScript. Ils sont pas nombreux, mais il y a quelques paranos.

Tu as donc deux codes de validation: un en JavaScriipt qui bloque l'envoi jusqu'à ce que le formulaire soit correctement rempli et un autre en PHP coté serveur: tu gagneras en performance parce que les données envoyées au serveur seront déjà validées et la validation serveur n'est là qu'en sécurité, rien d'autre.
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, 13:25

oui je te comprend bien mais pensons à l'utilisateur:

si il rentre la date 29/02/2006, il n'aura aucun message d'erreur pour lui faire remarquer et il va certainement s'acharné à clické sur envoi sans comprendre ou voir qu'il à fait une erreur lors du remplissage du formulaire :?
:: contactez moi par MP ::
:non: NON au language SMS sur les forums :non:

Mammouth du PHP | 19672 Messages

26 févr. 2006, 13:29

Alors gère ça avec JavaScript et dans le JavaScript :
//...
if(dateValide == false)
{
    alert('La date inscrite est invalide, veuillez la corriger s'il vous plaît.');
}
//...
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, 13:47

j'ai pas reussi à integrer le message d'alerte dans le JS :oops:

j'ai essayer de le mettre en fin de fonction validedate et aussi en fin de script mais ça ne passe pas :cry:

pourrai tu me preciser où la mettre :wink:
:: contactez moi par MP ::
:non: NON au language SMS sur les forums :non:

Mammouth du PHP | 19672 Messages

26 févr. 2006, 13:51

/**
* Vérification qu'un date au format JJ/MM/AAAA est valide
*
* Paramètre Chaine  champ
* Retour    Booléen
*/
function valideDate(champ)
{
    /* Extraction des différentes parties de la date */
    var tab = champ.split("/");
    var jourStr   = tab[0];
    var moisStr   = tab[1];
    var anneeStr  = tab[2];
    var jourDate  = parseInt(jourStr);
    var moisDate  = parseInt(moisStr);
    var anneeDate = parseInt(anneeStr);
    /* Paramètres de nombres de jours */
    var jours31 = new Array(1, 3, 5, 7, 8, 10, 12);
    var jours30 = new Array(4, 6, 9, 11);
    /* Retour */
    var dateValide = false;

    Array.prototype.contient = function(valeur)
    {
        for (var i in this)
        {
            if (this[i] == valeur) return true;
        }
        return false;
    }
    /* Recherche */
    if(true === jours31.contient(moisDate))
    {
        /* On a un mois de 31 jours */
        if(jourDate <= 31)
        {
            dateValide = true;
        }
    }
    else if(true === jours30.contient(moisDate))
    {
        /* On a un mois de 30 jours */
        if(jourDate <= 30)
        {
            dateValide = true;
        }
    }
    else
    {
        /* On est au mois de février */
        var anB = anneeBissextile(anneeDate);
        if(true === anB && jourDate <= 29)
        {
            dateValide = true;
        }
        if(false === anB && jourDate <= 28)
        {
            dateValide = true;
        }
    }
	if(dateValide == false)
	{
		alert('Erreur :\nLa date inscrite est invalide, veuillez la rectifier s\'il vous plait.');
	}
    return dateValide;
}
Attention, je suis parti du code posté à l'origine, ne prends que la partie nécessaire.
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, 14:08

j'ai tester et ça ne marche pas avec FF:cry:

mon formulaire est bien bloqué mais aucun message d'erreur.

par contre ça marche avec IE et Opera :?

je vais te paraitre un peu borné mais, croit tu qu'il ne serait pas plus judicieux de se passer de JS et faire ça avec php? (comme le reste du traitement du formulaire est en php...)

ça risque d'être plus long serte, mais au moins on aura des message d'erreur similaire entre touts les champs du formulaire, plutot que un coup une fenetre d'alerte et l'autre coup des message en print sur le formulaire lui même :-k
:: contactez moi par MP ::
:non: NON au language SMS sur les forums :non:

Mammouth du PHP | 19672 Messages

26 févr. 2006, 14:22

Fais donc voir le JavaScript que tu as après tes modifications: ça fonctionne chez moi tous navigateurs, je ne vois pas pourquoi ça ne fonctionnerait pas chez toi.
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, 14:32

voila le JS:
/**
* Vérification qu'un date au format JJ/MM/AAAA est valide
*
* Paramètre Chaine  champ
* Retour    Booléen
*/
function valideDate()
{
    /* variable de recuperation du champ de date */
    var champ = document.forms['formulaire'].elements['datenaiss'].value;
    /* Extraction des différentes parties de la date */
    var tab = champ.split("/");
    var jourStr   = tab[0];
    var moisStr   = tab[1];
    var anneeStr  = tab[2];
    var jourDate  = parseInt(jourStr);
    var moisDate  = parseInt(moisStr);
    var anneeDate = parseInt(anneeStr);
    /* Paramètres de nombres de jours */
    var jours31 = new Array(1, 3, 5, 7, 8, 10, 12);
    var jours30 = new Array(4, 6, 9, 11);
    /* Retour */
    var dateValide = false;

    Array.prototype.contient = function(valeur)
    {
        for (var i in this)
        {
            if (this[i] == valeur) return true;
        }
        return false;
    }
    /* Recherche */
    if(true === jours31.contient(moisDate))
    {
        /* On a un mois de 31 jours */
        if(jourDate <= 31)
        {
            dateValide = true;
        }
    }
    else if(true === jours30.contient(moisDate))
    {
        /* On a un mois de 30 jours */
        if(jourDate <= 30)
        {
            dateValide = true;
        }
    }
    else
    {
        /* On est au mois de février */
        var anB = anneeBissextile(anneeDate);
        if(true === anB && jourDate <= 29)
        {
            dateValide = true;
        }
        if(false === anB && jourDate <= 28)
        {
            dateValide = true;
        }
    }
    if(dateValide == false)
    {
        alert('Erreur :\nLa date inscrite est invalide, veuillez la rectifier s\'il vous plait.');
    }
    return dateValide;
}
/**
* Vérification qu'une année est bissextile
*
* Paramètre Int     annee au format entier de 4 chiffres
* Retour    Booléen
*/
function anneeBissextile(annee)
{
    var bissextile = false;
    /* Si l'année est divisible par 4 */
    if(annee % 4 == 0)
    {
        /* Si l'année est séculaire */
        if(annee % 100 == 0)
        {
            /* Si l'année séculaire est divisible par 400 */
            if(annee % 400 == 0)
            {
                bissextile = true;
            }
        }
        else
        {
            bissextile = true;
        }
    }
    return bissextile;
}
ma version de FF est 1.0.7 et je pense qu'il fonctionne très bien :wink:

par contre est tu vraiment sur que tu est compatible avec touts les navigateurs (même sous mac et unix :-k )
:: contactez moi par MP ::
:non: NON au language SMS sur les forums :non:

Mammouth du PHP | 19672 Messages

26 févr. 2006, 15:00

C'est du JavaScript relativement basique et ça utilise le DOM standard. À première vue, c'est ok coté JavaScript: as-tu bien ajouté leséléments nécessaires dans ton formulaire html : l'attribut id dans la balise form par exemple avec pour valeur "formulaire" ? Quand on pointe sur document.forms['formulaire'], si l'id de ta balise form a pour valeur form ou mon_form, ça ne pourra bien entendu pas fonctionner.
Codez en pensant que celui qui maintiendra votre code est un psychopathe qui connait votre adresse :axe: