[RESOLU] Aide pour formulaire svp

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 : [RESOLU] Aide pour formulaire svp

Re: [RESOLU] Aide pour formulaire svp

par Doula-Die » 16 juin 2013, 13:32

Mais non ce n'est pas dommage.

Je vais le tester et je vous reviens... on ne sait jamais !

Deux idées valent toujours mieux qu'une !!!

-------------------- EDITION --------------------

Euhhhhhhhhhh.... le formulaire fonctionne, mais si on oublie une case, il "passe" quand même (sans que je reçoive la réponse par contre) avec une note d'erreur mais sur la même page que le "merci d'avoir complété le formulaire". Me semble que ça aurait été mieux juste le message d'erreur SANS le merci. De plus, il y a une série de codes devant le message d'erreur.

Voir ici: http://forum55plus.ca/erreur2.png

Par contre, j'adore votre petit bouton retour, ce que je n'ai pas sur ma page fonctionnelle.

J'vous l'ai dit que 2 têtes valent mieux qu'une - lolll

Re: [RESOLU] Aide pour formulaire svp

par sirakawa » 16 juin 2013, 12:48

Dommage car voila:
<?php
 function check_email_address($courriel) 
 {
  // First, we check that there's one @ symbol, 
  // and that the lengths are right.
  $resultat = true;
  $pos_at = strpos($courriel, "@");
  if (($pos_at === false) or ($pos_at === 0))
  {
  		$resultat = false;
  	}
  	else
  	{
  		$parties = explode("@", $courriel);
  		$nom = $parties[0];
  		$lhote = $parties[1];
  		$details_hote = explode(".", $lhote);
  		if (count($details_hote) <  2)
		{
			$resultat = false;
		}
		else
		{
  			$hote = $details_hote[0];
  			$domaine = $details_hote[1];
 			$res= preg_match("^[A-Za-z0-9!#$%&'*+/=?_`{|}~-]{0,62}^",$hote);
 			if ($res === 0)
 			{
 				$resultat  = false;	
 			}
 			else
 			{
 	 			$res= preg_match("^[A-Za-z0-9!#$%&'*+/=?_`{|}~-]{2,62}^",$domaine);	
 	 			if ($res === 0)
 	 			{
 	 				$resultat = false;
 	 			}	
 			}
var_dump($res);

  		} 
  		var_dump($details_hote);
  		print_r($parties);
  	}
  
  return $resultat;
}
  
 function nettoie ($chaine)
 {
 	if (function_exists("filter_var"))
 	{
 		return filter_var($chaine,FILTER_SANITIZE_STRING);
	}
 	
 	else
 	{
 		return htmlspecialchars($chaine,ENT_QUOTES|ENT_SUBSTITUTE|ENT_IGNORE);
 	} 

}
 	/* $courriel est la valeur passée.
 	$courrier contient la même valeur si le le couriel est bien formé  ou false si le courriel est mal formé
 	*/
 	$courriel = isset($_POST['courriel'])? $_POST['courriel']: "";
 	$courrier = check_email_address($courriel);
  	$message = isset($_POST['message'])? $_POST['message']: "";	
  	$nom = isset($_POST['nom'])? $_POST['nom']: "";	
  	$antispam = isset($_POST['antispam'])? $_POST['antispam']: "";	 	
  	$c_rendu = ""; //le compte-rendu d'erreur
  	$erreur = false; //booléen juste en cas d'erreur
  	
if ($courrier === false)
{
	$c_rendu = "<p>Votre adresse &eacute;lectronique est incorrecte. Elle doit &ecirc;tre de la forme nom@hote ";
	$erreur = true;
}
	
if (($message == "") or (strlen ($message)< 15)) //message absent ou trop court
{
echo (strlen($message));	
	$c_rendu .= "<p>Votre message est absent ou trop court.";
	$erreur = true;
}
else
{
	$message = nettoie ($message);
}

if (($nom == "") or (strlen ($nom ) < 5)) //nom absent ou trop court
{
	$c_rendu .= "<p>Votre nom est absent ou trop court.";
	$erreur = true;
}
else
{
	$nom = nettoie ($nom);
}

if ($antispam != "SEIZE") //nom absent ou trop court
{
	$c_rendu .= "<p>Antispam incorrect.";
	$erreur = true;
}

