Validation Formulaire

Répondre


Cette question est un moyen d’empêcher des soumissions automatisées de formulaires par des robots.
Smileys
:D :) :( :o :shock: :? 8-) :lol: :x :P :oops: :cry: :evil: :twisted: :roll: :wink: :!: :?: :idea: :arrow: :| :mrgreen: =D> #-o =P~ :^o :non: :priere: 8-|
Voir plus de smileys
  Revue du sujet
 

  Étendre la vue Revue du sujet : Validation Formulaire

Validation Formulaire

par Photographiquement Vôtre » 03 déc. 2005, 12:50

Comme je dis toujours "je comprends vite mais il faut m'expliquer longtemps"

Merci car je n'ai pas encore le réflexe que javascript ne soit pas toujours disponible côté client.

"C'est le métier qui rentre"

par Cyrano » 03 déc. 2005, 12:43

Il faut bien comprendre une chose: tu peux parfaitement faire deux validations, mais dans la mesure où il y en a une première en JavaScript, l'avantage est que d'une part l'exécution se faisant coté client (le JavaScript est chargé en cache chez l'internaute et interprété par la navigateur) est beaucoup plus rapide, et d'autre part, si ta validation JavaScript est correctement élaborée, la validation PHP coté serveur n'est là qu'en sécurité. Les données envoyées sont déjà validées et donc le processus va d'autant plus rapidment. Mais cette seconde validation est nécessaire pour le cas toujours possible où le JavaScript serait désactivé coté client. Et dans ce dernier cas, tu n'aurais de toutes façons pas la possibilité d'avoir les pop-up ou les boiîtes de dialogue d'avertissement d'erreur.

Validation Formulaire

par Photographiquement Vôtre » 03 déc. 2005, 12:01

Merci

