Voir aussi
Dans la même rubrique :
Quiz en PHP 1/3
Quiz en PHP 2/3
Quiz en PHP 3/3
Page contact en PHP 3/3
Installer un script PHP pour les nuls
Page contact en PHP 2/3
Menu de navigation sans JavaScript
Gestion d’une rubrique... en attendant SPIP
Créer un forum à l’aide de phpBB
Page Erreur 404 en PHPDu même auteur :
Suivi de vos articles
Exécuter un Javascript dans une page SPIP
Reprendre un document Word
Les Centres de santé
Comité Départemental d’Education pour la Santé des Yvelines
Les sites des Médecins Maîtres-Toile
Joindre un document à un article
Placer une image dans un article
Les raccourcis typographiques
Ecrire ou modifier un article
Présentation de l’espace rédacteurs
Conseils aux rédacteurs
Lire nos fichiers de syndication
Syndication, comment s’y retrouver
Afficher plusieurs flux RSS/Atom sur une page
Lecture des caractères spéciaux et d’éléments d’un fil RSS/Atom
Accueil du nouveau rédacteur
Javascript : n’oubliez pas Mac OS !
Page contact en PHP 1/3
Positionnement fixe... même avec Internet Explorer !
Des fils RSS 1.0, RSS 2.0 et Atom 1.0 pour votre site SPIP
Editez vos flux avec Fil_LE 1/2
Editez vos flux avec Fil_LE 2/2
Editer plusieurs fichiers de syndication 1/3
Editer plusieurs fichiers de syndication 2/3
Editer plusieurs fichiers de syndication 3/3
Documentation sur SPIP
Abandonnons RSS 0.91 !
La syndication de contenu RSS
Ecrire ce qu’on veut dans SPIP
Utiliser les smileys
Joindre un logo à un article
Référencer un site
Création à distance d’un fichier de syndication
Lecteur RSS/Atom pour votre site 1/2
Lecteur RSS/Atom pour votre site 2/2
Quand JavaScript est désactivé... 2/2
Afficher un fil RSS/Atom sur votre site 1/3
Afficher un fil RSS/Atom sur votre site 2/3
Afficher un fil RSS/Atom sur votre site 3/3
Un Editeur RSS pour votre site 1/2
Un Editeur RSS pour votre site 2/2
Un lecteur RSS pour votre site 1/2
Un lecteur RSS pour votre site 2/2
Menu dépliant pour les rubriques
Quand JavaScript est désactivé... 1/2
Astuce pour les images fréquemment utilisées
Utilisation de la classe easyRSS
Proposer plusieurs styles pour votre siteMême indexation :
Technique Web
Utilisation de la classe easyRSS
Editer plusieurs fichiers de syndication 3/3
Initiation au xhtml - 3 : Rappel sur les pointeurs internet (URI/URL)
Créer une liste de QCM
MARST - Le Moteur Automatisé de Recherche en Santé au Travail
Soigner en ligne, un art impossible ?
Publication Spip : forme et typographie
xhtml - 4 : Les entités
Qualité, centres d’intérêt et motivations des participants aux forums médicaux.
Quand JavaScript est désactivé... 1/2
Quiz en PHP 1/3
La Netiquette des forums
Page contact en PHP 2/3
Réaliser un formulaire de contact (3/4)
Quiz en PHP 3/3
Le web structuré et sa présentation
Quand JavaScript est désactivé... 2/2
Editer plusieurs fichiers de syndication 1/3
Conseils pour débuter un site web
Installer un script PHP pour les nuls
Gestion d’une rubrique... en attendant SPIP
Un lecteur RSS pour votre site 1/2
Quiz en PHP 2/3
Réaliser un formulaire de contact (2/4)
Mise en place d’un forum : une décision qui doit être mûrement réfléchie
Contrôler l’accès d’une partie du site avec .htaccess
Page Erreur 404 en PHP
Menu dépliant pour les rubriques
Un lecteur RSS pour votre site 2/2
Belles icônes pas chères !
Un serveur dédié pour les nuls
Page contact en PHP 3/3
Créer un forum à l’aide de phpBB
Un Editeur RSS pour votre site 2/2
Un Editeur RSS pour votre site 1/2
Initiation au xhtml - 1
Syndication, comment s’y retrouver
Etablir un questionnaire statistique en ligne
Réaliser un formulaire de contact (1/4)
Réaliser un formulaire de contact (5/4)
Menu de navigation sans JavaScript
Comment faire migrer son site ?
Javascript : n’oubliez pas Mac OS !
Tri et Histogramme
Proposer plusieurs styles pour votre site
Positionnement fixe... même avec Internet Explorer !
Editer plusieurs fichiers de syndication 2/3
Analyser les réponses à une liste de questions
Réaliser un formulaire de contact (4/4)
Initiation au xhtml - 2
Comment intégrer Snap Shots à Rapidweaver ?
La syndication de contenu RSS
Ecrire ce qu’on veut dans SPIP
Lire nos fichiers de syndication
Afficher un fil RSS/Atom sur votre site 1/3
Astuce pour les images fréquemment utilisées
Afficher un fil RSS/Atom sur votre site 2/3
Afficher un fil RSS/Atom sur votre site 3/3
Lecteur RSS/Atom pour votre site 1/2
Lecteur RSS/Atom pour votre site 2/2
Lecture des caractères spéciaux et d’éléments d’un fil RSS/Atom
Syndication pour phpBB
Editez vos flux avec Fil_LE 1/2
Editez vos flux avec Fil_LE 2/2
Création à distance d’un fichier de syndication
Abandonnons RSS 0.91 !
Exécuter un Javascript dans une page SPIP
Des fils RSS 1.0, RSS 2.0 et Atom 1.0 pour votre site SPIPSyndiquer tout le texte
Menu de navigation sans JavaScript
Positionnement fixe... même avec Internet Explorer !
Syndication, comment s’y retrouver
Editer plusieurs fichiers de syndication 3/3
Proposer plusieurs styles pour votre site
Gestion d’une rubrique... en attendant SPIP
Menu dépliant pour les rubriques
Page contact en PHP 2/3
Page Erreur 404 en PHP
Quiz en PHP 1/3
Javascript : n’oubliez pas Mac OS !
Page contact en PHP 3/3
Quiz en PHP 2/3
Editer plusieurs fichiers de syndication 1/3
Installer un script PHP pour les nuls
Quand JavaScript est désactivé... 1/2
Quiz en PHP 3/3
Editer plusieurs fichiers de syndication 2/3
Quand JavaScript est désactivé... 2/2
Afficher plusieurs flux RSS/Atom sur une page
La syndication de contenu RSS
Conseils aux rédacteurs
Lire nos fichiers de syndication
Présentation de l’espace rédacteurs
Ecrire ce qu’on veut dans SPIP
Astuce pour les images fréquemment utilisées
Afficher un fil RSS/Atom sur votre site 1/3
Ecrire ou modifier un article
Les raccourcis typographiques
Afficher un fil RSS/Atom sur votre site 2/3
Afficher un fil RSS/Atom sur votre site 3/3
Reprendre un document Word
Lecteur RSS/Atom pour votre site 1/2
Lecteur RSS/Atom pour votre site 2/2
Lecture des caractères spéciaux et d’éléments d’un fil RSS/Atom
Placer une image dans un article
Joindre un document à un article
Editez vos flux avec Fil_LE 1/2
Editez vos flux avec Fil_LE 2/2
Joindre un logo à un article
Création à distance d’un fichier de syndication
Abandonnons RSS 0.91 !
Exécuter un Javascript dans une page SPIP
Des fils RSS 1.0, RSS 2.0 et Atom 1.0 pour votre site SPIP
Accueil
Boite à Outils
Scripts PHP
Page contact en PHP 1/3