if ($erreur === true)
{
		/*En cas d'erreur ce formulaire repasse les valeurs à index.php */
		print "
		$c_rendu
		<form method ='post' action = 'index.php'>
			<input type ='hidden' name ='courriel' value ='$courriel' />
			<input type ='hidden' name ='message' value ='$message' />	
			<input type = 'hidden' name ='nom' value='$nom'> 
	    	<input type = 'hidden' name ='antispam' value='$antispam'>    		
			<button type = 'submit'>Retour</button>
		</form>";		
}	
else
{
	$email_message = "D&eacute;tails du formulaire envoy&eacute; ci-dessous.\n\n"; 
	$email_message .= "Courriel: $courriel\n";
   $email_message .= "Nom: $nom";
   $email_message .= "Message:$message\n "; 
   print "$email_message";
}
	
?>

Re: Aide pour formulaire svp

par Doula-Die » 16 juin 2013, 01:19

SIRAKAWA... laissez tomber.

J'ai réglé mon problème.

MERCI INFINIMENT POUR VOS EXPLICATIONS.

Re: Aide pour formulaire svp

par Doula-Die » 15 juin 2013, 14:21

J'ai vu le site que je suppose être un php partagé avec d'autres. Donc inutile de suggérer de changer de version de php....
Effectivement. Le site est en html avec un style css - aucun php dans le site si ce n'est le traitement du formulaire.

Re: Aide pour formulaire svp

par sirakawa » 15 juin 2013, 14:12

filter_var est disponible à partir de php 5.2
J'ai vu le site que je suppose être un php partagé avec d'autres. Donc inutile de suggérer de changer de version de php....
Je vais voir à trouver un substitut.
Les lignes qui se ressemblent ont des buts différents.

Re: Aide pour formulaire svp

par Doula-Die » 15 juin 2013, 13:29

Un gros merci Sirakawa pour votre aide si appréciée.

J'ai intégré vos codes dans mes deux fichiers que j'ai nommés "form.php" et "traite.php"
Voir le formulaire en ligne ici: http://forum55plus.ca/form.php
Vous pouvez le tester si vous le désirez.

J'obtiens le message d'erreur: Fatal error: Call to undefined function: filter_var() in /home2/ldxxx/public_html/traite.php on line 107

Je vous donne les codes des lignes 106 à 113 car je pense voir l'erreur mais je n'ose la corriger moi-même ne sachant quelle ligne garder.
  
106 - $courriel = isset($_POST['courriel'])? $_POST['courriel']: "";
107 - $courriel = filter_var($courriel, FILTER_SANITIZE_EMAIL);
108 - $courrier = filter_var($_POST['courriel'], FILTER_VALIDATE_EMAIL); 
109 - $message = isset($_POST['message'])? $_POST['message']: "";     
110 - $nom = isset($_POST['nom'])? $_POST['nom']: ""; 
111 - $antispam = isset($_POST['antispam'])? $_POST['antispam']: "";          
112 - $c_rendu = ""; //le compte-rendu d'erreur
113 - $erreur = false; //boolꦮ juste en cas d'erreur 
On dirait qu'il y a 2 lignes similaires à 107 et 108:
$courriel = filter_var($courriel, FILTER_SANITIZE_EMAIL);
$courrier = filter_var($_POST['courriel'], FILTER_VALIDATE_EMAIL);

Re: Aide pour formulaire svp

par sirakawa » 15 juin 2013, 09:46

Voici une suggestion:
index.php
 <?PHP
 	/*On récupère les valeurs repassées par traite.php en cas d'erreur. Sinon les variables sont vides*/
	$courriel = isset($_POST['courriel'])? $_POST['courriel'] : "";
	$message = isset($_POST['message'])? $_POST['message'] : "";
	$nom = isset($_POST['nom'])? $_POST['nom']: "";	
	$antispam = isset($_POST['antispam'])? $_POST['antispam']: "";	 
	/*Formulaire standard*/	
	 print "
	 <form method = 'post' action='traite.php'>
			<label for 'courriel'>Courriel</label> 
			  <input type = 'text' name ='courriel' value='$courriel'>
			<label for 'message'>Message</label>  
			  <textarea name ='message'>$message</textarea>
			<label for 'nom'>Nom</label> 
			    <input type = 'text' name ='nom' value='$nom'> 
			<label for 'antispam'>Antispam</label> 
			    <input type = 'text' name ='antispam' value='$antispam'>    
			<button type ='submit'>Envoyer</button>
	  </form>";
  ?>
