PHP

Un tuto pour faire un formulaire de contact

J’ai choisi de faire un tutoriel sur le formulaire de contact car c’est un des premiers trucs véritablement concrets que j’ai appris à faire en PHP. Le refaire toute seule n’a pas été chose facile car j’ai rencontré des bugs dus à des fautes de frappe et des oublis de « ; ».

Également, j’ai appris deux choses. Apparemment, quand on code sous NotePad++ et qu’on balade son fichier d’un ordinateur à un autre, il peut arriver que ce logiciel crée des sauts de ligne à outrance. Là, Vous allez me dire « ok mais les sauts de ligne, à part que ça rend ton code moche, ça ne le rend pas inexécutable ! ». C’est ce que je pensais, sauf qu’on m’a dit que parfois, il arrive que l’overdose de sauts de ligne soit considérée comme de la mise en commentaire. Oui, je sais, moi aussi j’ai lâché un « Saperlipopette ! » quand on m’a dit ça. Mais j’ai rencontré le cas et ça donne des bouts de ton code qui deviennent inexécutables car… mis en commentaires ! (là, pour y penser à celle-là, franchement…)

Et puis il y a aussi le fait que le code puisse être parfaitement correct mais qu’une fois qu’on uploade ses fichiers chez son hébergeur, on n’aie pas envisagé que celui-ci demande davantage de paramètres pour la fonction php mail(). Et là, c’est le drame !

Cela étant dit, quelles bases faut-il avoir avant de pouvoir réaliser ce tuto ?

  • savoir faire un formulaire en HTML,
  • savoir ce qu’est une variable en PHP,
  • savoir poser une condition (IF) en PHP

Partie 1 : le formulaire

Commençons avec notre formulaire de contact.

<!-- on définit la méthode POST ici -->    
<form method="post" action="">

<!-- là, on fait une 'tite boîte pour permettre à l'user de mettre son nom -->    
	<p>Votre nom et prénom: 
	<input type="text" name="nom" size="30" required /></p>

<!-- ici, une 'tite boîte pour qu'il renseigne son adresse mail
notons que dans type, on a inscrit email. -->    
	<p>Votre email: <span style="color:#ff0000;">*</span>: 
	<input type="email" name="email" size="30" required /></p>
	
<!-- Hop hop ! Une boîte pour que l'user rédige sa lettre d'amour -->    
	<p>Message <span style="color:#ff0000;">*</span>:</p>
	<textarea name="message" cols="60" rows="10"></textarea>
	
<!-- et le bouton d'envoi ! -->    
	<p><input type="submit" name="submit" value="Envoyer" /></p>
</form>

Nous utiliserons un formulaire pour utiliser la méthode « POST« . La méthode POST va envoyer les informations introduites par l’utilisateur de manière non lisibles dans l’URL.

Également, elle va servir pour récupérer et traiter les informations encodées par l’utilisateur. On va voir rapidement comment.

Vous avez noté la présence de « required » ? C’est un truc assez pratique pour que le navigateur comprenne qu’il faut impérativement que l’utilisateur rentre quelque chose, n’importe quoi, pour que le formulaire soit considéré comme envoyable. Bien sûr, ce n’est pas une vraie sécurité car quand je dis « n’importe quoi », ça peut même englober des trucs qui vont tout faire planter…

Partie 2 : préparer l’envoi du mail

Le code qui va suivre, et qui se trouve dans des balise PHP, est à mettre AVANT le doctype, le header, le body ! Bref, avant tout ce qui touche à l’HTML.

Je vais tenter de « traduire » à peu près environ en Français comment le PHP se lit, histoire qu’on comprenne bien ce qui se passe et pourquoi on doit écrire ce qui est écrit. D’avance, merci de ne pas me jeter des cailloux, je n’ai que B2 en anglais, un peu d’indulgence que diable !

<?php
// création d'une constante contenant le mail du destinataire (nous)
define("MON_MAIL", "monadressemail@monmail.com");

// là, on va vérifier que le formulaire contient des données
// = que l'user a bien rédigé son mail comme il faut.
// On va le vérifier en disant "si (=if) est(=is)encode(=set) 
// $_POST(dans le formulaire) ['lenom'](le nom de mon pote)" 
if(isset($_POST['lenom']))
{    
	// on récupère les valeurs du formulaire dans des variables locales    
	$lenom = $_POST['lenom'];
	$lemail = $_POST['lemail'];
	$letexte = $_POST['letexte'];
	
	// On crée le sujet du mail ici    
	$letitre = "Message provenant de mon super site !";
	
	// on crée l'entête avec le lien vers le mail de l'expéditeur
	// (\r\n, c'est pour les sauts de ligne)
	// En plus tu vois que nos variables locales servent déjà ici !    
	$entete = "From: $lenom <$lemail> \r\n" .     
	"Reply-To: $lenom <$lemail> \r\n" .     
	"X-Mailer: PHP/" . phpversion();

La fonction mail doit contenir certains paramètres précis et surtout, dans l’ordre : à qui on envoie le mail, le sujet, le message, le header.

// et là, on voit qu'on utilise la constante MON_MAIL !
mail(MON_MAIL, $letitre, $letexte, $entete);

Partie 3 : Vérifier que l’envoi a été fait !

On vient de voir la fonction mail. Mais plutôt que de la laisser toute seule, on va s’en servir pour vérifier qu’elle s’est bien exécutée comme on voulait…


// On insère la fonction mail et ses paramètres dans la variable $verif_envoi
// Si tous les paramètres sont OK, la fonction s'exécute (= envoyer le mail).
// En PHP, on dira que la variable vaut TRUE.
// S'il y un problème, la variable ne sera pas correcte et vaudra FALSE.        
$verif_envoi = mail(MON_MAIL, $letitre, $letexte, $entete);

// DU COUP : si l'envoi a fonctionné et que le message est bien parti :
if($verif_envoi)
{  
// alors PHP affichera le message suivant qu'on met dans une variable.
// On va voir pourquoi après... En fait, on va la faire s'afficher plus tard.
$message = "<h3>Votre message a été envoyé</h3>";   

// si c'est pas le cas, pour n'importe quelle raison que ce soit,
// le contenu de la variable $message ne sera pas le même...	
}else{        

	// PHP affichera :	
	$message = "<h3>Erreur lors de l'envoi, 
	
	// history.go(-1) veut dire "retourner à la page précédente"
	veuillez <a href='#' onclick='history.go(-1);'>réessayer</a></h3>";
	}    
}
?>