J'avais au départ mis ce code de validation sans ajouter de formule Javascript dans la submision du formulaire ce qui marchait parfaitement.
if(isset($_POST['envoi'])) 
{ 
    /* Le bouton d'envoi a été cliqué : On récupère la valeur envoyée du formulaire */ 
    $nom = isset($_POST['nom']) ? trim($_POST['nom']) : ""; 
    /* On vérifie que la valeur envoyée n'est pas vide */ 
    if(empty($nom)) 
    { 
        /* La valeur envoyée est vide : on affiche un message d'erreur */ 
        echo("<p>Le nom est manquant</p>\n"); 
        /* On affiche à nouveau le formulaire pour qu'il soit corrigé */ 
?> 
<form id="form_tuto" action="<?php echo($_SERVER['PHP_SELF']); ?>" method="post" onsubmit="return validFormulaire();"> 
  <fieldset> 
    <legend>Incrivez votre message</legend> 
    <label>Votre nom : <input type="text" name="nom" id="nom" value="" /></label><br> 
    <input type="submit" name="envoi" id="envoi" value="Valider" /><input type="reset" name="annuler" id="annuler" value="Recommencer" /> 
  </fieldset> 
</form> 
J'ai ensuite rajouté la formule de validation car je voulais avoir une fenêtre de message.

Je voulais ensuite me servir de la condition false pour ne pas mettre à jour la table et inscrire les messages comme je le fais dans d'autres types de programmation et ainsi ne pas faire deux validations avec deux types de message, un pop up avec Javascript et un autre avec echo.

Je crois comprendre que cela n'est pas posible en PHP.

Je vais donc procéder en deux fois

Encore merci de ta patience

par Cyrano » 01 déc. 2005, 17:31

Bon, on va y aller par étape : Tu as deux validations successives.
La première se fait en JavaScript, ce qui permet (en principe) de toujours envoyer des données valides au traitement.

Dans un second temps, lors du traitement, tu peux (sans obligation bien sur mais c'est vivement recommandé) faire une nouvelle validation en PHP cette fois-ci ; Voici un script complet illustrant chaque étape: c'est simplifié à l'extrême, mais ton système doit reproduire le même schéma, le nombre de champs à vérifier étant la seule différence majeure.
<?php
echo("<?xml version=\"1.0\" encoding=\"iso-8859-1\"?>\n");
?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="fr">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" xml:lang="fr" />
<title>Validation double de formulaire</title>
<script type="text/javascript">
/* <![CDATA[ */
function validFormulaire()
{
    /* On récupère directement dans le formulaire la valeur qui a été (éventuellement) saisie */
    var nom = document.forms['form_tuto'].elements['nom'].value;
    /* On initialise une variable de retour */
    var valide = false;
    /* On vérifie que la valeur récupérée n'est pas vide */
    if(nom != '')
    {
        /* La valeur n'est pas vide, on attribue true à la variable de retour */
        valide = true;
    }
    else
    {
        alert('Inscrivez votre nom');
        document.forms['form_tuto'].elements['nom'].focus();
    }
    /* On retourne la valeur de la variable de retour. */
    return valide;
}
/* ]]> */
</script>
</head>
<body>
<?php
/* Lors du chargement de la page, on vérifie si le bouton d'envoi du formulaire a été cliqué */
if(isset($_POST['envoi']))
{
    /* Le bouton d'envoi a été cliqué : On récupère la valeur envoyée du formulaire */
    $nom = isset($_POST['nom']) ? trim($_POST['nom']) : "";
    /* On vérifie que la valeur envoyée n'est pas vide */
    if(empty($nom))
    {
        /* La valeur envoyée est vide : on affiche un message d'erreur */
        echo("<p>Le nom est manquant</p>\n");
        /* On affiche à nouveau le formulaire pour qu'il soit corrigé */
?>
<form id="form_tuto" action="<?php echo($_SERVER['PHP_SELF']); ?>" method="post" onsubmit="return validFormulaire();">
  <fieldset>
    <legend>Incrivez votre message</legend>
    <label>Votre nom : <input type="text" name="nom" id="nom" value="" /></label><br>
    <input type="submit" name="envoi" id="envoi" value="Valider" /><input type="reset" name="annuler" id="annuler" value="Recommencer" />
  </fieldset>
</form>
<?php
    }
    /* Sinon (la valeur envoyée n'est pas vide) */
    else
    {
        /* Le formulaire est valide, on peut traiter les données, par exemple envoi vers une base de données. */
        // .....
        // .....
        // .....
    }
}
/* Si le bouton d'envoi du formulaire n'a pas été cliqué, on affiche donc le formulaire pour la première fois */
else
{
    /**
     * Première ouverture de la page : si le JavaScript n'est pas désactivé, on ne 
     * sortira pas de là tant que la validation JavaScript n'aura pas retourné TRUE
     */
?>
<form id="form_tuto" action="<?php echo($_SERVER['PHP_SELF']); ?>" method="post" onsubmit="return validFormulaire();">
  <fieldset>
    <legend>Incrivez votre message</legend>
    <label>Votre nom : <input type="text" name="nom" id="nom" value="" /></label><br>
    <input type="submit" name="envoi" id="envoi" value="Valider" /><input type="reset" name="annuler" id="annuler" value="Recommencer" />
  </fieldset>
</form>
<?php
}
?>
</body>
</html>

Validation Formulaire

par dudu60 » 01 déc. 2005, 16:36

Mais si je met ta formule de validation telle que tu me l'a donné

function Controle()
{
if(document.test.txtName.value=='')
{
alert('Veuillez renseigner la zone Nom ');
document.test.txtName.focus();
return false;
}
}


et modifier

<form method="post" action="<?= $page ?>" name="test" onsubmit="return Controle();">

cela dois marcher ou alors je suis paumé !!!!!!!!!!

par Cyrano » 01 déc. 2005, 16:30

Bon, ok, admettons que le cap de la validation JavaScript soit passée : à ce stade, ta validation PHP ne vaut pas un clou puisque de toutes façon les données sont enregistrées, bonnes ou pas.

Et je ne vois aucun else après chacun de tes if().

Validation Formulaire

par dudu60 » 01 déc. 2005, 16:24

Je suis allé un peu vite
<?php 
if Controle() 

{
    
if (isset($_POST["txtName"])) $name=htmlspecialchars(stripslashes($_POST["txtName"]), ENT_QUOTES); 
if (isset($_POST["txtCity"])) $city=htmlspecialchars(stripslashes($_POST["txtCity"]), ENT_QUOTES); 
if (isset($_POST["lstCountry"])) $country=htmlspecialchars(stripslashes($_POST["lstCountry"]), ENT_QUOTES); 
if (isset($_POST["txtEmail"])) $email=htmlspecialchars(stripslashes($_POST["txtEmail"]), ENT_QUOTES); 
if (isset($_POST["txtUrl"])) $url=htmlspecialchars(stripslashes($_POST["txtUrl"]), ENT_QUOTES); 
if (isset($_POST["txaComment"])) $comment=htmlspecialchars(stripslashes($_POST["txaComment"]), ENT_QUOTES); 
?> 

<?php 
     
        $date = date("d/m/y"); 
        $email=str_replace("@","@",$email); //cryptage du signe @ 
        $query = "INSERT INTO $table(date,nom,ville,pays,email,site,commentaire)"; 
        $query .= " VALUES('$date','$name','$city','$country','$email','$url','$comment')"; 
        $result = mysql_query($query); 
?> 
          
        <p id="rep">Merci d'avoir signé le livre d'or</p> 
      <p> 
      Le message sera rajouté dès que possible 
      </p> 
      <p> 
      <a href="<?= $page ?>">--  Retourner sur le livre d'or --</a> 
      </p> 
}

par Cyrano » 01 déc. 2005, 16:19

Où est l'accolade ouvrante de ta structure de contrôle ?

Validation Formulaire

par dudu60 » 01 déc. 2005, 16:11

Justement ne peux t-on pas faire :
if Controle()

<?php 
   
if (isset($_POST["txtName"])) $name=htmlspecialchars(stripslashes($_POST["txtName"]), ENT_QUOTES); 
if (isset($_POST["txtCity"])) $city=htmlspecialchars(stripslashes($_POST["txtCity"]), ENT_QUOTES); 
if (isset($_POST["lstCountry"])) $country=htmlspecialchars(stripslashes($_POST["lstCountry"]), ENT_QUOTES); 
if (isset($_POST["txtEmail"])) $email=htmlspecialchars(stripslashes($_POST["txtEmail"]), ENT_QUOTES); 
if (isset($_POST["txtUrl"])) $url=htmlspecialchars(stripslashes($_POST["txtUrl"]), ENT_QUOTES); 
if (isset($_POST["txaComment"])) $comment=htmlspecialchars(stripslashes($_POST["txaComment"]), ENT_QUOTES); 
?> 

<?php 
    
        $date = date("d/m/y"); 
        $email=str_replace("@","@",$email); //cryptage du signe @ 
        $query = "INSERT INTO $table(date,nom,ville,pays,email,site,commentaire)"; 
        $query .= " VALUES('$date','$name','$city','$country','$email','$url','$comment')"; 
        $result = mysql_query($query); 
?> 
         
        <p id="rep">Merci d'avoir signé le livre d'or</p> 
      <p> 
      Le message sera rajouté dès que possible 
      </p> 
      <p> 
      <a href="<?= $page ?>">--  Retourner sur le livre d'or --</a> 
      </p> 
}

par Cyrano » 01 déc. 2005, 13:04

Il faut pour bien saisir le fonctionnement te représenter un schéma de fonctionnement général.
Au chargement de la page, tu récupères, si elles existent, les données du formulaire : Si elles existent, tu les traites et selon la validité, tu enregistres ou tu affiches à nouveau le formulaire pour correction. Ça, c'est la validation coté serveur après coup.

S'il n'y a pas de données envoyées, tu affiches normalement le formulaire. Ce que je t'ai mis en code JavaScript fait que si certaines données sont invalidées par le JavaScript, le formulaire ne sera pas envoyé du tout.

Il faut donc que la partie traitement de l'enregistrement ne soit pas disponible au chargement de la page. Tu dois avoir des tests if/else pour choisir quelle partie de code tu dois mettre en oeuvre. Au premier chargement, ton test if porte sur la présence de données envoyées : donc s'il y en a, tu mets dans le if le traitement serveur. S'il n'y en a pas, tu tombes dans le else et là, tu mets le formulaire normal et ton JavaScript de traitement. Lors de la soumission du formulaire, la page est rechargée sur elle-même... à condition que le JavaScript ait validé les informations saisies et n'ait pas bloqué ce rechargement.

Est-ce que tu saisis le processus ?

Validation Formulaire

par dudu60 » 01 déc. 2005, 12:53

Modifie la fonction comme ceci:
function Controle()
{
    if(document.test.txtName.value=='')
    {
        alert('Veuillez renseigner la zone Nom ');
        document.test.txtName.focus();
        return false;
    }
} 
Ensuite, ajoute un évènement onsubmit dans ta balise form:
<form method="post" action="<?= $page ?>" name="test" onsubmit="return Controle();">
Et tu peux enlever l'évènement onclick de ton bouton d'envoi.

Merci mais comment désactiver la mise à jour de la table (cf Code)

Truc m'a idiqué ce code mais uù dois je le passer

$ok=true;//initialisation
if(ok)
//instruction ok
else
$ok= false;

//traitement

if($ok)
...


Fin de mon Code que je souhaite bloquer si le champ n'est pas rempli
<?php 
   
if (isset($_POST["txtName"])) $name=htmlspecialchars(stripslashes($_POST["txtName"]), ENT_QUOTES); 
if (isset($_POST["txtCity"])) $city=htmlspecialchars(stripslashes($_POST["txtCity"]), ENT_QUOTES); 
if (isset($_POST["lstCountry"])) $country=htmlspecialchars(stripslashes($_POST["lstCountry"]), ENT_QUOTES); 
if (isset($_POST["txtEmail"])) $email=htmlspecialchars(stripslashes($_POST["txtEmail"]), ENT_QUOTES); 
if (isset($_POST["txtUrl"])) $url=htmlspecialchars(stripslashes($_POST["txtUrl"]), ENT_QUOTES); 
if (isset($_POST["txaComment"])) $comment=htmlspecialchars(stripslashes($_POST["txaComment"]), ENT_QUOTES); 
?> 

<?php 
    
        $date = date("d/m/y"); 
        $email=str_replace("@","@",$email); //cryptage du signe @ 
        $query = "INSERT INTO $table(date,nom,ville,pays,email,site,commentaire)"; 
        $query .= " VALUES('$date','$name','$city','$country','$email','$url','$comment')"; 
        $result = mysql_query($query); 
?> 
         
        <p id="rep">Merci d'avoir signé le livre d'or</p> 
      <p> 
      Le message sera rajouté dès que possible 
      </p> 
      <p> 
      <a href="<?= $page ?>">--  Retourner sur le livre d'or --</a> 
      </p> 

par Cyrano » 01 déc. 2005, 01:52

Modifie la fonction comme ceci:
function Controle()
{
    if(document.test.txtName.value=='')
    {
        alert('Veuillez renseigner la zone Nom ');
        document.test.txtName.focus();
        return false;
    }
} 
Ensuite, ajoute un évènement onsubmit dans ta balise form:
<form method="post" action="<?= $page ?>" name="test" onsubmit="return Controle();">
Et tu peux enlever l'évènement onclick de ton bouton d'envoi.

par Truc » 01 déc. 2005, 01:47

un exemple un :wink:
regarde de plus pres la balise <form> et l'événement onSubmit

Validation Formulaire

par Photographiquement Vôtre » 30 nov. 2005, 23:58

Bonsoir,

J'ai créé un livre d'or.

Je valide les données entrées en appliquant une formule Javascript.

Si le nom est manquant j'ai un message.

Comment suite à ce message bloquer les enregistrements dans la table des messages

Merci
<html> 

<head> 
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1"> 

<title>Livre d'Or</title> 

<!--Indique une feuille de style interne --> 

<style type="text/css"> 

<!--Couleur des Liens --> 

a:link{color:red}; 
a:visited{color:blue}; 
a:hover{color:black}; 
a:active{color:green}; 

body{ 
background-color:"#B2B2B2"; 
text-align:center 
} 

table{ 
background-color: "#B2B2B2"; 
} 

<!--Indique la position dans une cellule du tableau --> 
td.gauche{text-align:left} 
td.droite{text-align:right} 
td.centre{text-align:center} 
.red{color:red} 


</style> 

</head> 

<SCRIPT Language="JavaScript"> 



function Controle() 

{ 
   
   if(document.test.txtName.value=='') 
      { 
         alert('Veuillez renseigner la zone Nom '); 
         document.test.txtName.focus(); 
          
         

      } 
    
}  

</script> 

<body> 


<!-- Barre de Navigation --> 
<table style="padding: 0px; width: 90%; margin-left: auto; margin-right: auto; ;" 
border="0" cellpadding="2" cellspacing="2"> 
<tr> 
<td 
style="width: auto; text-align: center; color: rgb(102, 0, 0);"><a 
href="index.php" style="text-decoration: none;font-size: 20px;">Accueil</a></td> 
<td 
style="width: auto; text-align: center; color: rgb(102, 0, 0);"><a 
href="Themes.php" style="text-decoration: none;font-size: 20px;">Galerie</a></td> 
<td 
style="width: auto; text-align: center; color: rgb(102, 0, 0);"><a 
href="Auteur.php" style="text-decoration: none;font-size: 20px;">Auteur</a></td> 
<td 
style="width: auto; text-align: center; color: rgb(102, 0, 0);font-size : 20px;">Livre d'Or</td> 
<td 
style="width: auto; text-align: center; color: rgb(102, 0, 0);font-size: 20px;"><a 
href="liens.php" style="text-decoration: none;">Liens</a></td> 
</tr> 
</table> 

<!-- --> 
<h1>Bienvenue sur mon livre d'or</h1> 
<p>&nbsp;</p> 

<?php 

include ("connection.php"); 

//Initialisation des variables 
$table="tbllivredor"; 
//Le message sera reçu par l'intermédiaire du serveur de l'hébergeur (ex Apache) 
$page = $_SERVER ["PHP_SELF"]; 
$adresseemail="[email protected]"; 
$name=""; 
$city=""; 
$country=""; 
$email=""; 
$url=""; 
$note=""; 
$comment=""; 



$result = mysql_query("SELECT * FROM $table ORDER BY id_message DESC"); 
$total=mysql_numrows($result); 

?> 

<!-- --> 
<table border="1" width="50%" cellspacing="0" cellpadding="5"> 
<tr> 
<td class="gauche">[<a href="#form">Signer le Livre d'Or <SPAN Class="Red">en cliquant ici</SPAN></a>]</td> 
<td class="droite">[<b>Au total : <? echo $total; ?> messages</b>] 
</tr> 
</table> 

<!-- --> 
<?php 
while ($val = mysql_fetch_array($result)) 
{ 
?> 
<p>&nbsp;</p> 
<table border="0" width="50%" cellspacing="0"> 
<tr> 
<td colspan="2" class="gauche"><b>De : </b> 
<?= $val["nom"]; ?> 
<?php 
if ($val["email"]) { ?>&nbsp;&nbsp;&nbsp;<A href="mailto:<?= $val["email"]; ?>"><small>[Écrivez moi] </small></A><?php } ?> 
<?php 
if ($val["site"]!="http://") { ?><A href="<?= $val["site"]; ?>"><small>[Site Web] </small></A><?php } ?> 
</td> 
</tr> 
<tr> 
<td class="gauche"> 
<?php 
if($val["ville"]){echo "<b>Ville : </b>".$val['ville']." "; } ?></td> 
<td class="droite"><?php if($val["pays"]){echo "<b>Pays : </b>".$val['pays']."<br>"; } ?></td> 
</tr> 
<tr> 
<td colspan="2"><b>Inscrit le : </b> <?= $val["date"]; ?></td> 
</tr> 
<tr> 
<td colspan="2"><hr><b>Message : </b> 
<?= str_replace("<","<",$val["commentaire"]); ?></td> 
</tr> 
</table> 
<?php 
} 
?> 

<!-- --> 
<p><a name="form"></a>&nbsp;</p> 
<!--Création du formulaire--> 
<form method="post" action="<?= $page ?>" name="test"> 
<fieldset><legend>Laissez nous votre commentaire</legend> 
<div style="text-align:center"> 
<table cellpadding="3"> 
<tr> 
<td colspan="4">Nom <input name="txtName" value="" size="15" maxlength="30"></td> 
<td colspan="4">Ville <input name="txtCity" size="15" maxlength="30"></td> 
<td colspan="4">Pays <select name="lstCountry"> 
<option value="France" selected>France 
<option value="Grande Bretagne">Grande Bretagne 
<option value="Canada">Canada 
<option value="Italie">Italie 
<option value="Belgique" >Belgique 
<option value="Suisse">Suisse 
<option value="Luxembourg">Luxembourg 
<option value="USA">USA 
<option value="Autre">Autre 
</select> 
</td> 
</tr> 
<tr> 
<td>&nbsp;</td> 
<td colspan="5">E-mail<br><input name="txtEmail" size="20" maxlength="30"></td> 
<td colspan="5">Site<br><input name="txtUrl" value="http://" size="20" maxlength="30"> 
</td> 
<td>&nbsp;</td> 
</tr> 

<tr> 
<td colspan="12"><br><textarea name="txaComment" rows="10" cols="55"></textarea> 
Code: 
<br><br><input type="button" value="Signer le livre" name="bntSoumet" onClick="javascript:Controle();"><input type="reset" value="Effacer"><br>  

</td> 
</tr> 
</table> 
</div> 
</fieldset> 
</form> 
<!-- --> 

<?php 
  
if (isset($_POST["txtName"])) $name=htmlspecialchars(stripslashes($_POST["txtName"]), ENT_QUOTES); 
if (isset($_POST["txtCity"])) $city=htmlspecialchars(stripslashes($_POST["txtCity"]), ENT_QUOTES); 
if (isset($_POST["lstCountry"])) $country=htmlspecialchars(stripslashes($_POST["lstCountry"]), ENT_QUOTES); 
if (isset($_POST["txtEmail"])) $email=htmlspecialchars(stripslashes($_POST["txtEmail"]), ENT_QUOTES); 
if (isset($_POST["txtUrl"])) $url=htmlspecialchars(stripslashes($_POST["txtUrl"]), ENT_QUOTES); 
if (isset($_POST["txaComment"])) $comment=htmlspecialchars(stripslashes($_POST["txaComment"]), ENT_QUOTES);
?> 

<?php 
   
        $date = date("d/m/y"); 
        $email=str_replace("@","@",$email); //cryptage du signe @ 
        $query = "INSERT INTO $table(date,nom,ville,pays,email,site,commentaire)"; 
        $query .= " VALUES('$date','$name','$city','$country','$email','$url','$comment')"; 
        $result = mysql_query($query); 
 ?>
        
        <p id="rep">Merci d'avoir signé le livre d'or</p> 
      <p> 
      Le message sera rajouté dès que possible 
      </p> 
      <p> 
      <a href="<?= $page ?>">--  Retourner sur le livre d'or --</a> 
      </p>
   

</BODY> 
</HTML>