Se connecter Recherche

Cet article fait suite à un précédent dans lequel je vous fournissais un code vous permettant de créer un formulaire de contact et les explications de celui-ci. Si vous souhaitez voir cet article, c’est par ici

Le code que nous allons détailler ensemble reprend les éléments du premier en ajoutant au formulaire:

  • Un choix par liste déroulante select
  • Un choix par bouton radio
  • Un choix multiple par checkbox
  • Un système d’upload de fichier.

En bref, un code qui vous permettra d’exploiter la majorité des types de champs dans votre formulaires et d’en récupérer les informations renseignés.

Voir la demo du formulaire

Afin de respecter les chemin de fichiers et dossier inclus dans le code, je conseille aux plus néophytes d’utiliser les mêmes noms que ce des explications et de placer ces éléments dans le même dossier (dont le nom n’a pas d’importance). Les plus expérimentés maitrisant la réécriture de chemin de fichiers, vous avez carte blanche.

La structure établie

Voici l’arborescence pour la nouvelle mouture de ce formulaire :

  • Un fichier contact.php hébergeant le code HTML du formulaire et quelques directives de traitement.
  • Un fichier send_form.php s’occupant de traiter le formulaire de contact, vérifier les erreurs, et vous le transmettre sur votre boite email.
  • Un dossier upload pour récupérer les éléments transmit via le champ d’upload.

Les extensions ont une importance, veillez à ce que les 2 fichiers soit bien .php, pas de .html sous risque de vous retrouver avec un formulaire inutilisable.

Le code HTML de ce formulaire de contact

Voici donc le nouveau code HTML. La base est similaire au premier modèle avec juste quelques variantes d’alignement de colonnes. Nous y ajoutons un input type text pour créer un champ Sujet, un select pour une liste déroulante, des input type radio pour une sélection unique dans un ensemble de choix, des input type checkbox pour des possibilités de choix multiples et un input de type file pour permettre l’upload de fichiers.

<?php
session_start();
?>
<!doctype html>
<html>
<head>
<meta charset="utf-8">
<title>Formulaire de contact - Version multi-champ</title>
<!-- call bootstrap -->
<link href="http://maxcdn.bootstrapcdn.com/bootstrap/3.3.1/css/bootstrap.min.css" rel="stylesheet">
</head>
<body style="padding:50px 0 200px 0">
  <div style="padding-bottom:100px" class="container">
  <div class="row">
  <div class="col-md-12">
  <hr>
  <div class="alert alert-info"><b>INFOS:</b> Ce formulaire est une démo, le fonctionnement est complet mais le message n'arrivera nul part, les spammer peuvent passer leur chemin!</div>
  <hr>
  </div>
  </div>
  </div>
<!-- CONTENT -->
  <div class="container">
  <?php if(array_key_exists('errors',$_SESSION)): ?>
  <div class="alert alert-danger">
  <?= implode('<br>', $_SESSION['errors']); ?>
  </div>
  <?php endif; ?>
  <?php if(array_key_exists('success',$_SESSION)): ?>
  <div class="alert alert-success">
  <p>Votre email à bien été transmis !</p>
  </div>
  <?php endif; ?>
<form action="send_form.php" method="post" enctype="multipart/form-data">
  <div class="row">
