Bonjour à toutes et à tous;

Je suis en train de tester un petit formulaire de contact Ajax-PHP et je suis confronté à une petite erreur: Les messages de réussite ou d'échec générés par Ajax quand le formulaire est soumis.

Pour le contexte, pour limiter le spam j'ai intégré un HoneyPot (un input caché en css qui ne peut donc pas être rempli par l'utilisateur mais qui sera rempli par le robot). Et avant d'envoyer le mail le programme PHP vérifie si la valeur de cet input (country ici) est vide ou pas. Si il est vide le mail est envoyé, sinon, non.

Le soucis est qu'avec la vérification empty() en PHP, le mail est bien renvoyé mais le message de succès ne s'affiche plus.

Par contre quand la fonction empty() n'est pas utilisée tout fonctionne, les messages s'affichent.

J'utilise Swiftmailer pour envoyer le mail PHP. Fonctionne avec Mailtrap pour le moment.

Voici les différentes parties de mon code:

Formulaire HTML (la balise aside doit contenir les messages Ajax:
Code html : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
<main class="container">
          <form id="contact-form" action="contact3.php" method="post">
              <aside class="alert d-none">   <!-- Contient les erreurs Ajax -->
              </aside>
              <ul class="list-unstyled">
                  <li class="form-group">
                      <label for="name">Nom</label>
                      <input type="text" class="form-control" id="name" name="name">
                  </li>
                  <li class="form-group">
                      <label for="email">Email</label>
                      <input type="email" class="form-control" id="email" name="email">
                  </li>
                  <li class="form-group">
                      <label for="subject">Sujet</label>
                      <input type="text" class="form-control" id="subject" name="subject">
                  </li>
                  <li class="form-group">
                      <label for="message">Message</label>
                      <textarea name="message" id="message" cols="30" rows="10" class="form-control"></textarea>
                  </li>
                  <li class="form-group-cache">
                        <label for="country">country</label>
                        <input type="text" class="form-control" id="country" name="country">  <!-- champ caché en css (HoneyPot) -->
                  </li>
                  <li class="form-group">
                      <button class="btn btn-primary">Envoyer</button>
                  </li>
              </ul>
          </form>
      </main>

Partie JS (j'utilise Jquery):

Code javascript : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
'use strict';
$(function () {
    $('#contact-form').submit(function (event) {
        // Annule l'action par défaut (on ne veut pas que la page se recharge)
        event.preventDefault();
        // Envoi de la requête XHR
        $.post($(this).attr('action'), $(this).serializeArray(), function (data) {
            let $aside = $('#contact-form aside');
 
            // Notifications
            if (data.result) {
                $aside.addClass('alert-success').text('Le message a bien été envoyé !').removeClass('d-none');
 
            } else {
                $aside.addClass('alert-danger').text('Erreur lors de l\'envoi du message !').removeClass('d-none');
 
            }
        });
 
    });
 
});

Partie PHP. Ne vous inquiétez pas si tout n'est pas encore sécurisé, pour l'instant c'est juste pour tester mon HoneyPot. Les données SMTP de Swiftmailer ont été anonymisées:

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
 
<?php
 
 
if(isset($_POST['name']) AND isset($_POST['email']) AND isset($_POST['subject'])AND isset($_POST['message']) AND isset($_POST['country'])) {
 
    if(empty($_POST['country'])) {    /*on vérifie si le champ country est bien vide, et donc que c'est bien un humain qui a rempli le formulaire*/
 
        $name = strip_tags($_POST['name']);
        $email = strip_tags($_POST['email']);
        $subject = strip_tags($_POST['subject']);
        $message = strip_tags($_POST['message']);
 
        header('Content-Type: application/json');
        // On inclut le fichier autoload du dossier vendor
        require __DIR__ . '/vendor/autoload.php';
        // Create the Transport
        $transport = (new Swift_SmtpTransport('smtp.mailtrap.io', 2525))
            ->setUsername('xxxxxxxxxxxxxxx')
            ->setPassword('xxxxxxxxxxxxxxxxxxxx);
        // Create the Mailer using your created Transport
        $mailer = new Swift_Mailer($transport);
        // Create a message
        $message = (new Swift_Message("Nouveau message de {$name}[{$email}] : {$subject}"))
            ->setFrom(['xxxxxxxxxxxxxxxx])
            ->setTo(['destinataire@adresse.fr'])
            ->setReplyTo($email)
            ->setBody($message);
        // Send the message
        $result = $mailer->send($message);
        echo json_encode([
            'result' => $result
        ]);
 
     }
 
 }


J'ai beau relire mon code dans tout les sens, je ne comprend pas pourquoi l'utilisation de la fonction empty() en PHP empêche d'afficher les messages Ajax, alors que le mail est bien envoyé...


Je vous remercie par avance pour vos réponses, en espérant avoir pu donner des informations claires.

Bien cordialement.