JumpTop

[PHP] Formulaire de contact avec champs obligatoires

Au travers de ce billet je vais vous expliquer comment créer un formulaire de contact avec remplissage obligatoire de certain champs et affichage de messages d’erreur si les champs en question ne sont pas renseignés. Le formulaire qui va suivre, va comporter, un champ civilité, nom, prénom, adresse, code postal, ville, email, téléphone et message. Avec comme champs obligatoires : civilité, nom, email et message.

Etape 1

Il faut commencer par créer votre page ou le formulaire va apparaître. Une fois cette étape bouclée, il faut mettre en haut de la page avant la balise « html » ce code :

<?php
// Couleur du texte des champs si erreur saisie 
$color_font_warn="#FF0000";
// Couleur de fond des champs si erreur saisie 
$color_form_warn="#FFCC66";
// Champs
$list['f_1']=array("Sélectionnez","Mademoiselle"," Madame"," Monsieur");
if(isset($_POST['submit'])){
	$erreur="";
	// Nettoyage
	while(list($var,$val)=each($_POST)){
	if(!is_array($val)){
		$$var=strip_tags($val);
	}else{
		while(list($arvar,$arval)=each($val)){
				$$var[$arvar]=strip_tags($arval);
			}
		}
	}
	// Formatage
	$f_2=trim(ucwords(eregi_replace("[^a-zA-Z0-9éèà‚Äö?Ñ??Ä?ú\ -]", "", $f_2)));
	$f_3=trim(ucwords(eregi_replace("[^a-zA-Z0-9éèà‚Äö?Ñ??Ä?ú\ -]", "", $f_3)));
	$f_4=trim(ucwords(eregi_replace("[^a-zA-Z0-9éèà‚Äö?Ñ??Ä?ú\ -]", "", $f_4)));
	$f_5=trim(eregi_replace("[^0-9+]", "", $f_5));
	$f_6=trim(ucwords(eregi_replace("[^a-zA-Z0-9éèà‚Äö?Ñ??Ä?ú\ -]", "", $f_6)));
	$f_7=strip_tags(trim($f_7));
	$f_8=trim(eregi_replace("[^0-9\ +]", "", $f_8));
	// Verification
	if($f_1==0){
		$erreur.="<li><span class='txterror'>Le champ &laquo; Civilité &raquo; n'a pas été défini.</span>";
		$errf_1=1;
	}
	if(strlen($f_2)<2){
		$erreur.="<li><span class='txterror'>Le champ &laquo; Nom &raquo; est vide ou incomplet.</span>";
		$errf_2=1;
	}
	if(strlen($f_7)<2){
		$erreur.="<li><span class='txterror'>Le champ &laquo; Email &raquo; est vide ou incomplet.</span>";
		$errf_7=1;
	}else{
		if(!ereg('^[-!#$%&\'*+\./0-9=?A-Z^_`a-z{|}~]+'.
		'@'.
		'[-!#$%&\'*+\/0-9=?A-Z^_`a-z{|}~]+\.'.
		'[-!#$%&\'*+\./0-9=?A-Z^_`a-z{|}~]+$',
		$f_7)){
			$erreur.="<li><span class='txterror'>La syntaxe de votre adresse e-mail n'est pas correcte.</span>";
			$errf_7=1;
		}
	}
	if(strlen($f_9)<2){
		$erreur.="<li><span class='txterror'>Le champ &laquo; Message &raquo; est vide ou incomplet.</span>";
		$errf_9=1;
	}
	if($erreur==""){
		// Création du message
		$titre="Un message est la";
		$tete="Depuis:Site@Jonathan-menet.fr\n";
		$corps.="Civilité : ".$list['f_1'][$f_1]."\n";
		$corps.="Nom : ".$f_2."\n";
		$corps.="Prénom : ".$f_3."\n";
		$corps.="Adresse : ".$f_4."\n";
		$corps.="Code postal : ".$f_5."\n";
		$corps.="Ville : ".$f_6."\n";
		$corps.="Email : ".$f_7."\n";
		$corps.="Téléphone : ".$f_8."\n";
		$corps.="Message : ".$f_9."\n";
		if(mail("votreadresse@personnelle.fr", $titre, stripslashes($corps), $tete)){
			$ok_mail="true";
		}else{
			$erreur.="<li><span class='txterror'>Une erreur est survenue lors de l'envoi du message, veuillez refaire une tentative.</span>";
		}
	}
}
?>

Etape 2