<div class="col-md-6">
  <div class="form-group">
  <label for="inputname">Votre nom</label>
  <input type="text" name="name" class="form-control" id="inputname" value="<?php echo isset($_SESSION['inputs']['name'])? $_SESSION['inputs']['name'] : ''; ?>">
  </div><!--/*.form-group-->
  </div><!--/*.col-md-6-->
<div class="col-md-6">
  <div class="form-group">
  <label for="inputemail">Votre email</label>
  <input required type="email" name="email" class="form-control" id="inputemail" value="<?php echo isset($_SESSION['inputs']['email'])? $_SESSION['inputs']['email'] : ''; ?>">
  </div><!--/*.form-group-->
  </div><!--/*.col-md-6-->
<div class="col-md-6">
  <div class="form-group">
  <label for="inputsubject">Sujet</label>
  <input type="text" name="subject" class="form-control" id="inputsubject" value="<?php echo isset($_SESSION['inputs']['subject'])? $_SESSION['inputs']['subject'] : ''; ?>">
  </div><!--/*.form-group-->
  </div><!--/*.col-md-6-->
<div class="col-md-6">
  <div class="form-group">
  <label for="inputservice">La demande concerne</label>
  <select class="form-control" name="service" id="inputservice">
  <option value=""></option>
  <option value="Un appareil electronique">Un appareil electronique</option>
  <option value="Les fruits et légumes">Les fruits et légumes</option>
  <option value="Un voyage de vacances">Un voyage de vacances</option>
  </select>
  </div><!--/*.form-group-->
  </div><!--/*.col-md-12-->
<div class="col-md-12">
  <div class="form-group">
  <label>Vous êtes</label>
  <div class="radio">
  <label>
  <input type="radio" name="optionsradios" id="optionsradios1" value="Vous êtes un developpeur en herbe qui souhaite apprendre à créer un formulaire">
  Vous êtes un developpeur en herbe qui souhaite apprendre à créer un formulaire
  </label>
  </div>
  <div class="radio">
  <label>
  <input type="radio" name="optionsradios" id="optionsradios2" value="Vous cherchez un code tout prêt car vous êtes quelqu'un de pressé">
  Vous cherchez un code tout prêt car vous êtes quelqu'un de pressé
  </label>
  </div>
  <div class="radio">
  <label>
  <input type="radio" name="optionsradios" id="optionsradios3" value="Vous etes agacé par mes questions sans intérêt  qui me servent juste à mettre du contenu dans ce formulaire :)">
  Vous etes agacé par mes questions sans intérêt  qui me servent juste à mettre du contenu dans ce formulaire :)
  </label>
  </div>
  </div><!--/*.form-group-->
  </div><!--/*.col-md-12-->
<div class="col-md-12">
  <div class="form-group">
  <label>Vous avez achetez ce produit pour <i>(plusieurs réponses possible)</i></label>
  <div class="checkbox">
  <label>
  <input name="multiselect[]" type="checkbox" value="Essayer car vous etes curieux">
  Essayer car vous etes curieux
  </label>
  </div>
  <div class="checkbox">
  <label>
  <input name="multiselect[]" type="checkbox" value="Car vous ne savez pas quoi faire de votre fortune">
  Car vous ne savez pas quoi faire de votre fortune
  </label>
  </div>
  <div class="checkbox">
  <label>
  <input name="multiselect[]" type="checkbox" value="C'est un achat compulsif">
  C'est un achat compulsif
  </label>
  </div>
  </div><!--/*.form-group-->
  </div><!--/*.col-md-12-->
<div class="col-md-12">
  <div class="form-group">
  <label for="inputfiles">Envoyer un fichier</label>
  
  <input type="file" name="upfiles" id="inputfiles">
  <p>Extensions autorisées:<i>.jpeg, .jpg, .png, .pdf</i></p>
  </div><!--/*.form-group-->
  </div><!--/*.col-md-12-->
<div class="col-md-12">
  <div class="form-group">
  <label for="inputmessage">Votre message</label>
  <textarea required id="inputmessage" name="message" class="form-control"><?php echo isset($_SESSION['inputs']['message'])? $_SESSION['inputs']['message'] : ''; ?></textarea>
  </div><!--/*.form-group-->
  </div><!--/*.col-md-12-->
<div class="col-md-12">
  <div class="checkbox">
  <label for="checkspam">
  <input type="checkbox" name="antispam" id="checkspam">Je suis un spammer et je l'assume!
  </label>
  </div>
  </div><!--/*.col-md-12-->
<div class="col-md-12">
  <button type='submit' class='btn btn-primary'>Envoyer</button>
  </div><!--/*.col-md-12-->
</div><!--/*.row-->
  </form>
</div><!--/*.container-->
  <!-- END CONTENT -->
</body>
  </html>
  <?php
unset($_SESSION['inputs']); // on nettoie les données précédentes
  unset($_SESSION['success']);
  unset($_SESSION['errors']);

Je ne vais pas me répéter sur les différents éléments de départ, les informations étant disponible sur l’autre article (en plus du risque de duplicate content) mais vous apporter les explications sur les nouveaux champs intégrés.

Le champ sujet est strictement similaire à celui utlisé pour renseigner le nom, puisqu’il ne s’agit ici que de renseigner des caractères alphanumérique.

Le champ de liste déroulant est créé avec l’utilisation de la balise select et les champs de choix défini par des balises option. Je laisse la première option vide pour 2 raisons: le visiteur doit ici faire un choix, je ne peux donc en mettre un par défaut au risque de fausser la réponse; le champ est obligatoire, la vérification sera donc effectuée en vérifiant si une valeur à bien été choisie.

Les éléments de type radio doivent tous avoir le même name pour chaque groupe de question (supposons que vous en utilisiez plusieurs), la value est le contenu que vous récupérerez dans votre email.

Les éléments de type checkbox doivent également avoir le même name pour chaque groupe. Vous noterez ici l’ajout de [] à la suite du name, qui nous permet ainsi de renvoyer le(s) résultat(s) sous forme de tableau. Ces éléments pouvant avoir plusieurs réponses, cette démarche est nécessaire pour en récupérer la totalité.

Je crée ensuite le champ d’upload de fichier. Personnellement, je n’utilise pas de input type hidden pour définir la taille maximale autorisée, simplement car ce système est peu fiable et que cet élément peut être géré via PHP (choix fait ici).

Le reste est similaire au précédent puisque nous conservons notre champ de message, notre petite « tapette à spam » et l’indispensable bouton de soumission.

Le code PHP de ce formulaire de contact

Nous passons maintenant à la partie traitement de ce formulaire. Nous effectuerons une vérification de nos champs, récupérer les données, gérer le fichier transmis, valider ou non l’envoi du formulaire et, le cas échéant, construire l’email que vous recevrez.

Le code étant (bien?) commenté, vous ne devriez pas avoir de mal à le modifier en fonction de vos besoins.

<?php
session_start();//on démarre la session
// $errors = [];
  $errors = array(); // on crée une vérif de champs
if(!array_key_exists('name', $_POST) || $_POST['name'] == '') {// on verifie l'existence du champ et d'un contenu
  $errors ['name'] = "vous n'avez pas renseigné votre nom";
  }
  if(!array_key_exists('email', $_POST) || $_POST['email'] == '' || !filter_var($_POST['email'], FILTER_VALIDATE_EMAIL)) {
  $errors ['mail'] = "vous n'avez pas renseigné votre email";
  }
  if(!array_key_exists('subject', $_POST) || $_POST['subject'] == '') {
  $errors ['subject'] = "vous n'avez pas renseigné le sujet de la demande";
  }
  if(!array_key_exists('service', $_POST) || $_POST['service'] == '') {
  $errors ['service'] = "Veuillez sélectionner un objet de demande";
  }
  if(!array_key_exists('message', $_POST) || $_POST['message'] == '') {
  $errors ['message'] = "vous n'avez pas renseigné votre message";
  }
  if(array_key_exists('antispam', $_POST)) {// on place un petit filet anti robots spammers
  $errors ['antispam'] = "Vous êtes un robots spammer";
  }
  //Multi checkbox
  if(isset($_POST['multiselect'])){
  $multiselect = array();
  foreach($_POST['multiselect'] as $return_choice){
  $multiselect[] = $return_choice;
  }
  $multiselect = implode(' ; ', $multiselect);
  }
// UPLOAD DE FICHIER
// taille autorisées (min & max -- en octets)
  $file_min_size = 0;
  $file_max_size = 10000000;
 // On vérifie la présence d'un fichier à uploader
  if (($_FILES['upfiles']['size'] > $file_min_size) && ($_FILES['upfiles']['size'] < $file_max_size)) :
  // dossier où sera déplacé le fichier
  $content_dir = 'upload/';
 $tmp_file = $_FILES['upfiles']['tmp_name'];
  if( !is_uploaded_file($tmp_file) ){
  $errors ['upfiles'] = "le fichier est introuvable";
  }
  
  // on vérifie l'extension
  $type_file = $_FILES['upfiles']['type'];
 if( 
  !strstr($type_file, 'jpg') 
  && !strstr($type_file, 'jpeg')
  && !strstr($type_file, 'png')
  && !strstr($type_file, 'gif')
  && !strstr($type_file, 'txt')
  && !strstr($type_file, 'rar')
  && !strstr($type_file, 'zip')
  && !strstr($type_file, 'pdf')
  && !strstr($type_file, 'doc')
  && !strstr($type_file, 'docx')
  // reproduire cette syntaxe pour ajouter d'autre extension
  ){
  $errors ['upfiles'] = "le fichier n'a pas une extension autorisé";
  }
  // Si le formulaire est validé, on copie le fichier dans le dossier de destination
  if(empty($errors)){
  $path = $_FILES['upfiles']['name'];
  $ext = pathinfo($path, PATHINFO_EXTENSION); // on récupère l'extension
  $name_file = md5(uniqid(rand(), true)).'.'.$ext; // on crée un nom unique en conservant l'extension
  if( !move_uploaded_file($tmp_file, $content_dir . $name_file) ){
  $errors ['upfiles'] = "Il y a des erreurs! Impossible de copier le fichier dans le dossier cible";
  }
  } 
  // Si le formulaire contient des erreurs, on annule le transfert du fichier
  
  // On récupère l'url du fichier envoyé
  $get_the_file = "<a href=\"http://". $_SERVER['SERVER_NAME'] . dirname($_SERVER['REQUEST_URI'])."/".$content_dir . $name_file ."\" target=\"_blank\">Accéder au fichier</a>";
elseif($_FILES['upfiles']['size'] > $file_max_size):
  $errors ['upfiles'] = "le fichier dépasse la limite autorisée";
  $get_the_file = "Pas de fichier joint";
  else: 
  $get_the_file = "Pas de fichier joint";
  endif;
//FIN DU SYSTEME D'UPLOAD
//On check les infos transmises lors de la validation
  if(!empty($errors)){ // si erreur on renvoie vers la page précédente
  $_SESSION['errors'] = $errors;//on stocke les erreurs
  $_SESSION['inputs'] = $_POST;
  header('Location: contact.php');
  }else{
  $_SESSION['success'] = 1;
  $headers  = 'MIME-Version: 1.0' . "\r\n";
  $headers .= 'Content-type: text/html; charset=utf-8' . "\r\n";
  $headers .= 'FROM:' . htmlspecialchars($_POST['email']);
  $to = 'Votre_adresse_email_est_ici@mail.fr';
  $subject = 'Message envoyé par ' . htmlspecialchars($_POST['name']) .' - <i>' . htmlspecialchars($_POST['email']) .'</i>';
  $message_content = '
  <table>
  <tr>
  <td><b>Emetteur du message:</b></td>
  </tr>
  <tr>
  <td>'. $subject . '</td>
  </tr>
  <tr>
  <td><b>Sujet du message:</b></td>
  </tr>
  <tr>
  <td>' . htmlspecialchars($_POST['subject']) . '</td>
  </tr>
  <tr>
  <td><strong>objet de la demande:</strong></td>
  </tr>
  <tr>
  <td>'. htmlspecialchars($_POST['service']) . '</td>
  </tr>
  <tr>
  <td><strong>Reponse de "vous etes":</strong></td>
  </tr>
  <tr>
  <td>'. htmlspecialchars($_POST['optionsradios']) . '</td>
  </tr>
  <tr>
  <td><strong>Vous avez achetez ce produit:</strong></td>
  </tr>
  <tr>
  <td>' . htmlspecialchars($multiselect) . '</td>
  </tr>
  <tr>
  <td><b>Contenu du message:</b></td>
  </tr>
  <tr>
  <td>'. nl2br(htmlspecialchars($_POST['message'])) . '</td>
  </tr>
  <tr>
  <td><b>Fichier envoyé:</b></td>
  </tr>
  <tr>
  <tr>
  <td>Nom d\'origine du fichier: '. $_FILES['upfiles']['name']. '</td>
  </tr>
  <tr>
  <td>Type du fichier: '. $_FILES['upfiles']['type']. '</td>
  </tr>
  <tr>
  <td>Taille du fichier: '. $_FILES['upfiles']['size']. ' octets</td>
  </tr>
  <tr>
  <td></td>
  </tr>
  <tr>
  <td>'. $get_the_file .'</td>
  </tr>
  </table>
  ';
mail($to, $subject, $message_content, $headers);
  header('Location: contact.php');
  }

Je passe les étapes décrite dans le premier article.

Pour le champ checkbox, nous utiliserons un isset pour vérifier si une valeur est existante puis un foreach pour parcourir le tableau de valeur (rappelez vous, les [] du name) et nous les renvoyer.

Le traitement du champ upload est un peu plus laborieux :).
Nous commencerons par définir une fourchette de taille de fichier autorisé en créant les variables $file_min_size et $file_max_size (les valeurs sont exprimées en octets). Si le fichier transmis est dans ces critères de taille, nous traiterons celui-ci, le cas contraire, on oublie et, si besoin, retournons un message d’erreur.
On défini le dossier qui accueillera les éléments envoyés (ici upload). Ce dossier doit être créer manuellement dans le même répertoire que send_form.php. Si un problème se crée lors du transfert de ce dossier, on retourne l’erreur.
On défini l’ensemble des extensions autorisées. Le choix ne dépend que de vous et de vos besoins, néanmoins je vous déconseille fortement d’autoriser le .js, le .html et le .php pour des raisons évidentes de sécurité.
Lors du transfert de fichiers, je trouve plus approprié de « brouiller » un peu les pistes en cas d’envoi douteux. Ainsi, le fichier sera renommé et vous serez donc le seul à pouvoir y avoir accès. En plus de vous protéger d’un éventuel nom en double, l’expéditeur ne pourra pas accéder à l’élément envoyé via son navigateur, a moins d’avoir un énorme coup de chance en tapant une url au hasard (il a plus de probabilité de gagner à l’euromillion que de trouver cette url).
Nous créons ensuite l’url du fichier transmis. Celle-ci vous sera envoyée dans le message afin que vous puissiez y accéder en 1 clic.

Nous créons ensuite notre corps de message en y incluant les différentes informations récupérées via le formulaire. Le principe est lui aussi expliqué dans l’autre article.

Conclusion

Vous voilà maintenant avec un ensemble de champ de formulaire et la méthode pour en récupérer les informations ou éléments. Si vous avez des questions ou des améliorations à apporter, n’hésitez pas à le faire via les commentaires. Pour ceux qui souhaiterais utiliser des éléments HTML5 du type input date, month, … je vous rappelle que ces derniers sont encore mal pris en charge par les différents navigateurs.

Commentaires Écrire un commentaire

  • dorodidacte le 4 mai 2015 at 22 h 28 min Répondre

    Bonsoir,

    J’ai suivi votre précédent article pour la création d’un formulaire de contact simple. J’ai mis une bonne partie de l’après-midi et de la soirée pour décortiquer votre code et le css.

    Résultat : Formulaire fonctionnel et personnalisé.

    Et voilà que je tombe sur celui ci qui pourra me servir de base pour un formulaire plus complexe. De longues heures de décorticage en perspective…

    Merci !

    • EpicaDesign administrateurle 5 mai 2015 - 11 h 33 min Répondre

      Bonjour,

      Le code étant similaire, le temps que vous avez précédemment passé reste utile :)

      Bon décorticage

  • Pensae le 10 mai 2015 at 12 h 35 min Répondre

    Re-bonjour, après correction ça marche nickel. Maintenant j’aurai besoin pour mon site que le visiteur puise uploader jusqu’à 3 images. Dois-je faire simplement un copier- coller de :

    Merci de ne pas copier-coller de code dans les commentaires

    ou dois-je renommer certaines variables ? (lesquelles ?)

    Merci

  • Pensae le 10 mai 2015 at 13 h 25 min Répondre

    Bon j’ai réussi pour l’upload de 3 images. J’aimerai que l’upload de l’image 1 soit obligatoire, comment faire ?

    Merci

    • EpicaDesign administrateurle 10 mai 2015 - 14 h 39 min Répondre

      ajouter un « required » au champ input type= »file » concerné

      • Pensae le 10 mai 2015 at 14 h 50 min

        Excellent bravo et merci pour cet excellent tutoriel. Moi qui passait par une extension WordPress dans une iframe pour avoir un formulaire intégré, je suis enfin libéré de WP. Merci beaucoup.

  • lavenir le 22 mai 2015 at 14 h 16 min Répondre

    Merci pour ce script très clair. Que faudrait-il rajouter (et où..) pour qu’une fois le formulaire envoyé, on redirige l’internaute vers une page de remerciement par exemple ?
    merci
    Gérard

    • EpicaDesign administrateurle 23 mai 2015 - 8 h 40 min Répondre

      Bonjour,
      à la dernière ligne de send_form.php, dans header(‘Location: contact.php’);
      Remplacer contact.php par l’URL de votre page.
      Cordialement

  • dorodidacte le 22 juin 2015 at 11 h 09 min Répondre

    Bonjour,

    Mes formulaires qui marchaient très bien jusqu’à aujourd’hui ne fonctionnent plus sans qu’il y ait eu de changement de fait dans le code. Je ne reçois plus d’email, auriez vous une idée ou un début de piste ? Est ce déjà arrivé ?

    Il m’indique bien que mon mail a été envoyé et je ne suis pas en local…

    • EpicaDesign administrateurle 22 juin 2015 - 11 h 59 min Répondre

      Désolé, aucun cas similaire n’a été signalé. Je ne peux vous aider.

  • Matt le 24 août 2015 at 22 h 02 min Répondre

    Bonjour,
    Est-il possible (et comment) d’avoir une boite de dialogue qui indique que le formulaire valide et bien transmis ?

    Merci pour votre tuto très clair.

  • Ben le 13 septembre 2015 at 15 h 28 min Répondre

    Bonjour,
    J’ai remarqué que nous avions une erreur d’envoi si le nom du fichier comprenait un ou des espaces. Ex : « nom du fichier.doc ».

    Comment résoudre ce problème ? Merci

    • Ben le 14 septembre 2015 at 11 h 27 min Répondre

      Rebonjour,

      Bon en fait, ce n’est n’y les espaces ni les majuscules, il ne prend pas tous les fichiers word (.doc et .docx), c’est un peu au petit bonheur la chance j’ai l’impression. Pourtant ces fichiers ne sont pas gros et les extensions sont bonnes, certains partent bien, mais d’autres me donnent l’erreur de mauvaise extension.

      Une idée ?

      • EpicaDesign administrateurle 14 septembre 2015 - 11 h 34 min

        Bonjour,
        c’est un peu au petit bonheur la chance :)
        Je ne vous cache pas que je suis toujours ennuyé avec les dysfonctionnements aléatoires, leur origine étant évidemment difficile à déterminer. Je vais faire quelques tests et vous tiens informé.
        Cordialement

  • Ben le 14 septembre 2015 at 15 h 00 min Répondre

    Merci pour votre retour,
    J’ai un autre problème, qui me parait là aussi aléatoire. :/ Le message part bien sur une adresse gmail (la mienne) mais ne part pas sur les autres messageries (un autre gmail, un hotmail et une adresse sur nom de domaine OVH) que je paramètre dans le send_form.php . Votre code me semble correct, (bon je ne suis pas un spécialiste php), je suis un peu perdu sur les résultats que j’obtiens.

  • patnour le 23 octobre 2015 at 10 h 25 min Répondre

    Bonjour,

    Tout dabord je m’excuse car Je n’ai pas encore beaucoup de connaissance en php.
    Je suis entrain de créer un site internet et je souhaiterai utiliser votre formulaire en l’adaptant bien sur à mon cas.
    Ma situation est la suivante un site web avec bootstrap 3.3.5 avec 2 formulaires de contact différents (on y accéde en cliquant sur des » btn-primary » qui ouvre un modal avec un formulaire créé) écrit avec bootstrap.
    Comment intégrer ce formulaire, comment et quel code je dois mettre sur mes formulaires créés pour faire l’appel du fichier contact.php et du fichier send_form.php adaptés.

    Merci d’avance pour votre aide.
    Bien à vous.
    Patrice.

  • Eric le 20 novembre 2015 at 8 h 38 min Répondre

    Bonjour. J’aimerais modifier couleur et bouton de « parcourir » du « envoyer un fichier » pour qu’il ressemble au bouton « envoyer » de la fin du formulaire..
    Comment procéder ?

    Merci d’avance

    Eric

    • EpicaDesign administrateurle 21 novembre 2015 - 20 h 17 min Répondre

      Bonjour,

      un peu d’ajout de code CSS apportera la solution. Je vous laisse vous référer à cette article si vous souhaitez un code tout pret:
      http://geniuscarrier.com/how-to-style-a-html-file-upload-button-in-pure-css/

      Dans le code, vous remplacerez

      < input type="file" name="upfiles" id="inputfiles" >

      par

      < div class="fileUpload btn btn-primary" >
          < span >Upload
          < input class="upload" type="file" name="upfiles" id="inputfiles" >
      
      

      Je vous laisse le choix du CSS pour le bouton
      ps: les espaces dans le code de balisage sont à supprimer, ils servent uniquement à éviter la prise en compte de ces balise HTML dans ce commentaire

  • stakleni le 13 décembre 2015 at 20 h 13 min Répondre

    Bonjour. Je trouve votre formulaire excellent….il est rare de trouver un script de formulaire qui contient plusieurs éléments (checkbox, sélection multiple, upload de fichier). Vraiment BRAVO et un GRAND MERCI. Petit bémol: vous n’interdisez pas les caractères spéciaux….cela ne pose-il pas un problème de sécurité, p.ex. des injections de code javascript ?

    • EpicaDesign administrateurle 13 décembre 2015 - 22 h 47 min Répondre

      Bonjour,
      je vous remercie pour les compliments. Les caractères spéciaux peuvent être saisis dans les champs d’édition de texte mais n’auront aucune portée en terme d’injection de code puisqu’ils seront « nettoyés » lors du traitement par la fonction htmlspecialchars(…). Si vous souhaitez plus d’infos sur celle-ci, je vous laisse vous référer à la doc. PHP officielle : lien vers la page.

      • kokoriko le 12 janvier 2016 at 10 h 45 min

        Bonjour, Super site, vraiment super, très utile. Malheureusement je ne suis pas spécialistes et j’ai 3 questions ci-dessous….

        Je voulais juste savoir comment on fait pour:
        – n’autoriser que des chiffres pour les champs qui ne peuvent recevoir que des chiffres (p.ex. code postal, n° de téléphone….)?
        – changer le style et l’endroit des messages d’erreurs ?
        – ajouter plusieurs champs upfiles….j’ai essayé de faire copier coller le code mais en pratique il ne retient que le dernier fichier uploader. Faut-il copier coller le code pour chaque nouveau upfiles dans send_form ou suffit-il de créer plusieurs upfiles (1,2,3) et de mettre des virgules (ou autre chose) dans le code correspondant dans send_form….?

        Un très grand merci d’avance si vous avez le temps d’y répondre…

  • EpicaDesign administrateurle 13 janvier 2016 - 9 h 05 min Répondre

    Bonjour @kokoriko,
    question 1:
    utilisez les attributs spécifique aux champs de formulaire. Voici 2 liens bien utile
    Attributs
    Type

    Question 2:
    Les messages d’erreurs sont definis par le code allant de la ligne 26 (inclus) à 35 (inclus). Pour les déplacer, déplacez l’ensemble. Pour le style, vous pouvez modifier les class et les balises html comme bon vous semble.

    Question 3:
    Pour dupliquer les champs upfiles, au plus simple:
    Dupliquer le code du champ de formulaire (ligne 117 à 124) en prenant soin d’attribuer un id et un name unique à chacun
    ensuite il vous faut intervenir sur le code php entre « UPLOAD DE FICHIER » et « FIN UPLOAD DE FICHIER » pour y insérer les nouveaux name de champs input.
    Je ne pourrais malheureusement pas vous expliquer cette démarche sur un commentaire, il serait bien trop long (les virgules ne sont pas une solution en tout cas). Pensez au forum d’entraide.

    Cordialement,

  • patnour le 20 janvier 2016 at 11 h 29 min Répondre

    Bonjour,

    Je vous remercie de partager vos connaissances avec toute la communauté de développeurs, ce site m’aide énormément à parfaire mes connaissances de jeune développeur.

    J’aurais 2 questions si voulais bien y répondre :

    1- Je souhaiterai intégrer en plus dans votre formulaire qui fonctionne très bien avec la structure proposé, un champs « téléphone ».
    Dans le fichier contact et send_form, qu’elle code php dois-je ajouter pour que l’utilisateur ne puisse écrire dans ce champs qu’un numéro de téléphone fixe ou portable à 10 chiffres et pas de texte.

    2- Je souhaiterai faire focntionner votre formulaire dans une page modal bootstrap (un « include » de ce formulaire a été créé). Au clique d’un bouton sur mon footer (un « include » de mon footer a été créé aussi) une page modal s’ouvre, votre formulaire apparait mais il ne fonctionne pas.
    La structure est la suivante :
    J’ai créé un « include » footer et dans ce footer il y a un « include » de votre formulaire. Les 2 « include php » sont dans dans le même dossier appelé « include ».

    Avez-vous une solution à me proposer pour que cela fonctionne svp.

    Merci d’avance pour votre aide.

  • Dafid5 le 3 février 2016 at 23 h 23 min Répondre

    Bonsoir,

    Merci pour ce formulaire, c’est tout à fait ce que je recherchais, cependant je rencontre un souci après l’envoi du message, car la personne n’a pas la confirmation de l’envoi qui s’affiche sur la page comme dans la démo. Auriez-vous un idée ? merci

    dans ma page contact.php

    ………

    <?= implode(

    );

    dans la page : send-contact.php
    <?php
    session_start(

    );
    }

  • EpicaDesign administrateurle 4 février 2016 - 18 h 14 min Répondre

    Bonsoir,
    Au vu du lien vers votre page (http://www.diet…nte.com/contact.php), le fichier send_form.php n’est pas correctement appelé, via la ligne 36 (demo) de contact.php

    < form action="send_form.php" method="post" enctype="multipart/form-data" >

    en vérification, lorsque dans l’url de votre page vous remplacez contact.php par send_form.php, vous devez avoir en retour un message d’erreur de remplissage des champs de formulaire. Dans votre cas, c’est un retour de type 404 (page non trouvé).

    • Dafid5 le 26 février 2016 at 7 h 08 min Répondre

      Bonjour merci de votre réponse, j’ai changé volontairement send_form.php par send-contact.php. Je reçois bien les formulaires des personnes me contactant mais je n’ai pas le message confirmant l’envoi du message, ce qui fait que les gens appui plusieurs fois sur le bouton envoyer.

      <?= implode('’, $_SESSION[‘errors’]); ?>

      Votre email à bien été transmis !

      Vos coordonnées
      Nom :<input required type="text" id="nom" name="nom" value=" » tabindex= »1″ />
      Email :<input required type="email" id="email" name="email" value=" » tabindex= »2″ />

      Votre message :
      Objet :<input required type="text" id="objet" name="objet" value=" » tabindex= »3″ />
      Message :

      Envoyer

      • EpicaDesign administrateurle 26 février 2016 - 9 h 23 min

        Bonjour,
        Je vois que vous avez modifier les attributs (ex: name= »nom ») des champs de saisies, avez vous pensez à répercuter ces modifications dans votre fichier send-contact.php ?

      • dafid5 le 27 juillet 2016 at 23 h 14 min

        Bonsoir EpicaDesign,

        Je n’ai toujours pas trouvé réponse à mon problème.

        Mon formulaire fonctionne en grande partie, je reçois toutes les données inscrites dans les cases, mais le message permettant à l’internaute de savoir que son formulaire a été envoyé ne s’affiche toujours pas.

        Pourriez-vous me proposer une solution, peut-être en message privé ?

        cordialement

  • PNS le 17 février 2016 at 16 h 48 min Répondre

    Bonjour,
    Tout d’abord, merci pour votre aide précieuse et la disponibilité dont vous faites preuve.
    J’ai simplement une interrogation, (il me semble que) j’ai bien suivi vos instructions, mais lors de mes tests, lorsque j’oublie de rentrer quelque chose dans un des champs proposés, je n’arrive pas à conserver les données rentrées et il me faut alors tout resaisir (en gros, je n’arrive pas à récupérer les informations de session, malgré les balises <?php session_start(); insérées dans mon html et mon php).
    Pouvez-vous m'indiquer quelle peut être mon erreur ?
    Merci d'avance.

  • olivier01234 le 2 mars 2016 at 18 h 56 min Répondre

    Bonjour,
    bon travail mais pas encore fonctionnel ici … Qui aurait une petite idée ?
    Je cherche mais je ne trouve pas … grrr
    Merci

    Warning: session_start() [function.session-start]: Cannot send session cookie – headers already sent by (output started at /home/hello/www/contact.php:1) in /home/hello/www/contact.php on line 3

    Warning: session_start() [function.session-start]: Cannot send session cache limiter – headers already sent (output started at /home/hello/www/contact.php:1) in /home/hello/www/contact.php on line 3

  • olivier01234 le 2 mars 2016 at 18 h 58 min Répondre

    Et dans la foulée de ce super travail … possible de récupérer le fichier css ? merci

  • BO-1951 le 25 mars 2016 at 18 h 18 min Répondre

    Bonsoir,

    J’ai copié les 2 pages de code concernant votre formulaire très complet et facilement modifiable.
    Malheureusement je rencontre un problème que je n’arrive pas à corriger.
    J’ai donc déposé à la racine d’un site en ligne les deux pages du formulaire plus le dossier upload, sans apporter aucune modification à votre code hormis mon adresse mail et les noms des pages pour ne pas entrer en conflit avec le contact.php du site.
    Lorsque je remplie les champs sans adjoindre de fichier à télécharger tout se passe à merveille et je reçois l’email instantanément.
    Lorsque je remplie les champs et que j’ajoute un fichier à télécharger le fichier se charge sans pb dans le dossier upload du site, mais je ne reçois jamais l’email. Pourquoi ?
    Pourriez-vous m’éclairer
    Merci

  • mm58031 le 16 avril 2016 at 15 h 07 min Répondre

    Bonjour Epica,
    Je dois dire que tout fonctionne à merveille et est facilement transposable. Je vous remercie beaucoup !
    Serait-ce abusé de vous demander si vous saviez (ou si quelqu’un le sait ici), dans le cas où le formulaire est situé dans le footer d’un site one-page, c’est à dire bien au délà de l’écran, comment faire pour que la page send_form.php se rende automatiquement au formulaire, pour que l’utilisateur puisse lire convenablement le message d’alerte ? (Dans mon cas, l’utilisateur retombe sur le header et doit scroller juuuusqu’au formulaire pour voir si son message est bien envoyé…)
    merci beaucoup!

    • EpicaDesign administrateurle 16 avril 2016 - 16 h 09 min Répondre

      Bonjour mm58031,
      Rien de bien compliqué pour mettre ceci en place.
      Vous allez ajoutez un ID à la div contenant votre formulaire.
      Dans notre cas, en prenant pour référence le code indiqué sur ce site, il s’agit de < div class="container" > situé à la ligne 24 (pour le code de contact.php) qui va donc devenir < div id="formcontainer" class="container" >
      Puis, dans le fichier send_form.php, vous allez modifier les éléments « header(‘Location: contact.php’); » (ligne 87 et 155) pour leur indiquer de renvoyer sur cet ID. Ils deviendront donc header(‘Location: contact.php#formcontainer’);

      C’est exactement le même principe que déclencher une ouverture de page ou un lien renvoyant vers un élément spécifique, le principe de l’ancre.

      Bon week end

  • yoanng le 20 avril 2016 at 14 h 44 min Répondre

    Bonjour,

    Encore bravo et merci pour cette aide précieuse.
    J’ai une erreur répétitive sur  » je ne suis un spammer » que je veux convertir en « je ne suis pas un robot » > qui inclus forcement une modification du code php
    Pouvez vous m’aidez ?

    Merci

    • EpicaDesign administrateurle 20 avril 2016 - 15 h 58 min Répondre

      Bonjour,
      Si vous inversez la condition, c’est à dire cocher la case pour pouvoir envoyer le message, le filtre antispam n’a plus d’intérêt. Les robots cochants tout …
      Mais voici la démarche:
      vous modifier le texte, ligne 129 de contact.php (démarche que vous aviez déjà faite je pense).
      puis vous inversez la condition à la ligne 21 de send_form.php, en modifiant « if(array_key_exists(‘antispam' » par if(!array_key_exists(‘antispam’.
      Notez le ! ajouté qui signifie , en version simple, « si l’élément n’existe pas ou n’est pas sélectionné ».

      Voilà, a vous de jouer

  • yoanng le 20 avril 2016 at 16 h 56 min Répondre

    J’ai réussi, mais du coup, je vais faire un pas en arrière si les robots coche tout ( – – ‘)
    Merci beaucoup ! Très bon site !

  • nn le 22 avril 2016 at 13 h 14 min Répondre

    Bonjour,
    moi j’ai trouvé un problème pour le bouton en fois cliquer sur le bouton il affiche « l’objet non trouvable » et error 404.
    je ne sais pas le problème

  • pensae le 5 mai 2016 at 13 h 46 min Répondre

    Bonjour, ce formulaire est vraiment très bon et je l’ai adapté sur le site http://animateur-nature.com/formulaire-identification.php pour l’envoi de photos de plantes à identifier.
    J’ai un deuxième site http://quelle-est-cette-fleur.com/ sur le même serveur mais dans un répertoire différent (www) et je n’arrive pas à utiliser le formulaire. Je suis obligé d’envoyer le visiteur vers le formulaire sur http://animateur-nature.com pour que ça marche avez-vous une idée de ce qui peut coincer ?
    Petite précision : En apparence tout semble correct, après l’envoi le visiteur atterrit sur la bonne page sans erreur php ni lien mort , seul les fichier ne sont pas uploadées dans le répertoire (ni sur le premier ni sur le second site) et aucun mail n’est envoyé.

    Merci

    • ahlem le 23 mai 2016 at 9 h 31 min Répondre

      s’il vous plait aide moi , ça marche pas pour moi

  • ahlem le 23 mai 2016 at 9 h 25 min Répondre

    ça marche pas pour moi ,j’ copier le code j’ pas recu de msg .

  • Sana le 4 octobre 2016 at 9 h 29 min Répondre

    Bonjour,
    Merci pour ce formulaire très fonctionnel.
    Je n’arrive cependant pas à uploader le fichier. Quel que soit le fichier que je tente d’uploader Je récupère « pas de fichier joint »
    y a -t-il des modifications à apporter dans le code dans le « $get_the_file » ?
    Merci par avance.

  • flo le 5 octobre 2016 at 15 h 12 min Répondre

    Bonjour, superbe tuto ;) cependant j’ai un soucis sur mon ftp free avec le session start

    Warning: session_start() [function.session-start]: open(/mnt/162/sda/3/b/…./sessions/sess_e07818fde40424a551ba16cb751b83e3, O_RDWR) failed: No such file or directory (2) in…..

    merci de votre aide ;)

  • Diesel le 9 octobre 2016 at 15 h 27 min Répondre

    bonjour

    aillant pris la 1ere version du formulaire et intégrer le recaptcha google j’aimerai savoir comment bloquer le bouton submit ( envoyer) tant que le captcha est pas valider comment m’y prendre

  • Niki le 2 novembre 2016 at 12 h 30 min Répondre

    Bonjour,

    La version upgrade fonctionne bien, bon script, merci au développeur.
    Juste un soucis, dans les mail reçus la partie « message » est sur une ligne seulement, pas de retour à la ligne.

    Cordialement

    • Niki le 2 novembre 2016 at 20 h 58 min Répondre

      Re bonjour, ou plutôt bonsoir,

      Je suis heureuse, j’ai trouvé une solution que je donne a ceux qui sont dans la moise.
      Veuillez remplacer :
      ‘. htmlspecialchars($_POST[‘message’]) . ‘
      par :
      ‘. nl2br(htmlspecialchars($_POST[‘message’])) . ‘

      Cordialement

  • Rémy le 16 novembre 2016 at 12 h 29 min Répondre

    Bonjour
    Les extensions xls, doc, txt sont refusées dans les pièces jointes alors quelles sont déclarées dans send_form ??!!

    Autrement tout est super, juste une petite amélioration peut être ? Les retours à la ligne ne ont pas pris en compte quand on reçoit le mail.

    • EpicaDesign administrateurle 17 novembre 2016 - 9 h 37 min Répondre

      Bonjour,
      J’ai refais un test concernant les extensions et ce dernier à fonctionné …
      concernant les retours, Niki à posté la reponse juste au dessus de votre commentaire. je vais faire un update du code affiché. Cordialement

      • Rémy le 22 novembre 2016 at 0 h 17 min

        Bonsoir
        Je viens de réessayer avec un .doc, j’ai toujours « le fichier n’a pas une extension autorisé ».
        A toute fin utile l’adresse du formulaire.
        http://photosreporter.net/test/contact/contact.php
        Si vous voulez tester par vous même.
        Je ne vois vraiment pas ce qui peut gêner (les autres extensions passent sans problèmes )

    • EpicaDesign administrateurle 22 novembre 2016 - 10 h 45 min Répondre

      Le .doc est une vieille extension, ne serait-ce pas plutot .docx

  • Rémy le 22 novembre 2016 at 12 h 19 min Répondre

    C’est ok avec .docx mais .xlsx ne fonctionne pas !!!???
    Pourtant les 2 sont déclarées dans send_form.

  • olivier75008 le 5 janvier 2017 at 20 h 35 min Répondre

    Bonjour, et félicitations pour ce superbe formulaire que j’ai pu adopter sans souci.
    Je cherche en vain à automatiser l’interdiction d’ajout de lien http ou https dans le champ de formulaire « message » notamment (le filtre antispam semble ne pas être assez efficace pour mon site). Je pense avoir compris qu’il faut inclure une ligne de code dans le send_form.php. Je suis très novice en programmation, j’ai cherché plusieurs méthodes, dont l’utilisation de la fonction preg_match, mais je n’y suis pas arrivé. Pourriez-vous me venir en aide svp ?

    • EpicaDesign administrateurle 6 janvier 2017 - 9 h 11 min Répondre

      Bonjour,
      Vous ne pourrez pas empecher l’ajout de lien dans le contenu via un code PHP, il faudrait utiliser du JS pour cette démarche.
      Pour répondre à votre demande, vous allez donc laisser votre « utilisateur » ajouter son contenu avec des url, mais comme ces dernières ne vous intéresse pas nous allons les supprimer du message.
      Vous allez effectuer ces modifications sur le code:
      l.89 – modifiez :
      $_SESSION[‘success’] = 1;
      $headers = ‘MIME-Version: 1.0’ . « \r\n »;

      pour obtenir
      $_SESSION[‘success’] = 1;
      $regex = « @(https?://([-\w\.]+[-\w])+(:\d+)?(/([\w/_\.#-]*(\?\S+)?[^\.\s])?)?)@ »;
      $headers = ‘MIME-Version: 1.0’ . « \r\n »;

      puis à la ligne 131(ou 132) – modifiez:
      nl2br(htmlspecialchars($_POST[‘message’]))

      pour obtenir
      nl2br(htmlspecialchars(preg_replace($regex, ‘ ‘, $_POST[‘message’])))

      Pour résultat, le message qui vous sera envoyé sera débarrassé de toutes les url qu’il contient

      Cordialement

      EDIT: penser à corriger les apostrophes et guillemets quand vous ajouterez ces éléments de code, l’enregistrement commentaire modifiant celles-ci

      • stephane-toulon le 21 avril 2017 at 14 h 33 min

        Bonjour,

        Votre code est exactement ce dont j’avais besoin et je vous remercie pour nous l’avoir mis à disposition.
        Je l’ai juste adapté à mes besoins, à savoir l’upload de plusieurs fichiers en même temps en n’utilisant qu’un seul champ input, avec l’attribut multiple. Et ça fonctionne pour la partie sélection des fichiers.

        Le problème se pose concernant le traitement et la récupération de ces fichiers : dès que je sélectionne 2 fichiers ou plus, le dossier de destination ne réceptionne plus rien. Plus que débutant en php, la doc et tout ce que je trouve sur le net, ne m’aide pas à savoir ce que je dois changer dans votre code pour que cela fonctionne.
        Pourriez-vous m’indiquer les modifications à effectuer ?

        Merci d’avance.

  • EpicaDesign administrateurle 21 avril 2017 - 15 h 49 min Répondre

    Bonjour @Stephane-toulon,
    Je n’ai pas le temps de vous poster un code complet à l’instant, mais voici une piste. Vous devez faire une boucle foreach sur le contenu du champ d’envoi :
    $files = $_FILES[‘upfiles’];
    foreach ($files[‘error’] as $id => $err) {
    // fonction pour enregistrer, traiter, memoriser …
    // a modifier
    /*
    $path = $_FILES[‘upfiles’][‘name’];
    $ext = pathinfo($path, PATHINFO_EXTENSION); // on récupère l’extension
    $name_file = md5(uniqid(rand(), true)).’.’.$ext; // on crée un nom unique en conservant l’extension
    if( !move_uploaded_file($tmp_file, $content_dir . $name_file) ){
    $errors [‘upfiles’] = « Il y a des erreurs! Impossible de copier le fichier dans le dossier cible »;
    }
    */
    }
    mais il vous faut adapter la suite du code formulaire pour que vous ayez un retour des fichiers transmis correct.
    Cordialement,

  • Clément le 18 mai 2017 at 14 h 18 min Répondre

    Bonjour,
    Tout d’abord félicitations pour les deux formulaires que vous proposez à la communauté.
    Vos explications sont limpides et m’ont beaucoup aidé pour créer le mien. Encore bravo et merci !
    Je m’intéresse beaucoup à la récupération d’informations de la session de l’utilisateur pour qu’il ne doive pas tout ressaisir en cas d’erreur.
    Ce procédé semble très bien fonctionner pour les inputs de type text ou email, mais est-il également adaptable pour les boutons radio et la liste déroulante ?
    Si oui, de quelle façon ?
    Merci d’avance.
    Cordialement

    • EpicaDesign administrateurle 18 mai 2017 - 20 h 21 min Répondre

      Bonsoir Clement,
      je ne peux vous répondre par message car le code sera mal interprété par le bloc de commentaire.
      Créé un compte utilisateur ou envoyez moi un message afin que je puisse vous donner la solution directement par email.
      Cordialement,

  • Bruno le 2 juin 2017 at 18 h 33 min Répondre

    Bonjour,

    Il y a un superbe travail, et j’aurais une ou deux questions, les balises label du formulaire est ce que je peux les enlever pour le remplacer par placeholder= » Entrer Votre Nom » dans la balise input.
    Si oui, le id inputname me servira t-il toujours celui qui ce trouve dans la balise input.

    • EpicaDesign administrateurle 3 juin 2017 - 8 h 30 min Répondre

      Bonjour,
      Vous pouvez utiliser des placeholder en remplacement des labels. Les id des input servent à la correspondance entre label et input via l’attribut for du label, mais la recupération de données se fait via le name des inputs

  • @marice le 10 septembre 2017 at 7 h 45 min Répondre

    Bonjour,
    Je suis un jeune débutant en développement web et parmi tous les sites que j’ai parcouru pour mon apprentissage j’avoue que le votre est vraiment parfait.
    Merci pour tout ce que vous faites et beaucoup de courage à vous.

    • EpicaDesign administrateurle 10 septembre 2017 - 18 h 01 min Répondre

      Merci pour ces compliments.

  • Didi le 14 septembre 2017 at 12 h 08 min Répondre

    Bonjour et VRAIMENT merci pour ces codes !
    Je débute comme beaucoup.
    J’ai un problème concernant les erreurs (ex : champs vides)… après avoir cliqué sur Envoyer :
    Les champs qui marchent : e-mail et message (m’obligeant à remplir ces champs avant de cliquer sur Envoyer encore – c’est parfait)
    Les champs qui ne marchent pas : nom, sujet (affiche la page blanche send-form.php.
    Réaction : suite à la page blanche, je clique sur « page précédente » du navigateur. Et c’est seulement à ce moment là, que l’on voit afficher les messages d’erreur. Mais les utilisateurs risquent de ne pas faire cette action…
    Pourriez-vous m’aider svp ?
    Merci infiniment !

    • EpicaDesign administrateurle 14 septembre 2017 - 12 h 40 min Répondre

      Bonjour,
      Vous devez effectuer vos tests en dehors d’une configuration permettant de traiter le php, la redirection ne s’effectue donc pas. La verification email est native de ce type de champ, c’est pour cela qu’elle fonctionne. Utilisez Wamp par exemple, ce qui vous permettra d’interpréter l’ensemble du code. Il y a un article concernant Wamp sur ce blog. Cordialement,

      • Didi le 14 septembre 2017 at 13 h 23 min

        Merci pour votre réactivité !
        Désolée d’insister mais au cas où s’il y a eu quiproquo…
        Mais mes fichiers sont déjà sur un serveur pour le test, donc je n’ai pas besoin de Wamp qui sert de simulation, non ?
        ou peut-être que je ne comprend pas cette phrase « Vous devez effectuer vos tests en dehors d’une configuration ».

        Info complémentaire.
        J’ai ces fichiers dans le même root :
        1. index.php avec

        pour y insérer mon code.
        2. contact.inc.php (formulaire)
        3. send-form.php (traitement)
        avec mes personnalisations et surtout où j’ai remplacé 2 fois les lignes
        header(‘Location: index.php#formcontainer’);

        Encore une fois désolée, mais je débute à peine, il y a quelques jours… Mais en tout cas, j’ai quasi lu tous les commentaires de ce post.
        Merci encore :)

      • Didi le 14 septembre 2017 at 13 h 58 min

        J’ai aussi essayé sur Mamp, j’ai importé les fichiers dans htdocs mais ça me fait la même erreur… :O

      • EpicaDesign administrateurle 14 septembre 2017 - 14 h 13 min

        Est il possible d’avoir l’url de la page hébergeant le formulaire (url que je supprimerais des commentaires afin qu’elle ne soit pas « public ») ?

      • Didi le 14 septembre 2017 at 14 h 52 min

        Bien évidemment :)
        Je vous l’ai envoyé par message via votre page contact


Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée.

*