traite.php
 <?php
 	/* $courriel est la valeur passée.
 	$courrier contient la même valeur si le le couriel est bien formé  ou false si le courriel est mal formé
 	*/
 	$courriel = isset($_POST['courriel'])? $_POST['courriel']: "";
 	$courriel = filter_var($courriel, FILTER_SANITIZE_EMAIL);
 	$courrier = filter_var($_POST['courriel'], FILTER_VALIDATE_EMAIL); 
  	$message = isset($_POST['message'])? $_POST['message']: "";	
  	$nom = isset($_POST['nom'])? $_POST['nom']: "";	
  	$antispam = isset($_POST['antispam'])? $_POST['antispam']: "";	 	
  	$c_rendu = ""; //le compte-rendu d'erreur
  	$erreur = false; //booléen juste en cas d'erreur
  	
if ($courrier === false)
{
	$c_rendu = "<p>Votre adresse &eacute;lectronique est incorrecte. Elle doit &ecirc;tre de la forme nom@hote ";
	$erreur = true;
}
	
if (($message == "") or (strlen ($message)< 15)) //message absent ou trop court
{
echo (strlen($message));	
	$c_rendu .= "<p>Votre message est absent ou trop court.";
	$erreur = true;
}
else
{
	$message = filter_var($message,FILTER_SANITIZE_STRING);
}

if (($nom == "") or (strlen ($nom ) < 5)) //nom absent ou trop court
{
	$c_rendu .= "<p>Votre nom est absent ou trop court.";
	$erreur = true;
}
else
{
	$nom = filter_var($nom,FILTER_SANITIZE_STRING);
}

if ($antispam != "SEIZE") //nom absent ou trop court
{
	$c_rendu .= "<p>Antispam incorrect.";
	$erreur = true;
}

if ($erreur === true)
{
		/*En cas d'erreur ce formulaire repasse les valeurs à index.php */
		print "
		$c_rendu
		<form method ='post' action = 'index.php'>
			<input type ='hidden' name ='courriel' value ='$courriel' />
			<input type ='hidden' name ='message' value ='$message' />	
			<input type = 'hidden' name ='nom' value='$nom'> 
	    	<input type = 'hidden' name ='antispam' value='$antispam'>    		
			<button type = 'submit'>Retour</button>
		</form>";		
}	
else
{
	$email_message = "D&eacute;tails du formulaire envoy&eacute; ci-dessous.\n\n"; 
	$email_message .= "Courriel: $courriel\n";
   $email_message .= "Nom: $nom";
   $email_message .= "Message:$message\n "; 
   print "$email_message";
}
	
?>

Re: Aide pour formulaire svp

par Doula-Die » 14 juin 2013, 17:42

La priorité pour qu'ils complètent les cases ?

Bien... je dirais:
1) adresse courriel car sans adresse impossible de leur répondre
2) commentaires car sans message, je ne peux les aider
3) leur nom ou pseudo mais c'est moins important
4) la question antispam

Quant à ton "Le code existant est assez bancal."
Je n'en n'ai aucune idée... comme j'ai dit dès mon premier message, je ne connais rien en php. C'est quelqu'un d'autre qui me l'a fait.

Re: Aide pour formulaire svp

par sirakawa » 14 juin 2013, 17:37

Le code existant est assez bancal.
Tous les champs doivent être remplis, mais quelle est la priorité car c'est important pour architecturer les tests et personnaliser les messages?
au passage j'ai repéré une erreur (ici je crois sinon c'est analogue):
$error_message .='La question antispam n'est pas valide.<br />'; // il faut encadrer avec des quotes doubles pour permettre le passage de l'apostrophe.

Re: Aide pour formulaire svp

par Doula-Die » 14 juin 2013, 17:00

Mais oui, le même message d'ailleurs.
J'ai modifié tel que suggéré mais même message d'erreur, ie à la même ligne 150.

Re: Aide pour formulaire svp

par Spols » 14 juin 2013, 16:47

As tu encore des messages d'erreurs ?

Re: Aide pour formulaire svp

par Doula-Die » 14 juin 2013, 16:31

75 lignes c'est pas énorme, mais si le problème est à la ligne 150 je vois pas comment tu peux n'en avoir que 75
Bonne déduction mon cher Watson !