Ensuite il faut insérer entre les balises « head et « /head » le code qui suit, qui correspond à la mise en forme :

<style type="text/css" media="screen"><!--
INPUT { color: #000; font-size: 11px; font-family: verdana, Arial, Helvetica, Geneva, Swiss, SunSans-Regular; background-color: #EEEEEE }
SELECT { color: #000; font-size: 11px; font-family: verdana, Arial, Helvetica, Geneva, Swiss, SunSans-Regular; background-color: #EEEEEE }
TEXTAREA { color: #000; font-size: 11px; font-family: verdana, Arial, Helvetica, Geneva, Swiss, SunSans-Regular; background-color: #EEEEEE }
.txterror { color: black; font-size: 11px; font-family: Verdana, Arial, Helvetica, Geneva, Swiss, SunSans-Regular }
.txtform { color: black; font-size: 12px; font-family: Verdana, Arial, Helvetica, Geneva, Swiss, SunSans-Regular }
--></style>

Etape 3

Maintenant, il faut mettre le code qui suit entre les balises « body » et « /body », c’est le formulaire en question avec ses différents champs.

<? if($ok_mail=="true"){ ?>
	<table width='100%' border='0' cellspacing='1' cellpadding='1'>
		<tr><td><span class='txtform'>Le message ci-dessous nous a bien été transmis, merci.</span></td></tr>
		<tr><td>&nbsp;</td></tr>
		<tr><td><tt><?echo nl2br(stripslashes($corps));?></tt></td></tr>
		<tr><td>&nbsp;</td></tr>
		<tr><td><span class='txtform'>Nous allons y répondre le plus vite possible.<br>A bientôt.</span></td></tr>
	</table>
<? }else{ ?>
<form action='<? echo $PHP_SELF ?>' method='post' name='Form'>
<table width='100%' border='0' cellspacing='1' cellpadding='1'>
<? if($erreur){ ?><tr><td colspan='2' bgcolor='red'><span class='txterror'><font color='white'><b>&nbsp;ERREUR, votre message n'a pas été transmis</b></font></span></td></tr><tr><td colspan='2'><ul><?echo$erreur?></ul></td></tr><?}?>
<tr><td colspan='2'><span class='txterror'>Les champs marqué d'un * sont obligatoires</span></td></tr>
<tr><td align='right' width='30%'><span class='txtform'>Civilité* :</span></td><td><select style='width:200 <?if($errf_1==1){print("; background-color: ".$color_form_warn."; color: ".$color_font_warn);}?>;' name='f_1' size='1'>
<? for($id=0;$id<count($list['f_1']);$id++){
if($id==$f_1){$ct="selected";}
print("<option ".$ct." value=".$id.">".$list['f_1'][$id]."</option>");
unset($ct);
}?>
</select></td></tr>
<tr><td align='right' width='30%'><span class='txtform'>Nom* :</span></td><td><input type='text' style='width:200 <?if($errf_2==1){print("; background-color: ".$color_form_warn."; color: ".$color_font_warn);}?>;' name='f_2' value='<?echo stripslashes($f_2);?>' size='24' border='0'></td></tr>
<tr><td align='right' width='30%'><span class='txtform'>Prénom :</span></td><td><input type='text' style='width:200 <?if($errf_3==1){print("; background-color: ".$color_form_warn."; color: ".$color_font_warn);}?>;' name='f_3' value='<?echo stripslashes($f_3);?>' size='24' border='0'></td></tr>
<tr><td align='right' width='30%'><span class='txtform'>Adresse :</span></td><td><input type='text' style='width:200 <?if($errf_4==1){print("; background-color: ".$color_form_warn."; color: ".$color_font_warn);}?>;' name='f_4' value='<?echo stripslashes($f_4);?>' size='24' border='0'></td></tr>
<tr><td align='right' width='30%'><span class='txtform'>Code postal :</span></td><td><input type='text' style='width:200 <?if($errf_5==1){print("; background-color: ".$color_form_warn."; color: ".$color_font_warn);}?>;' name='f_5' value='<?echo stripslashes($f_5);?>' size='24' border='0'></td></tr>
<tr><td align='right' width='30%'><span class='txtform'>Ville :</span></td><td><input type='text' style='width:200 <?if($errf_6==1){print("; background-color: ".$color_form_warn."; color: ".$color_font_warn);}?>;' name='f_6' value='<?echo stripslashes($f_6);?>' size='24' border='0'></td></tr>
<tr><td align='right' width='30%'><span class='txtform'>Email* :</span></td><td><input type='text' style='width:200 <?if($errf_7==1){print("; background-color: ".$color_form_warn."; color: ".$color_font_warn);}?>;' name='f_7' value='<?echo stripslashes($f_7);?>' size='24' border='0'></td></tr>
<tr><td align='right' width='30%'><span class='txtform'>Téléphone :</span></td><td><input type='text' style='width:200 <?if($errf_8==1){print("; background-color: ".$color_form_warn."; color: ".$color_font_warn);}?>;' name='f_8' value='<?echo stripslashes($f_8);?>' size='24' border='0'></td></tr>
<tr><td align='right' width='30%'><span class='txtform'>Message* :</span></td><td><textarea style='width:360 <?if($errf_9==1){print("; background-color: ".$color_form_warn."; color: ".$color_font_warn);}?>;' name='f_9' rows='6' cols='40'><?echo$f_9?></textarea></td></tr>
<tr><td align='right' width='30%'></td><td><input type='submit' name='submit' value='Envoyer' border='0'></td></tr>
</table>
</form>
<? } ?>

Et voilà, c’est fait, vous souhaitez tester ?

DEMO : Tester le formulaire
TELECHARGER LA SOURCE : Formulaire.zip






L'auteur de l'article
, Directeur Artistique, Webdesigner. Vous pouvez voir mes travaux sur mon folio, ou me suivre sur mon Twitter.



46 commentaires

  1. 1 VéroniqueNo Gravatar dit :

    Merci, je l’ai « appris » une fois, mais, ton billet va direct dans mes favoris, bien besoin de ce genre de chose.

  2. 2 FabioNo Gravatar dit :

    Excellent et trés pratique !

  3. 3 NeoStingNo Gravatar dit :

    Pour ceux qui utilisent WordPress, il y a un plugin qui le fait trés bien et assez facilement il s’appelle Contact Form. j’en parle vite-fait ici, en attendant prochainement de remettre à jour mon listing qui a clairement beaucoup évolué. http://www.neosting-press.fr/archives/8

  4. 4 John's GraphismeNo Gravatar dit :

    >> Neosting : oui, c’est vrai, mais, je dirais que pour les formulaires de contact sous wordpress, le must c’est « Cform 2″, qui est pas mal du tout …

  5. 5 AurélienNo Gravatar dit :

    Sympa ce tuto, j’utilise aussi cForm 2 qui est assez sympa et trés rapide à installer. Mais c’est de la feignantise, c’est plus gratifiant quand c’est fait par soit même, mais il y’a tellement de travail lol.

    Et chapeau pour l’image illustrant l’article dans ton sommaire, trés bien choisie, j’ai cliquer dessus presque par automatisme :D

  6. 6 MickNo Gravatar dit :

    Merci!
    Trés bien votre formulaire !
    Cela va m’aider à mieux comprendre le fonctionnement, je débute en php.

  7. 7 EricNo Gravatar dit :

    Bonjour,
    J’ai installé le script de contact nickel, j’ai bien rentré l’adresse mail mais je re??üois pas les mail ?
    Merci d’avance pour les reponses

  8. 8 John's GraphismeNo Gravatar dit :

    >> Eric : je ne sais pas pourquoi ca ne fonctionne pas, je l’ai testé plusieurs fois, et je l’utilise sur plusieurs de mes sites et tout fonctionne à la perfection, essayer de revoir ce que vous avez mis dans le mail…

  9. 9 PhiliphotoNo Gravatar dit :

    Cool ! Nickel ce tuto !

    C’est propre, et ça fonctionne très bien !

    Je suis en train d’apprendre php et c’est un bonheur de pouvoir avoir un tuto bien commenté ! MERCI !

    Philippe.

  10. 10 SimonNo Gravatar dit :

    MEEEERRRRRCIIIIIIII !!!!!!!!!!!!!!!!!

  11. 11 John's GraphismeNo Gravatar dit :

    >> Simon : mais de rien, je suis content que le tuto te plaise.

  12. 12 JackNo Gravatar dit :

    Salut ton script m’a bien aidé. merci :D

  13. 13 John's GraphismeNo Gravatar dit :

    >> Jack : impeccable, c’est le principal ;-)

  14. 14 lbsquatNo Gravatar dit :

    Merci!!! Une pure merveille ce formulaire :)

  15. 15 la ptioteNo Gravatar dit :

    Bonjour et merci pour ce formulaire qui est vraiment sympa
    et propre.

    J’ai cependant 2 questions

    1/Lorsque le message arrive dans ma boite mail (outlook) j’ai un pb d’encodage des accents
    ex : Société pour Société

    2/ Comment rendre obligatoire le « remplissage » de bouton radio ?
    Merci de votre aide

  16. 16 John's GraphismeNo Gravatar dit :

    @la ptiote : il faut bien veiller à remplacer les accents par les chaines de caractères reconnus ;-)

  17. 17 odzywkiNo Gravatar dit :

    It’s really a great and useful piece of info. I’m glad that you shared this helpful info with us. Please keep us up to date like this. Thanks for sharing.

  18. 18 John's GraphismeNo Gravatar dit :

    @odzywki : you’re welcome ;-)

  19. 19 MacNo Gravatar dit :

    Bonjour,

    Le script marche à merveille mais je souhaiterai que le nom soit souligné dans mail de réception. Je bloque à ce niveau là.
    Merci par avance pour vos lumières.
    Mac

  20. 20 MikNo Gravatar dit :

    Salut j’ai un soucis avec ton code, qd je clique sur envoyer je tombe sur une page blanche !!!

    Merci

  21. 21 wubijacqNo Gravatar dit :

    DEMO: Tester le formulaire
    comme ça on comprend déjà beaucoup mieux
    et on voit que la page est en PHP. Bien expliqué super helper

  22. 22 AbderNo Gravatar dit :

    Bonjour,

    Votre formulaire est fantastique, rien à dire. Je suis cependant entrain de m’arracher les cheveux depuis un bon moment déjà pour trouver comment faire en sorte que les messages reçus contiennent les accents et non des caractères spéciaux ! Je vous assure que j’en peux plus de fouiller, je ne trouve pas du tout la solution malgré le conseil que vous avez donné de bien veiller à remplacer les accents par la chaine de caractères, c’est à dire ? John merci de m’aider s’il vous plaît: AU SECOURRRRS !!!!

  23. 23 John's GraphismeNo Gravatar dit :

    @Abder : salut, je suis content que le formulaire te plaise. Pour ce qui est des accents il faut que tu remplaces les accents par ce type de chose, regardes ce tableau : http://www.scriptol.fr/creation-site-web/accents-html.php

    J’espère que cela t’aide.

  24. 24 Advanced SitesubmitterNo Gravatar dit :

    I would like to show my thanks to this writer for rescuing me from this particular dilemma. As a result of exploring throughout the world-wide-web and obtaining suggestions which were not pleasant, I was thinking my life was over. Being alive minus the answers to the issues you’ve solved by means of your good short article is a critical case, as well as ones that might have adversely affected my entire career if I hadn’t discovered your web site.

  25. 25 GauthNo Gravatar dit :

    Salut! Merci pour ton formulaire très pratique; Je veux juste savoir comment ajouter d’autres zones de liste déroulante. Merci, merci, merci, merci

  26. 26 Tragamoneda CubisNo Gravatar dit :

    brillant isersing that andically bleny with itonant and alirce unulode. mninsism all dingfuros from lediere prity from borch and bibluency.

  27. 27 JaneNo Gravatar dit :

    HELPPPP il est superbe ce formulaire, mais alors prenez moi pour un boulet… impossible de recevoir les emails test… j ai change la : if(mail(« votreadresse@personnelle.fr », $titre, stripslashes($corps), $tete))

    pour y mettre mon adresse perso et je ne recois rien, ca me dit bien le message a ete transmis et tout … c est pas la qu il fallait y mettre l adresse de destination des emails??

    milles mercis pour le script et l aide

  28. 28 Moderna Pensions valetNo Gravatar dit :

    There is obviously a great be informed on this. I’m sure you’ve made good quality points in Features also.

  29. 29 VibNo Gravatar dit :

    Bonjour, j’ai un petit soucis, lorsque je consulte mon formulaire en ligne, à la place de tous les champs libre (par exemple en face de Nom, prénom, etc)j’ai le code qui apparait. Du genre
    Notice: Undefined variable: f_2 in /homez.87/apartmenh/www/formulaire.php on line 213

    Je ne comprend pas bien d’où vient le problème ?
    Des idées ?
    Merci

  30. 30 VibNo Gravatar dit :

    En fouillant sur le net je suis tombé sur pas mal de gens qui rencontrent le même type de problèmes. Surtout sur des sites très récents. Ce formulaire fonctionnait très bien sur un site qui a deux ans, hébergé chez OVH, mais sur un que je suis en train de mettre en place j’ai pleins de message d’erreur. Le code doit il être actualisé en fonction de nouveau standards ?

  31. 31 John's GraphismeNo Gravatar dit :

    @Vib : je ne sais pas si ce code fonctionne sous tous les hébergeurs. Moi, mon site n’est pas ancien niveau hébergement et le serveur + le formulaire fonctionne très bien ensemble.

  32. 32 VibNo Gravatar dit :

    Cela serait donc spécifique à OVH… :-(

  33. 33 ekozanNo Gravatar dit :

    Ce code est mal codé ( des variables ne sont pas ou mal initialisées + utilisation des stripslashs qui induit l’utilisation des magiques quotes qu’il ne faut pas utilisé et utilisations de fonction qui sont deprecated dans php5.3 ) d’où les erreurs sur les hébergeurs bien configuré ( affiche les erreurs de type notice et deprecated )

  34. 34 John's GraphismeNo Gravatar dit :

    @Ekozan : merci à toi, j’ai fait ça il y a un petit moment, qu’est ce qui cloche exactement ?

  35. 35 ekozanNo Gravatar dit :

    en php5.3 :
    les magic_quote ne sont plus utilisé donc la boucle ( nettoyage ) et les fonctions strip_tags() n’ont plus lieux d’être

    ereg est deprecated ( traduction ne plus utilisé car cela va disparaître :p ) elle est remplace par la série des preg
    http://www.php.net/manual/fr/ref.pcre.php
    les variables doivent être initialisé ( je parle des $f_1 et co ) car l’utilisation de register_globals a on ( pas besoin d’utilisé $_post pour récupéré les donnée) est une grave faille de sécurité

    tu trouvera les modifs que j’ai effectuer pour Vib ( enfin je crois :p ) sont un bon résumé des modifs

    http://forum.ovh.com/showpost.php?p=454116&postcount=17

    tu peut t’en inspiré pour le refaire a ta sauce :)

    pS: je viens de relire mon ancien poste je le trouve agressif cela n’étais pas on intention

  36. 36 FranczyzaNo Gravatar dit :

    Fantastic blog! Do you have any hints for aspiring writers? I’m planning to start my own blog soon but I’m a little lost on everything. Would you suggest starting with a free platform like WordPress or go for a paid option? There are so many choices out there that I’m totally confused .. Any recommendations? Many thanks!

  37. 37 batman year oneNo Gravatar dit :

    Hey, I what theme are you using? i use a theme from elegant themes but i have been looking for some other different ones.

  38. 38 AlexisNo Gravatar dit :

    Merci pour ce bout de code très pratique, et à priori sans bug !
    J’ai juste fais quelques modifs de css, et c’est tout bon :)

  39. 39 remyNo Gravatar dit :

    comment je peux ajouter cette formulaire dans mon contact page.

  40. 40 John's GraphismeNo Gravatar dit :

    @remy : tout dépend le type de page dont nous parlons. S’agit-il d’une page PHP ? HTML ?

  41. 41 oak orangeries LeicesterNo Gravatar dit :

    I am not sure if this is the correct place to ask but do you have any advice on how to optimise a mobile friendly website on a sub-domain.

  42. 42 Joellen BlankoNo Gravatar dit :

    Yo. I basically wanted to actually place a nice quick remark and inform you understand that I’ve been focusing on your personal wordpress blog for quite some time. Keep up the wonderful task and I will be looking again consistently relatively soon.

  43. 43 kikoNo Gravatar dit :

    salut john, merci bien pr c formulaire, mais je sais pas pkoi il ne marche plus chez moi, en tt ca quand j’ai testé la page il m’affiche les alertes en haut et dans les input il s’affiche «  » svp aidez moi à le corriger

  44. 44 John's GraphismeNo Gravatar dit :

    @kiko : tu as mis ce formulaire dans une page PHP ? As-tu essayer de mettre ma page sur ton serveur et de tester depuis ma page ?

  45. 45 kikoNo Gravatar dit :

    slt, oui deja j’utilise l’easyphp

  46. 46 williamNo Gravatar dit :

    Salut John,
    J’ai le même remarque que Kiko, le formulaire ne fonctionne plus.
    Il indique: « Deprecated: Function eregi() is deprecated ».
    Je ne sais pas d’où vient le problème.

Aucun trackback