L’objectif est de recevoir un message venant d’un formulaire, afin de ne pas laisser traiter son email à disposition des robots spameurs. Un contrôle du formulaire est inclu, vérifiant que les champs obligatoires sont biens remplis et que l’adresse email indiquée a une syntaxe correcte.
Cet article a été modifié le 27 janvier 2005 et le 15 octobre 2005 pour éviter une faille de sécurité permettant le Cross Site Scripting [2].
Cette page peut être testée ici : contact, le code de l’ensemble du script peut être vu et copié ici : [3].
<?php |
La fonction initialise les quatres zones du formulaire, l’accolade ouvrante est suivie du code HTML du formulaire. La fonction se termine à l’emplacement de l’accolade fermante après la balise de fermeture du formulaire </form>.
<form action="contact.php" method="post"> |
Lorsqu’on enfonce le bouton submit du formulaire, le contenu les zones est transmis au même fichier php (ici : "contact.php"). Les minis scripts insérés au niveau de l’attribut value affichent la donnée introduite dans la zone elle-même. Le code présenté ici est simplifié par rapport au fichier de démonstration indiqué plus haut, où le formulaire est présenté dans un tableau et avec des effets de style pour le bouton Envoi.
<?php |
L’accolade met fin à la fonction PHP. Si la variable $Nom n’existe pas, cela signifie que le formulaire n’a pas encore été complété. La fonction formulaire() est alors appelée pour l’afficher. Si la variable $Nom existe, les données sont récupérées dans les variables $vNom, $vProfession, $vEmail et $vMessage. La fonction trim élimine les éventuels espaces avant et après la donnée [4] , la fonction htmlentities() évite les failles de sécurité en empêchant le Cross Site Scripting [2].
else { |
A la ligne $destinataire='stetho@domaine.com'; il faudra remplacer stetho@domaine.com par votre email pour personnaliser ce script.
Si l’une des zones du formulaire n’a pas été complétée, le message indiqué s’affiche et la variable $erreur prend la valeur 1. Dans ce cas, la ligne "Vous n’avez pas complété toutes les zones :" sera affichée (ici en rouge en fonction de la feuille de style de la page). La variable $message prépare le contenu du message qui sera envoyé par Mail. Les lignes sur "Provenance", "Adresse IP", "Navigateur" peuvent être sautées si ces informations ne sont pas souhaitées.
if (!eregi("^[0-9a-z]([-_.]?[0-9a-z])*@[0-9a-z]([-_.]?[0-9a-z])*\\.[a-z]{2,4}$",$vEmail) && ($erreur<>1)){ |
L’adresse e-mail est testée par l’expression régulière ^[0-9a-z] : le premier caractère doit être une lettre ou un chiffre. ([-_.] ?[0-9a-z])* : il est suivi par un ou plusieurs caractères (lettres ou chiffres) précédés optionnellement d’un tiret, d’un soulignement ou d’un point. @ : présence du caratère @. [0-9a-z] : un ou plusieurs caractères (lettres ou chiffres). ([-_.] ?[0-9a-z])* : à nouveau un ou plusieurs caractères (lettres ou chiffres), précédés ou non de l’un des 3 signes entre les crochets. \\. : présence d’un point. [a-z]{2,4} : présence de 2, 3 ou 4 lettres. $ : fin de donnée. Si la syntaxe n’est pas correcte, la phrase "L’adresse e-mail n’est pas correcte :" est affichée en rouge.
if ($erreur==1) { |
Si l’un des tests précédents est vrai, la variable $erreur aura la valeur 1. Dans ce cas, la fonction formulaire est à nouveau exécutée pour afficher le formulaire.
else { |
Si tout est bien rempli, le message est envoyé par la fonction mail() et le visiteur retrouve la page, cette fois-ci sans le formulaire, mais avec confirmation de l’envoi de son message qui lui est présenté (ici dans une liste à puces, et avec quelques effets de couleurs avec la feuille de style). On propose au visiteur de se rendre ailleurs dans le site (ici par deux boutons présentés dans un tableau, avec des liens vers la page d’accueil et vers le plan du site).
Voilà , tout y est pour une page contact classique, si par contre vous souhaitez des éléments supplémentaires, c’est abordé dans Page contact en PHP 2/3, et pour éviter le spam, l’ajout d’un captcha dans Page contact en PHP 3/3.
[1] Evidemment, pour que ce script fonctionne il faut le placer sur une page avec l’extension .php ou .php3, elle-même mise sur un serveur interprétant le PHP. Cette page a été mise au point pour le site cyes.info ; la page choix techniques présente aux webmestres les différentes techniques mises en Å“uvre pour ce site.
[2] Voir Pourquoi les failles de Cross Site Scripting se ramassent à la pelle et Le Cross Site Scripting.
Les données récupérées par le formulaire passent par la fonction htmlentities() qui bloque les attaques en tranformant tout caractère spécial en code HTML. L’ennui, c’est que les caractères accentués sont eux aussi transformés (é devient é), ce qui donne des messages peu lisibles. La nouvelle fonction proposée dans l’article pour le champ "Message" ne bloque que les caractères indésirables, pour ceux qui utilisent l’ancien script, il suffit de remplacer :
<?php echo trim(htmlentities($Message)) ?> |
par :
<?php if (ereg("[]%~#`$&|}{^[><]",$Message)) { echo "Certains caractères utilisés sont interdits"; |
[3] Code du script :
L’utilisation de <?php echo $PHP_SELF ?> permet de récupérer le nom de la page, sinon il faudrait indiquer "contact.php" dans notre exemple, et modifier ce nom si la page est renommée.
[4] Avant la version 4.12 de PHP, il faut utiliser $HTTP_POST_VARS Ã la place de $_POST.
Merci pour votre formulaire super pratique et facile à installer.j’ai dû faire cependant une correction qui me parait être une erreur de frappe dans la phrase su script :
if (empty($vNom) || empty($Message) || empty($Email)) echo "
Vous n’avez pas complété toutes les zones :
" ; $erreur=1 ;
j’ai dû remplacer $Message par $vMessage et $Email par $vEmail , sinon je me retrouvais systématiquement avec l’erreur : vous n’avez pas complété toutes les zones
est-ce une erreur de script ou une incompatibilité avec mon hébergeur ?
j’ai mis un lien à votre page sur la page du formulaire : http://www.duonostalgie.ch/formulaire.php J’espère que ça ne pose pas problème.
j’ai également fait la correction
if( !isset($_POST[’Nom’]))
(réaction à l’article 1er juillet 2007) sans tester si ça marchait sans.
merci encore. Je suis musicien, mais chaque fois j’apprends un peu plus sur les scripts (sans savoir vraiment en écrire)
Le script décrit fonctionne très bien sur mon site, mais il est peut être nécessaire de devoir l’adapter selon son hébergeur.
Ce qu’il faut faire, si çà marche bien avec l’adaptation que vous avez faite, c’est de tester la page en essayant d’envoyer les messages dont vous ne voulez pas afin de vérifier si le script refuse de les envoyer :
les messages incomplets : pas d’email, pas de message...
les tentatives de piratage du site en essayant d’introduire un script dans le formulaire (le script doit interdire les caractères spéciaux ou les transformer pour qu’ils ne soient plus fonctionnels).
Bonjour,
le script fonctionne très bien une fois les corrections faites. les zones vides sont refusées. le script n’est pas visible la zone email est contrôlée.
mais ce qui m’intéresse, c’est de comprendre ou je peux trouver les adaptations php à faire, car par exemple j’essaie d’installer le script avec Captcha et je me heurte aux mêmes problèmes de syntaxe (et je ne suis pas programmeur. j’ai trouvé la solution du $vMessage par hazard) :
tous mes messages sont refusés car soit-disant la réponse au Captcha est fausse (alors qu’elle est juste)
c’est donc encore une phrase de script qui ne passe pas sur mon serveur. (voir le message que j’ai laissé sur la page php3)
je me sens désarmé...
Bonjour,
j’ai résolu le problème des signes refusés :
d’abord, mon hébergeur utilise le php.5 et ils semblerait qu’il y ait des fragments de code incompatibles par exemple dans :
<?php echo trim(htmlentities($Email))?>
ainsi que les autres ($message, $profession, etc) la baslise htmlentities n’est pas prise en compte. elle ne l’est que dans la partie :
$vNom=trim(htmlentities($_POST["Nom"])) ; $vProfession=trim(htmlentities($_POST["Profession"])) ; $vMessage=trim(htmlentities($_POST["Message"])) ; $vEmail=trim(htmlentities($_POST["Email"])) ; $destinataire=’stetho domaine.com’ ;
d’ailleurs j’ai l’impression que tous les codes php dans la première région ne sont pas pris en compte (lignes 58 à 78)
et pour résoudre le problème, j’ai dû mettre le test signes spéciaux dans la 2ème partie (sous la ligne 107 du script que vous fournissez)
j’ai d’ailleurs modifié la partie nom et profession car là aussi on peut trouver des accents, et donc plutôt que de définir la zone htmlentities, je préfère lui faire également le test des signes spéciaux. A ce moment, il faut également rajouter des paragraphes pour chaque message d’erreur pour ne pas se retrouver avec trois messages d’erreur identiques alignés.
il faut également dans ce cas refaire un petit test et n’envoyer les données que si le code erreur=0...
if ($erreur==0) echo trim($vNom,$vSujet,$vMessage) ;
...de façon à ne pas se retrouver avec le message d’erreur plus les zones Ok imprimées.
Si vous voulez, je peux envoyer sur ce forum le code entier de la page contact telle que je l’ai remaniée pour qu’elle joue ? mais je ne veux pas charger ces pages sans votre accord. cordialement, Claude
Bonjour,
Pouvez-vous me dire comment faire pour rajouter une personne en copie caché BCC.
j’ai testé : $options.='Bcc: <moi@fai.fr>'."\n"; mais rien n’a faire.
je recois le mail en double a l’adresse du destinataire, mais pas 1 pour le destinataire et 1 pour la copie.
De plus j’aimerais pouvoir formater mon texte avec de saut de lignes mais rien a faire le \r \n ou le fameux br ne marche pas.
Une solution ? merci a vous
C’est pourtant presque cela (voir la fonction mail()), je pense qu’il devrait suffire d’écrire $options.="Bcc: moi@fai.fr\n"; au lieu de $options.='Bcc: <moi@fai.fr>'."\n";
Pour le saut de ligne, c’est bien "\n" qu’il faut faire (attention, çà ne marche pas avec de simples quotes).
Très bon script comme à chaque fois.
Je l’ai repris et adapté pour les besoins d’un site.
Malheureusement chez mon hébergeur il fonctionnait très bien mais pas sur l’hébergeur de destination.
Après vérification, il s’avère que le code :
if( !isset($Nom))
est besoin d’être reformulé sous la forme :
if( !isset($_POST[Nom]))
(selon l’hébergeur).
Avec cette modification le script a refonctionné sans problème et à merveille ;)
Cordialement mac97000
Il semblerait que la bonne syntaxe pour la modification serait d’écrire :
if( !isset($_POST[’Nom’]))
avec des simples quotes, ce qui n’a pas une incidence dramatique sur l’exécution du code mais sur sa rapidité et le respect des standards d’écriture !
Pour ceux qui veulent allez plus loin : Sans les simples quotes php interprète notre valeur comme étant une constante, puisque ce n’est pas une constante il retourne à la recherche d’informations pour enfin s’apercevoir qu’il s’agit de la valeur transmise en variable. Ce qui constitue tant une source d’erreur qu’une perte de temps que l’on peut éviter simplement.
De plus l’évolution du langage fait que si l’on peut, autant respecter la syntaxe pour ne pas avoir à réécrire tous les scripts au prochain changement 
Cordialement
Bonjour et un grand merci pour ce script. Ma question est la suivante : j’ai adapté le formulaire et je souhaite que le champ Email, tout en gardant ses vérifications sur la saisie des caractères, ne soit pas un champ obligatoire. Autrement dit si je saisi une adresse mail elle est vérifiée, si je n’en saisi pas le formulaire est tout de même envoyé. Est-ce simple à réaliser ? Peut-être faut il juste supprimer une partie de la liste des caractères non valides, mais laquelle ? Merci
Dans un souci de participation je lance quelques idées d’aménagement du formulaire :
les messages d’erreurs s’affichent en rouge dans les champs concernés.
le message d’erreur disparait lorsque l’on clic dans le champ en question
le curseur de saisie de texte clignote dans le premier champ du formulaire
lorsque l’on se place dans un champ celui-ci change de teinte
Bonjour,
Merci de mettre à disposition de tels tutos ! J’ai pu personnaliser le formulaire pour mon site web ! :)
Seul soucis que je crois dû à la sécurité (htmlentities), le caractère "’" est agrémenté d’un slash. Quand on écrit "a l’école" par exemple, le message reçu est "à l\’école". Comment contourner ce problème ?
Autre soucis, en actualisant la page après avoir rempli et envoyé le formulaire, les contenus entrés ne sont pas effacés alors que l’effet souhaîté est l’effacement du formulaire... Comment faire ? Merci beaucoup ! :)
Laurent
Bjr, pour l’ anti-slash : $vMessage=stripslashes($vMessage) ;
pour les retours à la ligne : $vMessage=nl2br($vMessage) ;
Cdt,
Bruno
Bon je me lance ... Spip 1.8.3 encodé utf8 j’ai repris votre formulaire et .. Impec ca marche super !!!
Voulant aller plus loin :
intégrer cela en passant par un classique "contact.php" qui amène sur le fichier que j’ai nommé "contact.html" et qui se trouve dans mon repertoire squelette, plutot que d’avoir directement le fichier "contact.php" à la racine.
Passer tout ce joli travail en css sans tableau
Récupérer le titre de la page d’avant, pour l’introduire dans le mail de façon à savoir de où vient le visiteur :
le bouton qui donne accès au formulaire de la page précédente, j’ai un lien de type :
<a href="contact.php?id_article=#ID_ARTICLE">
dans le haut de ma page "contact.html", j’ai placé et modifié :
<?php
error_reporting(0);
$id_article = "#ID_ARTICLE";
echo "<?xml version=\"1.0\" encoding=\"utf8\"?".">"; ?>
là ou je veux voir apparaitre le titre de ma page précédente j’ai la boucle
<BOUCLE_art_origin (ARTICLES) {id_article}>
<strong>[(#TITRE|supprimer_numero)] le #SURTITRE.</strong>
</BOUCLE_art_origin>
ca pas de soucis ca fonctionne deja sur d’autre formulaire. Juste un doute sur l’encode en "utf8" puisque mon site est en utf8 ???
tout ceci fait, l’affichage de mon formulaire semble ok, je le remplis et Paf ca mouline QQ secondes, je reviens sur la page formulaire qui entre temps c’est vidé et pas d’envoi de mail ?
le forulaire est visible ici
Dites moi Doc :
Ou est ce que j’ai mal ????
je peux fournir mon code complet pour le formulaire tout css .. evidement
C’est un excellent programme, mais le débutant que je suis n’a pas réussi à le faire fonctionner avec php5, qui renvoie une erreur de syntaxe rédhibitoire. Y a-t-il moyen simple de l’adapter à la nouvelle "grammaire", ou faut-il attendre une nouvelle version ?
Avec mes remerciements pour le travail et la pédagogie.
alg
Bonjour à tous !
Je suis actuellement en train de finir un projet pour mes cours et je me posais une question :
j’aimerai savoir comment (si c’est possible), nous pourrions récupérer les variables d’un formulaire sans le soumettre (sans utiliser les méthodes POST ou GET).Le tout en php bien entendu... 
Toute remarque sera la bienvenue.
Merci d’avance et bonne continuation !
Un formulaire doit être envoyé (méthode POST ou GET) pour récupérer les variables, sinon vous n’avez rien.
Cordialement
$vMessage=trim(htmlentities($_POST["Message"])); par $vMessage=trim($_POST["Message"]); et les caractères accentués seront respectés pour le message (j’ai quand même laissé la fonction htmlentities() pour les champs Nom et Profession).
La première chose à faire est d’interroger "Alice" pour savoir s’ils autorisent bien la fonction mail() (tous les hébergeurs n’autorisent pas cette fonction qui est indispensable pour ce script).
Si le problème ne vient pas de là , contactez-moi, mais en indiquant votre adresse e-mail pour que je puisse vous contacter directement (dans le champ "Votre adresse email" ainsi elle sera codée sur les pages du site).
Voici en copié-collé ce que j’ai trouvé sur le net, concernant mon problème et qui peut peut-être dépanner quelqu’un d’autre :
Déja 2 choses à éventuellement modifier pour que le script fonctionne chez TiscAlice. S’il y a des : $_POST $_GET remplacer par : $HTTP_POST_VARS $HTTP_GET_VARS
La fonction mail est un chouille différente : de tête ce doit être : mail($destinataire, $objet, $message, "Reply-to :$ton_mail") ;
phpinfo() ;
bref rappel de tout ce dont le serveur dispose. 
Non, c’est beaucoup trop dangereux, c’est la porte ouverte à tous les piratages de votre site !
Cela ne doit se faire que dans un espace sécurisé, après identification et mot de passe.
Pas si l’extension du fichier et vérifié dans le traitement du formulaire.
Yann A. (Informatique La Baule)
Il suffit d’ajouter un champ de ce type :
Yann A. (Informatique La Baule)