C'est que j'ai le design de ma page + le style css au début et en pied de page. Alors si vous n'y voyez pas d'inconvénients pour 75 lignes (pas tous les forums qui le permettent) je me lance...
 <?php 
if(isset($_POST['courriel'])) { 

   // EDIT THE 2 LINES BELOW AS REQUIRED 
   $email_to = "[email protected]"; 
   $email_subject = "Commentaires pour Forum55plus"; 


   function died($error) { 
      // your error code can go here 
      echo "D&eacute;sol&eacute;e mais il semble y avoir erreur dans le formulaire. "; 
      echo $error."<br /><br />"; 
      echo "SVP retourner au formulaire en utilisant le bouton retour dans votre barre d'outils en haut pour conserver vos donn&eacute;es.<br /><br />"; 
      die(); 
   } 

   // validation expected data exists 
  if(!isset($_POST['courriel']) || 
      !isset($_POST['nom']) || 
      !isset($_POST['message']) || //ICI il manquait un "OR" (||)
           !isset($_POST['antispam']))
           {
       died('Tous les champs sont obligatoires.'); 
   } 
   $courriel = $_POST['courriel']; //required
    $nom = $_POST['nom']; //required
    $message = $_POST['message']; //required
    $antispam = $_POST['antispam']; //required

   extract($_POST); 
   //print_r($_POST); 

   if($_POST['antispam'] == 'SEIZE')
   {
   $error_message = ""; 
   $email_exp = "^[A-Z0-9._%-]+@[A-Z0-9.-]+\.[A-Z]{2,4}$"; 
   if(!eregi($email_exp,$courriel)) { 
      $error_message .= 'V&eacute;rifiez votre adresse courriel.<br />'; 
   } 
   $string_exp = "^[a-z .'-]+$"; 
   if(!eregi($string_exp,$nom)) { 
      $error_message .= 'V&eacute;rifiez votre nom ou pseudo.<br />'; 
   } 
   if(strlen($message) < 2) { 
      $error_message .= 'Aucun message inscrit.<br />';  
   } 
    if($antispam != $antispam_answer) {
    $error_message .='La question antispam n'est pas valide.<br />';

   if(strlen($error_message) > 0) { 
      died($error_message); 
   } 
   $email_message = "D&eacute;tails du formulaire envoy&eacute; ci-dessous.\n\n"; 

   function clean_string($string) { 
      $bad = array("content-type","bcc:","to:","cc:","href"); 
      return str_replace($bad,"",stripslashes($string)); 
   } 

   $email_message .= "Courriel: ".clean_string($courriel)."\n"; 
   $email_message .= "Nom: ".clean_string($nom)."\n"; 
   $email_message .= "Message: ".clean_string($message)."\n"; 


   // create email headers 
   $headers = 'From: '.$courriel."\r\n". 
   'Reply-To: '.$courriel."\r\n" . 
   'X-Mailer: PHP/' . phpversion(); 
   mail($email_to, $email_subject, $email_message, $headers);
   }
   else
   {
      died('Mauvaise r�ponse antispam!'); 
   }   
} 
?>

Re: Aide pour formulaire svp

par Spols » 14 juin 2013, 16:10

J'ai vu un autre truc

si tu ouvre une chaine caractère avec des simple quote, tu dois échapper ceux qui ne termine pas ta chaine, ainsi n'est devient n\'est

PS sans doute que <> fontionne aussi en php si l'erreur ne vient pas de là mais je ne l'ai jamais utilisé
   if($antispam != $antispam_answer) {
   $error_message .='La question antispam n\'est pas valide.<br />';
75 lignes c'est pas énorme, mais si le problème est à la ligne 150 je vois pas comment tu peux n'en avoir que 75

Re: Aide pour formulaire svp

par Doula-Die » 14 juin 2013, 15:14

J'ai modifié tel que suggéré mais même message d'erreur, ie à la même ligne 150.

Je voudrais bien vous donner le code complet de mon send_form_email mais il fait 75 lignes. C'est gros pour mettre ici, non ?

Re: Aide pour formulaire svp

par Spols » 14 juin 2013, 14:29

Mais si, il y a juste d'autre erreur, cette fois c'est <> qui ne veut rien dire en php,

différent de s'écrit != ou !==
   if($antispam != $antispam_answer) {
   $error_message .='La question antispam n'est pas valide.<br />';
rendez vous au message suivant