TUTORIELS 
Un formulaire de contact multi-destinataires en PHP

Page 1 | 2 | 3

Un script complet permettant de revenir sur de nombreux points de la programmation PHP, notamment l'utilisation de tableaux associatifs.
 (14 novembre 2003)
 
Nous allons ici prendre le temps de réaliser une "application" complète d'envoi de mail, ou plus modestement, un script complet autour d'un formulaire de contact. Cela nous permettra de voir de nombreux points de la programmation PHP. Ce script ne cherche pas à présenter un ensemble de "best practices" en vogue, mais de revoir et expliquer certaines méthodes et principes dans PHP.

Présentation
Voici la forme de base que prendra notre formulaire :


Envoyer ce mail à

Nos objectifs sont les suivants:
- pouvoir envoyer au choix à un destinataire, où à tous les destinataires,
- faire tenir l'ensemble du script dans un seul fichier,
- modulariser le script - utiliser plusieurs petites fonctions plutôt qu'une grosse,
- possibilité d'ajouter/retirer un utilisateur sans devoir retoucher tout le script.

Nous expliquerons nos choix tout du long de la description du code. Pour les pressés, notre fichier source est téléchargeable.

Approche du code
Lorsque l'on veut qu'un script fonctionne sur un seul fichier, il faut prévoir à l'avance que le fichier lui-même pourrait changer dans le futur (de nom, d'emplacement). De fait, l'exemple de formulaire suivant n'est pas correct :

<form method="post" action="/developpeur/form-multimail.php">

...car il force à la fois le nom et l'emplacement de notre script. Pour bien faire, PHP nous offre une variable très utile, qui contient l'URL de la page en cours. La bonne manière de remplir l'attribut action dans notre optique est la suivante:

<form method="post" action="<?=$_SERVER['PHP_SELF'];?>">

De même, rester dans un seul fichier implique que l'affichage n'est pas le même avant et après avoir cliqué sur le bouton Envoyer - par exemple, le formulaire pourrait être remplacé par un message de confirmation. Nous devons donc partir d'une fonction qui teste l'état du formulaire, et envoi un affichage en conséquence.

Pour tester cet état, nous ajoutons à notre formulaire un champ caché, dont nous testerons l'existence :

<input type="hidden" name="envoi" value="ok">

Ce tests se déroule dans une fonction affichage(). Ainsi, le corps de notre page HTML ne contient plus que l'appel à cette fonction :

<html>
<body>
<?=affichage();?>
</body>
</html>

Notre formulaire, lui, prendra cette forme :

<form method="post" action="<?=$_SERVER['PHP_SELF'];?>">
  <input type="hidden" name="envoi" value="ok">
    <textarea name="champTexte" cols="75" rows="10">
      (n'oubliez pas de signer votre message!)
    </textarea>
    <br>
    Envoyer ce mail à
    <select name="choixMail">
      <option value="0" selected>Choisissez un destinataire...</option>
      <option value="1">Michal</option>
      <option value="2">Houssine</option>
      <option value="3">Patxi</option>
      <option value="4">Xavier</option>
      <option value="5">Tout le monde</option>
    </select>
  <input type="submit" name="Submit" value="Envoyer">
</form>

Après avoir cliqué sur "Envoyer", nous savons donc que nous aurons à disposition les variables suivantes :
- le champ caché : $_POST['envoi'] == "ok"
- le texte du message : $_POST['champTexte'] == le message
- le choix du destinataire : $_POST['choixMail'] == un entier entre 0 et 5

Profitons-en pour définir les fonction dont nous aurons besoin pour notre script:
- gérer l'état du formulaire, donc l'affichage global : affichage()
- afficher le formulaire vierge : afficheFormulaire()
- définir à quelle(s) adresse(s) envoyer le mail : definitionAdresse()
- envoyer le mail : envoiMail()

Enfin, nous définissons notre liste de destinataires au début du script, dans un tableau :

Discutez en sur les forums

$listeDesMails = array (
  "Michal" => "michal@lesite.hu",
  "Houssine" => "houssine@pr0n-h4x0r.fr",
  "Patxi" => "pat@pat-online.fr.st",
  "Xavier" => "x-man@pouyoupouyou.ln" );

Page 1 | 2 | 3

 
[ Xavier BorderieJDNet]
 
Accueil | Haut de page