Partie 4 : Informer l’user que le mail est bien envoyé !

Vous, l’utilisateur et même moi, quand on envoie des mails, on aime bien être assuré de ne pas avoir rédigé un roman pour rien et que notre missive a bien été envoyée correctement. Comment faire pour informer l’user que sa prose a bien été prise en charge par la magie des Internets et du code ?

Vous vous rappelez de la variable $message dont le contenu change selon que le mail a bien été envoyé ou pas ? Et vous ne pensez pas qu’on pourrait s’en servir pour l’afficher ? Comment ferait-on ? Puisqu’on connait les conditions, on va poser une condition avec un IF et un ELSE…

<?php 
// là, on dit "si la variable $message a été généré 
// (= preuve que l'envoi a été tenté)"
if(isset($message)){  

// alors ici, on affiche le message de réussite, ou d'erreur.
echo $message; 

// sinon, puisque la variable $message n'a pas été générée,
// c'est que le formulaire n'a pas été rempli. Donc il faut le remplir...     
}else{ 

// donc là, on va pas s'embêter à coder notre formulaire en PHP 
// avec des \ pour contrecarrer les effets des guillemets, 
// on va tout simplement fermer la balise PHP                   
?>        

<-- ici, en HTML, on met le formulaire -->

<-- là, on rouvre les balises PHP pour... -->       
<?php 

// fermer l’accolade ouverte avec le else .
}     

// Enfin, on referme la balise PHP, histoire que le code soit bien propre.         
?></p>

Et voilà !
Alors là, comme ça, vous vous dîtes peut-être « non mais alors attends, je mets quoi dans quel ordre ? »
Tout comme j’ai fait SAUF que le formulaire qu’on a fait au début, vous le mettez là où je viens de vous dire de le mettre. Du coup, votre code doit, grosso modo, ressembler à ceci :

<?php
define("MON_MAIL", "monadressemail@monmail.com");
if(isset($_POST['lenom']))
	{    
		$lenom = $_POST['lenom'];
		$lemail = $_POST['lemail'];
		$letexte = $_POST['letexte'];
		$letitre = "Message provenant de mon super site !";
		$entete = "From: $lenom <$lemail> \r\n" .     
		"Reply-To: $lenom <$lemail> \r\n" .     
		"X-Mailer: PHP/" . phpversion();          
		$verif_envoi = mail(MON_MAIL, $letitre, $letexte, $entete);
		if($verif_envoi)
		{        
		$message = "<h3>Votre message a été envoyé</h3>";    
	}else{        
		$message = "<h3>Erreur lors de l'envoi, veuillez 
		<a href='#' onclick='history.go(-1);'>réessayer</a></h3>";
		}    
	}
?>
<!doctype html>
<html>
<head>
	<meta charset="utf-8" />
</head>
<body>
<?php        
	if(isset($message)){            
		echo $message;        
	}else{                    
?>        
<form method="post" action="">
	<p>Votre nom et prénom: 
	<input type="text" name="nom" size="30" required /></p>
	<p>Votre email: <span style="color:#ff0000;">*</span>: 
	<input type="email" name="email" size="30" required /></p> 
	<p>Message <span style="color:#ff0000;">*</span>:</p>
	<textarea name="message" cols="60" rows="10"></textarea>   
	<p><input type="submit" name="submit" value="Envoyer" /></p>
</form>       
<?php        
		}
?>
</body>
</html>

Partie 5 : La sécurité !

Bon, normalement, on doit vérifier un certain nombre de choses pour éviter d’avoir des problèmes. Mais là, on fait simple avec du très simple. Juste histoire de voir comment ça fonctionne. Ce n’est évidemment pas à utiliser pour un formulaire de contact sur un site d’une multinationale, on est bien d’accord…

Disons que cette question pourrait être traitée dans un autre tuto rigolo. En attendant, je vous remercie pour votre lecture, je vous embrasse !

Un commentaire pour “Un tuto pour faire un formulaire de contact

  1. Bonjour,
    Quelques remarques :
    – Il faut éviter de mettre du HTML dans les variables PHP (comme les balises H3), afin de ne pas mélanger les langages. Encore mieux : écrire le JS dans un fichier JS, le CSS dans un fichier CSS, l’HTML dans un fichier HTML et le PHP dans un fichier PHP.
    – required : autant être valide XHTML et écrire required= »required »
    pensez à utiliser @ devant certaines fonctions PHP, afin de ne pas afficher les erreurs
    – le code n’est pas toujours indenté
    – les noms des variables, bien que clairs, ne sont pas uniformes : « lemail », « verif_envoi ». Personnellement, je préfère la notation hongroise.
    Enfin, « user » se dit « utilisateur ». : )

Laisser un commentaire

Articles similaires

Commencez à saisir votre recherche ci-dessus et pressez Entrée pour rechercher. ESC pour annuler.

Retour en haut