A propos des formulaires

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 : A propos des formulaires

Re: A propos des formulaires

par atari54 » 24 avr. 2012, 23:32

Je reviens à vous, avant de m'arracher les cheveux (ce serait dommage tout de même... :) ).
J'essaie d'améliorer mon code de départ. Je rappelle que 3 champs sont requis : le nom, le mail et le message que doit laisser l'internaute. J'ai placé une regex pour vérifier le format du n° de tél. Cependant, lorsque je décide de ne rien mettre dans le champ "téléphone" (et l'internaute est en droit de ne rien mettre à cet endroit car le champ n'est pas requis), le message qui annonce le mauvais "format" du téléphone apparaît (hors, j'ai spécifié au début du code que le cas à traiter était celui où la variable qui est censé accueillir le n° de tél. était spécifiée, donc contenant une donnée).
Quelqu'un aurait-il une idée de la source du problème ?

Le code :
<?php
        
        if (isset($_POST['nom']) && isset($_POST['prenom']) && isset($_POST['telephone']) && isset($_POST['mail']) && isset($_POST['texte'])) //on vérifie que la variable 'mail' contient une donnée
        {
        // On rend inoffensives les balises HTML que le visiteur a pu rentrer
        $_POST['nom'] = htmlspecialchars($_POST['nom']);
        $_POST['prenom'] = htmlspecialchars($_POST['prenom']);
        $_POST['telephone'] = htmlspecialchars($_POST['telephone']);
        $_POST['mail'] = htmlspecialchars($_POST['mail']); 
        $_POST['texte'] = htmlspecialchars($_POST['texte']);
        
        //si le téléphone n'a pas été rentré sous la forme imposée par la regex, un script l'annonce, puis l'internaute est redirigé vers le formulaire
        if (!preg_match("#^0[1-9]([-. ]?[0-9]{2}){4}$#", $_POST['telephone']))
        {
            ?>
      <script>
            alert("le téléphone n'est pas valide ! Veuillez le saisir à nouveau.");          
            document.location.replace('contact.html');
        </script>
                
        <?php
        
        }
        //si le mail n'a pas été rentré sous la forme imposée par la regex, un script l'annonce, puis l'internaute est redirigé vers le formulaire
        if (!preg_match("#^[a-z0-9._-]+@[a-z0-9._-]{2,}\.[a-z]{2,4}$#", $_POST['mail'])) 
        {
        
        ?>
      <script>
            alert("l'adresse mail n'est pas valide ! Veuillez la saisir à nouveau sous la forme [email protected] (de 2 à 4 lettres après le point)");          
            document.location.replace('contact.html');
        </script>
                
        <?php
        
        }
        
        
        
            ?>
        <script>
            alert("Votre demande a été prise en compte.");
            document.location.replace('site_machinTruc.html');
        </script>
            
        
        <?php                          
                  
}
/*echo $_POST['nom'];
echo $_POST['prenom'];*/
       ?>

Re: A propos des formulaires

par atari54 » 19 avr. 2012, 21:03

D'accord concernant le header(). Je pensais que la "machine" prenait les instructions dans l'ordre, donc le code javaScript d'abord, puis le header(). Je saurai maintenant, merci !
Je prends en note pour le coup de la session aussi.
Et effectivement, le code de moogli me paraît plus pratique : en tout cas, ça permet de rester sur la même page.

Re: A propos des formulaires

par xTG » 19 avr. 2012, 20:56

Un header() de redirection implique qu'il ne doit pas y avoir d'affichage (pas le temps de le voir de toute manière) car seul le header() doit être envoyé au navigateur.
Après on peut faire transiter les messages via des variables de session. En gros on stocke le message, redirection, affichage si présence de message dans la session.

Ou bien comme le disait moogli tout mettre sur la même page avec un affichage conditionnel en fonction du traitement du formulaire (si erreur on raffiche le formulaire, ect).

Re: A propos des formulaires

par atari54 » 19 avr. 2012, 20:28

Du coup, j'ai trouvé une alternative au header(), avec [javascript]document.location.replace();[/javascript] en javaScript. Ce qui donne :
<?php
        //--->regex vérification email<---
        if (isset($_POST['mail'])) //on vérifie que la variable 'mail' contient une donnée
        {
        $_POST['mail'] = htmlspecialchars($_POST['mail']); // On rend inoffensives les balises HTML que le visiteur a pu rentrer

            //si le mail n'a pas été rentré sous la forme imposée par la regex, un script l'annonce, puis l'internaute est redirigé vers le formulaire
            if (!preg_match("#^[a-z0-9._-]+@[a-z0-9._-]{2,}\.[a-z]{2,4}$#", $_POST['mail'])) 
            {
        ?>
           <script>
            alert("l'adresse mail n'est pas valide !");          
            document.location.replace('blabla.html');
        </script>
                
        <?php
         }
        
        else
        {
            ?>
           <script>
            alert("Votre demande a été prise en compte.");
            document.location.replace('blublu.html');
        </script>               
        
        <?php
                
    }
    
}
       ?>
Mais du coup, je suis quand même preneur si quelqu'un avait la solution avec le header(). :wink:

Re: A propos des formulaires

par atari54 » 19 avr. 2012, 10:17

Merci pour ces précisions Moogli !
J'ai utilisé la fonction header(), qui fonctionne nickel. Par contre, maintenant que je l'utilise, mon code en javaScript n'est plus pris en compte : c-à-d que lorsque l'utilisateur tape une mauvaise adresse mail, le formulaire se réaffiche directement, sans le message qui lui spécifie qu'il y a un problème au niveau du mail...tout comme lorsque l'internaute a validé un formulaire correct; là, le site renvoie vers la page d'accueil (grâce à header() donc), mais sans le javaScript qui lui spécifie que les données du formulaire ont bien été prises en compte.
<?php
        //--->regex vérification email<---
        if (isset($_POST['mail'])) //on vérifie que la variable 'mail' contient une donnée
        {
        $_POST['mail'] = htmlspecialchars($_POST['mail']); // On rend inoffensives les balises HTML que le visiteur a pu rentrer

            //si le mail n'a pas été rentré sous la forme imposée par la regex, un script l'annonce, puis l'internaute est redirigé vers le formulaire
            if (!preg_match("#^[a-z0-9._-]+@[a-z0-9._-]{2,}\.[a-z]{2,4}$#", $_POST['mail'])) 
            {
        
        ?>
        <script>
            alert("l'adresse mail n'est pas valide !");             
        </script>
                
        <?php
        header('Location: contact.html');
    }
           
        else
        {
            ?>
        <script>
            alert("Votre demande a été prise en compte.");
            
            </script>    
            
        
        <?php
        header('Location: site_nancy_renaissance.html');
        //echo 'L\'adresse ' . $_POST['mail'] . ' n\'est pas valide, recommencez !';
    }
    
}
       ?>
Il y a sûrement un moyen de pallier à cela ? Peut-être que la fonction header() est mal placée ?

P.S. : avec une connexion et un pseudo, c'est mieux :wink:

Re: A propos des formulaires

par moogli » 18 avr. 2012, 22:44

Pour le retour utilise la fonction header

Exemple de validation
<?php
if (!empty($_POST['submit'])){
	$valid = true;
	if(empty($_POST['mail'])) {
		$erreur[]= 'le mail ne peux pas &ecirc;tre vide';
		$valid = false;
	}
	
	if(!empty($_POST['mail']) && !filter_var($_POST['mail'],FILTER_VALIDATE_EMAIL)){
		$erreur[] = 'le mail est invalide';
		$valid = false;
	}
	if (empty($_POST['prenom'])){
		$erreur[] ='le prenom est obligatoire';
		$valid = false;
	}
	
	if ($valid === true){
		// validation du formulaire
	}
}

?>
<!DOCTYPE html>
<html charset="utf-8">
<head>
<link rel="stylesheet" type="text/css" href="css/style.css" />
</head>
<body>
	<h1>Test du formulaire</h1>
	<form action="" method="POST">
	<?php 
	if (!empty($erreur) && is_array($erreur)){
		echo '<div class="notification error">';
		foreach($erreur as $e){
			echo $e.'<br />';
		}
		echo '</div>';
}
	?>
		<label for="civilite">civilit&eacute; : </label> <span>Mr</span>
		<input type="radio" name="civilite" class="civilite" value="Mr" checked="checked"/> <span>Mme</span><input
			type="radio" name="civilite" class="civilite" value="Mme" /> <span>Melle</span><input
			type="radio" name="civilite" class="civilite" value="Melle" /> <br />
		<label for="nom">votre nom : </label><input type="text" name="nom"<?php 
		if (!empty($_POST['nom'])) echo ' value="'.htmlentities($_POST['nom']).'"'; 
		?>
			id="nom" required="required" /><br /> <label for="prenom">votre pr&eacute;nom :
		</label><input type="text" name="prenom" id="prenom"<?php 
		if (!empty($_POST['prenom'])) echo ' value="'.htmlentities($_POST['prenom']).'"'; 
		?> /><br />
		<label for="telephone">votre t&eacute;l&eacute;phone : </label><input
			type="telephone" name="telephone" id="telephone" value="" required="required" <?php 
		if (!empty($_POST['telephone'])) echo ' value="'.htmlentities($_POST['telephone']).'"'; 
		?>/><br /> <label
			for="mail">votre e-mail : </label><input type="mail" name="mail"
			id="mail" <?php 
		if (!empty($_POST['mail'])) echo ' value="'.htmlentities($_POST['mail']).'"'; 
		?> required="required"/><br /> <label for="texte">votre description : </label>
		<textarea name="texte" id="texte" rows="4" cols="20"><?php 
		if (!empty($_POST['texte'])) echo ' value="'.htmlentities($_POST['texte']).'"'; 
		?></textarea>
		<br /> <input type="submit" value="Validation" name="submit" />
	</form>
</body>
</html>
@+

Re: A propos des formulaires

par Invité » 18 avr. 2012, 19:23

Merci pour ta réponse rapide et précise moogli.
Le isset c'est bien, mis sur toutes les valeurs que tu souhaite utiliser dans le formulaire.
Ce qui signifie qu'il serait plus prudent de faire ceci pour chacun des champs donc ? Ici, exemple avec "prenom" :

if (isset($_POST['prenom']))
{
$_POST['prenom'] = htmlspecialchars($_POST['prenom']);
}
Tu peux aussi éviter d'avoir deux pages. (...)L'action du formulaire devient soit le nom du script soit rien (qui correspond au script courant).
Merci encore en tout cas, j'ai pris note de tes conseils. :wink:

Dans ce cas, l'action du formulaire n'est pas le nom de la page même du formulaire ?

Sinon, si je laisse ma page de récupération de données (en .php) telle quelle, une idée pour revenir à la page d'accueil une fois que tout est validé ?

Re: A propos des formulaires

par moogli » 18 avr. 2012, 19:07

Salut,

Le isset c'est bien, mis sur toutes les valeurs que tu souhaite utiliser dans le formulaire.
Avec php5 tu peux remplacer ton expression régulière par l'utilisation de filter_var().

Tu peux aussi éviter d'avoir deux pages.
Il suffit de faire la validation du formulaire sur la meme page que l'affichage.
L'action du formulaire devient soit le nom du script soit rien (qui correspond au script courant).
Cela te permet aussi de pré replie le formulaire en cas d'échec.

Sinon cela semble correct? J'obterais plus pour l'affichage du message d'ans la page plutôt qu'avec du JS (j'y suis allergique ^^).

Le reste semble correct.

Pense que le fait de mettre un required ou un même un script pour vérifier que l'utilisateur remplisse tout n'empêche pas la vérification côté serveur.

@+

A propos des formulaires

par Invité » 18 avr. 2012, 18:52

Bonjour à tous !

Pour mon premier message ici, je vous décris mon petit souci :
J'ai créé un formulaire de contact sur une page en .html, ainsi qu'une page de traitement de données en .php. Deux données sont obligatoires : le nom et le mail de l'internaute (pour cela, j'ai simplement mis "required" dans mon code HTML). Pour le champ du mail, j'ai créé une regex, qui permets de ne pas accepter n'importe quoi de la part de l'internaute (au minimum, il doit avoir une adresse mail en [email protected]). Si l'un des deux champs n'est pas rempli, un message automatique (géré par le navigateur) prévient l'utilisateur. Si le mail n'est pas valide, une alerte en javaScript est activé (je pensais que c'était mieux plutôt que d'afficher ça sur une page en php), puis le formulaire réapparait (en fait j'ai copié-collé le formulaire de ma page HTML sur ma page en .php). Puis, quand l'internaute a tout bien rempli, un message lui dit...et là ce que j'aimerai, c'est faire revenir l'internaute sur la page d'accueil (ou alors lui faire choisir où il veut naviguer). Mais comment faire ? voici mon code :
<?php
if (isset($_POST['mail']))
{
$_POST['mail'] = htmlspecialchars($_POST['mail']); // On rend inoffensives les balises HTML que le visiteur a pu rentrer

    if (!preg_match("#^[a-z0-9._-]+@[a-z0-9._-]{2,}\.[a-z]{2,4}$#", $_POST['mail']))
    {
        
        ?>
        <script>
            alert("l'adresse mail n'est pas valide !");             
        </script>
        
        <form action="contact_post.php" method="POST">
            <label for="civilite" >civilité : </label><input type="radio" name="civilite" id="civilite" value="" /><br/><br/>
            <label for="nom">votre nom : </label><input type="text" name="nom" id="nom" required/><br/><br/>
            <label for="prenom">votre prénom : </label><input type="text" name="prenom" id="prenom" value="" /><br/><br/>
            <label for="telephone">votre téléphone : </label><input type="text" name="telephone" id="telephone" value="" /><br/><br/>
            <label for="mail">votre e-mail : </label><input type="text" name="mail" id="mail" required/><br/><br/>
            <label for="texte">votre description : </label><textarea name="" id="texte" rows="4" cols="20"></textarea><br/><br/>
            <input type="submit" value="Validation" />
        </form>
        <?php
    }
        else
        {
            ?>
            
            <script>
            alert("Votre demande a été prise en compte.");
            </script>
        
        <?php              
    }
}
        
        ?>
Dans un deuxième temps, j'aimerai aussi savoir si mon code est relativement propre, ou si je code vraiment comme un gougnafier. :lol:
Merci beaucoup !