Discussion:
formulaire contact
(trop ancien pour répondre)
cirion
2009-09-26 09:53:30 UTC
Permalink
bonjour,
j'ai récupéré un script permettant l'envoi de message vers ma boite
mail suite a un formulaire mais franchement je le trouve pas très bien
fichu... J'aurais aimé que quelqu'un puisse me corriger les petites
fautes "gout", par exemple:
plutôt que d'afficher une nouvelle page pour confirmer l'envoi ou
noter une erreur dans le formulaire (ou un champ non rempli, que ce
soit un message qui affiche l'information désiré. Ceci éviterai aussi
que la personne ai à re-remplir le formulaire en entier si un erreur
survenait... bref, arranger un peu ce script!
merci d'avance pour votre aide!

le code (avec les annotations) :

<?php

/*

********************************************************************************************
CONFIGURATION

********************************************************************************************
*/
// destinataire est votre adresse mail. Pour envoyer à plusieurs à la
fois, séparez-les par une virgule
$destinataire = 'adresse email';

// copie ? (envoie une copie au visiteur)
$copie = 'non'; // 'oui' ou 'non'

// Messages de confirmation du mail
$message_envoye = "Votre message a bien &eacute;t&eacute;
envoy&eacute; !";
$message_non_envoye = "L'envoi du mail a &eacute;chou&eacute;,
veuillez r&eacute;essayer SVP.";

// Messages d'erreur du formulaire
$message_erreur_formulaire = "Vous devez d'abord <a href\"contact.html\">envoyer le formulaire</a>.";
$message_formulaire_invalide = "Vérifiez que tous les champs soient
bien remplis et que l'email soit sans erreur.";

/*

********************************************************************************************
FIN DE LA CONFIGURATION

********************************************************************************************
*/

// on teste si le formulaire a été soumis
if (!isset($_POST['envoi']))
{
// formulaire non envoyé
echo '<p>'.$message_erreur_formulaire.'</p>'."\n";
}
else
{
/*
* cette fonction sert à nettoyer et enregistrer un texte
*/
function Rec($text)
{
$text = trim($text); // delete white spaces after & before text
if (1 === get_magic_quotes_gpc())
{
$stripslashes = create_function('$txt', 'return stripslashes
($txt);');
}
else
{
$stripslashes = create_function('$txt', 'return $txt;');
}

// magic quotes ?
$text = $stripslashes($text);
$text = htmlspecialchars($text, ENT_QUOTES); // converts to string
with " and ' as well
$text = nl2br($text);
return $text;
};

/*
* Cette fonction sert à vérifier la syntaxe d'un email
*/
function IsEmail($email)
{
$pattern = "^([a-z0-9_]|\\-|\\.)+@(([a-z0-9_]|\\-)+\\.)+[a-z]
{2,7}$";
return (eregi($pattern,$email)) ? true : false;
};

// formulaire envoyé, on récupère tous les champs.
$nom = (isset($_POST['nom'])) ? Rec($_POST['nom']) : '';
$email = (isset($_POST['email'])) ? Rec($_POST['email']) : '';
$objet = (isset($_POST['objet'])) ? Rec($_POST['objet']) : '';
$message = (isset($_POST['message'])) ? Rec($_POST['message']) : '';

// On va vérifier les variables et l'email ...
$email = (IsEmail($email)) ? $email : ''; // soit l'email est vide
si erroné, soit il vaut l'email entré

if (($nom != '') && ($email != '') && ($objet != '') && ($message !''))
{
// les 4 variables sont remplies, on génère puis envoie le mail
$headers = 'From: '.$nom.' <'.$email.'>' . "\r\n";

// envoyer une copie au visiteur ?
if ($copie == 'oui')
{
$cible = $destinataire.','.$email;
}
else
{
$cible = $destinataire;
};

// Remplacement de certains caractères spéciaux
$message = str_replace("&#039;","'",$message);
$message = str_replace("&#8217;","'",$message);
$message = str_replace("&quot;",'"',$message);
$message = str_replace('<br>','',$message);
$message = str_replace('<br />','',$message);
$message = str_replace("&lt;","<",$message);
$message = str_replace("&gt;",">",$message);
$message = str_replace("&amp;","&",$message);

// Envoi du mail
if (mail($cible, $objet, $message, $headers))
{
echo '<p>'.$message_envoye.'</p>'."\n";
}
else
{
echo '<p>'.$message_non_envoye.'</p>'."\n";
};
}
else
{
// une des 3 variables (ou plus) est vide ...
echo '<p>'.$message_formulaire_invalide.' <a
href="contact.html">Retour au formulaire</a></p>'."\n";
};
}; // fin du if (!isset($_POST['envoi']))
?>
Olivier Miakinen
2009-09-27 21:09:16 UTC
Permalink
Bonjour,
Post by cirion
j'ai récupéré un script permettant l'envoi de message vers ma boite
mail suite a un formulaire mais franchement je le trouve pas très bien
fichu... J'aurais aimé que quelqu'un puisse me corriger les petites
plutôt que d'afficher une nouvelle page pour confirmer l'envoi ou
noter une erreur dans le formulaire (ou un champ non rempli, que ce
soit un message qui affiche l'information désiré. Ceci éviterai aussi
que la personne ai à re-remplir le formulaire en entier si un erreur
survenait... bref, arranger un peu ce script!
Je vais jeter un coup d'œil, mais n'attends pas des miracles car je ne
fais pas tellement ce genre de choses.
Post by cirion
[...]
$message_envoye = "Votre message a bien &eacute;t&eacute; envoy&eacute; !";
[...]
$message_formulaire_invalide = "Vérifiez que [...]";
À partir du moment où tu as ne serait-ce qu'un seul caractère non ascii
(le « é » de « vérifier »), tu es obligé de préciser le charset comme il
faut, et du coup du peux te dispenser de tous les « &eacute; » qui se
trouvent ailleurs dans cette page. Ce sera beaucoup plus lisible.
Post by cirion
[...]
// on teste si le formulaire a été soumis
if (!isset($_POST['envoi']))
{
Je ne sais pas quelle est la logique exacte de ce champ 'envoi' qui est
testé uniquement pour savoir s'il est présent ou pas. En principe,
j'imagine qu'on teste plutôt les champs utiles ('nom', 'email', etc.)
et qu'on continue de présenter la page jusqu'à ce que tous les champs
obligatoires soient remplis.
Post by cirion
// formulaire non envoyé
echo '<p>'.$message_erreur_formulaire.'</p>'."\n";
Juste une remarque d'ordre esthétique, mais tu as tout à fait le droit
de ne pas être d'accord avec moi : personnellement je préfère écrire
echo "<p>$message_erreur_formulaire</p>\n";
que je trouve plus concis. Cela dit, il y a de farouches opposants à
cette façon de faire car ils trouvent que c'est moins lisible ou qu'il
est plus facile de faire des erreurs avec ça.
Post by cirion
/*
* Cette fonction sert à vérifier la syntaxe d'un email
*/
function IsEmail($email)
{
return (eregi($pattern,$email)) ? true : false;
AAAARGH !

S'il y a *un* point sur lequel tu dois changer quelque chose, c'est bien
la regexp de validation des adresses e-mail. Note que je ne suis pas
surpris : je pense que plus de 95 % des regexp proposées ici ou là pour
cette vérification sont erronées, refusant un particulier certaines
longueurs de TLD (domaine de premier niveau) et surtout interdisant le
caractère « + » dans la partie gauche alors qu'il est si utile !

Je passerai sur la façon bizarre d'écrire ([a-z0-9_]|\\-|\\.) au lieu de
[.a-z0-9_-] et je te conseille juste de lire le chapitre correspondant
dans la FAQ de ce groupe : <http://faqfclphp.free.fr/#rub5.3> (tu peux
te dispenser de tout le laïus, et ne garder que la regexp qui te plaît
parmi celles proposées).
Post by cirion
};
Ah, tiens, je n'avais pas vu que tu faisais suivre la plupart de tes
accolades fermantes d'un point-virgule. C'est parfaitement inutile (et
même nuisible si jamais tu en laissais traîner un par erreur avant un
« else » dans des structures if imbriquées).
Post by cirion
// On va vérifier les variables et l'email ...
$email = (IsEmail($email)) ? $email : ''; // soit l'email est vide
si erroné, soit il vaut l'email entré
Tu souhaites (et tu as 100 % raison) que l'utilisateur n'ait pas à
ressaisir les champs du formulaire lorsqu'il fait une erreur. Ceci vaut
pour l'adresse de courriel : ainsi, lorsque tu réaffiches le formulaire,
tu devras utiliser Rec($_POST['email']) plutôt que $email si tu l'as
écrasé comme ci-dessus.

En effet, si l'utilisateur a tapé par erreur om+newsàmiakinen.net, c'est
sympa de lui laisser ce texte où il n'a plus qu'à remplacer « à » par
Post by cirion
if (($nom != '') && ($email != '') && ($objet != '') && ($message !''))
{
// les 4 variables sont remplies, on génère puis envoie le mail
$headers = 'From: '.$nom.' <'.$email.'>' . "\r\n";
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARGH !!!!

Ne JAMAIS mettre dans les entêtes d'un courriel généré automatiquement
des données non vérifiées qui viennent de l'extérieur ! Grâce à ton
formulaire, un spammeur peut te faire envoyer des spams pour n'importe
quel produit, à raison de plusieurs milliers de destinataires par
requête http.

Donc :
$headers = "From: cirion <***@example.com>\n";

$msg = "Message envoyé par $nom <$email>\n";
$msg .= "L'objet est $objet\n";
$msg .= "Contenu du message :\n";
$msg .= $message;
...
Post by cirion
// envoyer une copie au visiteur ?
if ($copie == 'oui')
{
$cible = $destinataire.','.$email;
Oui, éventuellement, étant entendu que $destinataire est codé en dur
dans le code, et que $email a été vérifié comme portant une et une seule
adresse de courriel. Il serait bien aussi d'avoir un test qui évite les
rafales d'envois, toujours pour éviter le spam ou du moins le flood.
Post by cirion
// Remplacement de certains caractères spéciaux
$message = str_replace("&#039;","'",$message);
$message = str_replace("&#8217;","'",$message);
$message = str_replace("&quot;",'"',$message);
$message = str_replace('<br>','',$message);
$message = str_replace('<br />','',$message);
$message = str_replace("&lt;","<",$message);
$message = str_replace("&amp;","&",$message);
Ah tiens, c'est vrai, tu as fait un htmlspecialchars plus haut, je viens
seulement de le voir. Bon, eh bien je pense que c'était une mauvaise
idée : il vaudrait mieux ne le faire qu'au moment de l'affichage, ce qui
t'évite d'avoir à faire tous ces str_replace ici (surtout si le charset
de ta page est UTF-8).
Post by cirion
// une des 3 variables (ou plus) est vide ...
echo '<p>'.$message_formulaire_invalide.' <a
href="contact.html">Retour au formulaire</a></p>'."\n";
Ah, si je comprends bien c'est ici qu'est la principale raison pour
laquelle l'utilisateur doit tout retaper en cas d'erreur de saisie :
c'est parce que tu lui imposes de cliquer sur un lien alors que ça
devrait être le même script qui affiche et traite le formulaire.

En gros, ta page devrait ressembler à ceci :

tester $_REQUEST['nom'], $_REQUEST['email'], etc.
si OK {
envoyer le courriel
} sinon {
<p>Le formulaire est incomplet</p>
<form ...>
<input ... $_REQUEST['nom'] ...>
<input ... $_REQUEST['email'] ...>
...
</form>
}

Cordialement,
--
Olivier Miakinen
Continuer la lecture sur narkive:
Loading...