IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage PHP Discussion :

Retour du php me fait sortir de mon site web


Sujet :

Langage PHP

  1. #1
    Membre averti Avatar de awalter1
    Inscrit en
    Août 2004
    Messages
    994
    Détails du profil
    Informations forums :
    Inscription : Août 2004
    Messages : 994
    Points : 407
    Points
    407
    Par défaut Retour du php me fait sortir de mon site web
    Bonjour,

    Dans mon site https://abc.go.yj.fr/ à partir de ma page de contact, je permets au visiteur de m'envoyer un mail via le programme contact.php.
    Le mail est bien envoyé, mais l'acquittement de ma fonction php est affiché dans une nouvelle page blanche d'url https://abc.go.yj.fr/contact.php.
    Comment afficher l'acquittement sur ma page d'envoi ? Accessoirement effacer les champs?

    Merci

    Code extrait du html:
    Code html : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
        <div id="formContact">
          <form method="post" action="contact.php">
            <input type="text" name="nom" placeholder="Nom" required><br>
            <input type="email" name="email" placeholder="E-mail" required><br>
            <textarea name="message" placeholder="Message" required></textarea><br>
            <input type="submit" value="Envoyer">
          </form>

    Code du fichier contact.php:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    <?php
          if (isset($_POST["message"])) {
            $retour = mail("xxx@gmail.com", "abc.go.yj.fr", $_POST["nom"] . "\n" . $_POST["email"] . "\n" . $_POST["message"]);
            if($retour)
                  echo '<p>Message bien envoyé</p>';
            else
                  echo '<p>Pas de message</p>';
          };

  2. #2
    Membre averti Avatar de ddaweb
    Homme Profil pro
    Webmaster amateur
    Inscrit en
    Janvier 2013
    Messages
    329
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Webmaster amateur
    Secteur : Associations - ONG

    Informations forums :
    Inscription : Janvier 2013
    Messages : 329
    Points : 430
    Points
    430
    Par défaut
    Je viens de tester sur votre site (vous avez donc reçu un mail bizarre ) ... cela ne me semble pas anormal ce qui se passe.

    Modifiez votre ligne :
    Code html : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    <form method="post" action="contact.php">
    // ---- rester sur la même page
    <form method="post" action="#contact">

    Là vous envoyiez vers une nouvelle page qui est contact.php, il faut rester sur la même page.

    Il faut donc mettre toute la partie de la page contact actuelle dans le début de la page principale : avant le HTML et mettre le message juste devant le formulaire pour être facilement lisible :

    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
    // ---- Traitement du mail en début de page
    <?php
          if (isset($_POST["message"])) {
            $retour = mail("xxx@gmail.com", "abc.go.yj.fr", $_POST["nom"] . "\n" . $_POST["email"] . "\n" . $_POST["message"]);
            if($retour)
                  $message_mail='Message bien envoyé';
            else
                 $message_mail='Pas de message';
          };
    ?>
    // ----- Formulaire de contact
    <div id="formContact">
          <?php if (isset($message_mail)) { echo $message_mail; } ?>
         <form method="post" action="#contact">
            <input type="text" name="nom" placeholder="Nom" required><br>
            <input type="email" name="email" placeholder="E-mail" required><br>
            <textarea name="message" placeholder="Message" required></textarea><br>
            <input type="submit" value="Envoyer">
         </form>
    </div>
    La mise en page du message est à faire, CSS par exemple.

  3. #3
    Membre averti Avatar de awalter1
    Inscrit en
    Août 2004
    Messages
    994
    Détails du profil
    Informations forums :
    Inscription : Août 2004
    Messages : 994
    Points : 407
    Points
    407
    Par défaut
    Merci de ta réponse.

    Je comprends que le bouton Envoyer renvoie sur le début de la section et le champ message étant renseigné on passe dans le if isset et l'envoi du mail se fait.

    Cependant, pas de message affiché : il y a un flash de la page laissant penser qu'il y a rafraichissement de la page : le message a pu être effacé par ce rafraichissement?
    Et pas de mail reçu (j'ai tout de suite essayé l'envoi de mail avec l'ancienne version (fichier contact.php) et j'ai eu le message).

    Mon fichier index.html, qui incorpore dans ta solution le code php, ne devrait t'il pas devenir un index.php?

    Merci

  4. #4
    Membre averti Avatar de awalter1
    Inscrit en
    Août 2004
    Messages
    994
    Détails du profil
    Informations forums :
    Inscription : Août 2004
    Messages : 994
    Points : 407
    Points
    407
    Par défaut
    il faut attendre jusqu'à demain car je vois des mails de ce matin arriver au compte gouttes ...

  5. #5
    Membre averti Avatar de ddaweb
    Homme Profil pro
    Webmaster amateur
    Inscrit en
    Janvier 2013
    Messages
    329
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Webmaster amateur
    Secteur : Associations - ONG

    Informations forums :
    Inscription : Janvier 2013
    Messages : 329
    Points : 430
    Points
    430
    Par défaut
    Citation Envoyé par awalter1 Voir le message
    Mon fichier index.html, qui incorpore dans ta solution le code php, ne devrait t'il pas devenir un index.php?i
    Oui, en effet, quand il y a du PHP, le nom de la page doit avoir l'extension .phpPour le serveur, cela ne va rien changer, mais il ne faut pas 2 page index avec les 2 extensions, donc 1 seule page index !! -> le serveur regarde après une et ensuite l'autre d'une manière transparente pour vous (je ne sais pas dans quel ordre).

  6. #6
    Membre averti Avatar de ddaweb
    Homme Profil pro
    Webmaster amateur
    Inscrit en
    Janvier 2013
    Messages
    329
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Webmaster amateur
    Secteur : Associations - ONG

    Informations forums :
    Inscription : Janvier 2013
    Messages : 329
    Points : 430
    Points
    430
    Par défaut
    Citation Envoyé par awalter1 Voir le message
    il faut attendre jusqu'à demain car je vois des mails de ce matin arriver au compte gouttes ...
    Je ne suis pas persuadé que mail() fonctionne encore correctement chez PlanetHoster, j'avais aussi un comportement aléatoire et le support m'a clairement fait comprendre que ce n'est plus vraiment supporté et qu'une solution alternative était conseillée ... je n'ai plus le moindre accroc depuis.
    Ces arrivées un peu bizarre semblent aller dans mon sens

  7. #7
    Membre averti Avatar de awalter1
    Inscrit en
    Août 2004
    Messages
    994
    Détails du profil
    Informations forums :
    Inscription : Août 2004
    Messages : 994
    Points : 407
    Points
    407
    Par défaut
    Bonjour,

    Avec le fichier index.php, ça marche nickel : le mail arrive dans la foulée.
    Le message "Mail bien envoyé" reste affiché sur la page même après son rechargement. J'ai fait un unset() de la variable message_mail après l'affichage de son contenu mais ça ne change rien :
    voir ligne 16 du
    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
     
      <section id="contact">
        <!-- Page contact -->
        <?php
          if (isset($_POST["message"])) {
                  $retour = mail("walter.alain.serge@gmail.com", "Peindreamonampteuil.go.yj.fr",  $_POST["nom"] . "\n" . $_POST["email"] . "\n" . $_POST["message"]);
                  if($retour)
                    $message_mail='Message bien envoyé';
                  else
                    $message_mail='Pas de message';
             }
        ?>
        <h2>Contactez-moi</h2>
        <div id="formContact">
          <?php if (isset($message_mail)) {
             echo $message_mail;
             unset($message_mail);
          } ?>
          <!-- <form method="post" action="contact1.php"> -->
          <form method="post" action="#contact">
            <input type="text" name="nom" placeholder="Nom" required "^[A-Za-z '-]+$" maxlength="30"><br>
            <input type="email" name="email" placeholder="E-mail" required
              pattern="^[A-Za-z.]+@{1}[A-Za-z]+\.{1}[A-Za-z]{2,}$"><br>
            <textarea name=" message" placeholder="Message" required pattern="^[A-Za-z .,;()/#@'-1234567890]+$"
              maxlength="200"></textarea><br>
            <input type="submit" value="Envoyer">
          </form>
        </div>
      </section>
    Pour le mailing, qu'utiliserais tu pour remplacer la fonction mail()? PHPmailer?.
    Ceci dit tant que ça marche, je garderais mail(), je n'ai pas vocation à recevoir beaucoup de mails.

    Merci

  8. #8
    Membre averti Avatar de awalter1
    Inscrit en
    Août 2004
    Messages
    994
    Détails du profil
    Informations forums :
    Inscription : Août 2004
    Messages : 994
    Points : 407
    Points
    407
    Par défaut
    Je m'aperçois que je reçois un mail à chaque fois que j'accède à ma page.
    En fait ce sont les champs du formulaire qui restent définis et donc le isset($_POST["message"]) est toujours vrai.
    Je cherche ...
    Il semble que lorsque je valide un formulaire, pour faire simple, je créé des valeur dans le header de ta page.
    Si je viens à recharger la page qui viens de subir une action, elle se répètera ...
    Il suffit de remettre à zéro la variable superglobale du tableau $_POST, mais ça n'a pas l'air courant, je cherche...

  9. #9
    Membre confirmé
    Homme Profil pro
    Autre
    Inscrit en
    Juillet 2021
    Messages
    321
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Autre

    Informations forums :
    Inscription : Juillet 2021
    Messages : 321
    Points : 642
    Points
    642
    Par défaut
    Bonjour,

    Si tu recharges la page après avoir soumis ton formulaire avec la méthode POST, tu devrais avoir un avertissement du navigateur qui te demande de confirmer si tu veux renvoyer la requête POST et donc soumettre une nouvelle fois le formulaire.
    Pour éviter ce comportement, la solution classique est de faire une redirection GET après l'envoi du mail afin que le rechargement de la page depuis le navigateur relance la requête GET et pas la requête POST (principe POST-Redirect-GET).

    Tu peux faire la redirection après l'envoi de ton mail avec la fonction php header(). Le message de retour ("Message bien envoyé" ou "Pas de message") devra alors transiter sur la page redirigé soit en utilisant la session PHP ou via un paramètre GET.
    Dans ce cas, avoir un fichier php différent comme dans ton message initial sera surement plus simple (et ceci devrait t'éviter les éventuelles erreurs "headers already sent").

  10. #10
    Membre averti Avatar de awalter1
    Inscrit en
    Août 2004
    Messages
    994
    Détails du profil
    Informations forums :
    Inscription : Août 2004
    Messages : 994
    Points : 407
    Points
    407
    Par défaut
    Je sèche.
    J'ai réinitialisé la variable $_POST[message], mais quelque chose lui remet une valeur au rechargement de la page ...

    Mes traces après envoi du formulaire et après rechargement de la page :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    >>> 1 mon message 11h40 --- 1
    >>> 2 ---
    Message bien envoyé
    Mon code :
    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
     
      <section id="contact">
        <!-- Page contact -->
        <?php
          if (isset($_POST["message"]) && !empty($_POST["message"])) {
                  $retour = mail("walter.alain.serge@gmail.com", "Peindreamonampteuil.go.yj.fr",  $_POST["nom"] . "\n" . $_POST["email"] . "\n" . $_POST["message"]);
                  if($retour)
                    $message_mail='Message bien envoyé';
                  else
                    $message_mail='Pas de message';
                  echo '>>> 1 ' . $_POST["message"] . ' --- ' . !empty($_POST["message"]) . '<br>';
                  $_POST["message"]="";
                  echo '>>> 2 ' . $_POST["message"] . ' --- ' . !empty($_POST["message"]) . '<br>';
             }
        ?>
        <h2>Contactez-moi</h2>
        <div id="formContact">
          <?php if (isset($message_mail)) {
             echo $message_mail;
             $message_mail="";
          } ?>
          <!-- <form method="post" action="contact1.php"> -->
          <form method="post" action="#contact">
            <input type="text" name="nom" placeholder="Nom" required "^[A-Za-z '-]+$" maxlength="30"><br>
            <input type="email" name="email" placeholder="E-mail" required
              pattern="^[A-Za-z.]+@{1}[A-Za-z]+\.{1}[A-Za-z]{2,}$"><br>
            <textarea name=" message" placeholder="Message" required pattern="^[A-Za-z .,;()/#@'-1234567890]+$"
              maxlength="200"></textarea><br>
            <input type="submit" value="Envoyer">
          </form>
        </div>
      </section>

  11. #11
    Membre confirmé
    Homme Profil pro
    Autre
    Inscrit en
    Juillet 2021
    Messages
    321
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Autre

    Informations forums :
    Inscription : Juillet 2021
    Messages : 321
    Points : 642
    Points
    642
    Par défaut
    Tes paramètres POST sont effectivement redéfinis à chaque rechargement de page puisque tu renvoies la requête POST lors du rechargement, comme si tu renvoyais le formulaire.

    Tu peux faire une redirection après le traitement de ton formulaire, préfère utiliser un fichier différent pour le traitement du formulaire (contact.php) et ne met pas de balise fermante php (?>) à la fin de ce fichier.

    Exemple contact.php :
    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
    <?php
     
    session_start();
    $_SESSION['messages'] = [];
     
    if (empty($_POST['nom']) || empty($_POST['email']) || empty($_POST['message'])) {
        $_SESSION['messages'][] = ['error' => 'Merci de renseigner tous les champs obligatoires.'];
    } else {
     
        if (mail('to@exemple.com', 'Peindreamonampteuil.go.yj.fr',  $_POST['nom'] . "\n" . $_POST['email'] . "\n" . $_POST['message'])) {
            $_SESSION['messages'][] = ['success' => 'Message envoyé !'];
        } else {
            $_SESSION['messages'][] = ['error' => 'Erreur lors de l\'envoi du mail.'];
        }
     
    }
     
    header('location: index.php');
    Fichier index.php :
    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
    <?php
    session_start();
    ?>
    <!DOCTYPE html>
    <html lang="fr">
    <head>
        <meta charset="UTF-8">
        <title>Contact</title>
    </head>
    <body>
     
        <?php
        if (!empty($_SESSION['messages'])) {
            foreach ($_SESSION['messages'] as $type => $message) {
                echo '<div class="message message-' . htmlspecialchars($type) . '">' . htmlspecialchars($message) . '</div>';
            }
     
            unset($_SESSION['messages']);
        }
     
        ?>
     
        <form method="post" action="contact.php">
            <input type="text" name="nom" placeholder="Nom" required><br>
            <input type="email" name="email" placeholder="E-mail" required><br>
            <textarea name="message" placeholder="Message" required></textarea><br>
            <input type="submit" value="Envoyer">
        </form>
     
    </body>
    </html>

  12. #12
    Membre averti Avatar de awalter1
    Inscrit en
    Août 2004
    Messages
    994
    Détails du profil
    Informations forums :
    Inscription : Août 2004
    Messages : 994
    Points : 407
    Points
    407
    Par défaut
    Bonjour,
    j'ai implémenté ta solution.
    J'ai toujours le problème du ré-envoi du mail après le rechargement de la page!
    Je n'ai pas de message "Message bien envoyé". Où doit il s'afficher? N'est ce pas plus simple d'avoir une popup pour afficher le message?
    En revanche je n'ai plus de rafraichissement de page suite à l'action Envoyer.

    Merci

    fichier contact.php tel que tu me l'as proposé:
    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
    <?php
    session_start();
    $_SESSION['messages'] = [];
     
    if (empty($_POST['nom']) || empty($_POST['email']) || empty($_POST['message'])) {
        $_SESSION['messages'][] = ['error' => 'Merci de renseigner tous les champs obligatoires.'];
    } else {
     
        if (mail('walter.alain.serge@gmail.com', 'Peindreamonampteuil.go.yj.fr',  $_POST['nom'] . "\n" . $_POST['email'] . "\n" . $_POST['message'])) {
            $_SESSION['messages'][] = ['success' => 'Message envoyé !'];
        } else {
            $_SESSION['messages'][] = ['error' => 'Erreur lors de l\'envoi du mail.'];
        }
     
    }
     
    header('location: index.php');
    Extrait du index.php :
    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
    <?php
    session_start();
    ?>
    <!DOCTYPE html>
    <html lang="fr">
     
    <head>
    ...
        <h2>Contactez-moi</h2>
        <div id="formContact">
          <?php
          if (!empty($_SESSION['messages'])) {
            foreach ($_SESSION['messages'] as $type => $message) {
                echo '<div class="message message-' . htmlspecialchars($type) . '">' . htmlspecialchars($message) . '</div>';
            }
            unset($_SESSION['messages']);
          }
          ?>
          <form method="post" action="#contact">
            <input type="text" name="nom" placeholder="Nom" required "^[A-Za-z '-]+$" maxlength="30"><br>
            <input type="email" name="email" placeholder="E-mail" required
              pattern="^[A-Za-z.]+@{1}[A-Za-z]+\.{1}[A-Za-z]{2,}$"><br>
            <textarea name=" message" placeholder="Message" required pattern="^[A-Za-z .,;()/#@'-1234567890]+$"
              maxlength="200"></textarea><br>
            <input type="submit" value="Envoyer" >
          </form>
        </div>
      </section>
    ...

  13. #13
    Membre confirmé
    Homme Profil pro
    Autre
    Inscrit en
    Juillet 2021
    Messages
    321
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Autre

    Informations forums :
    Inscription : Juillet 2021
    Messages : 321
    Points : 642
    Points
    642
    Par défaut
    Tu as peut-être des erreurs PHP mais puisque tu développes sur un serveur en ligne, l'affichages des erreurs ne doit pas être activé (ce qui est bien recommandé pour un serveur en ligne).

    Regarde via l'espace client de ton hébergement et/ou via FTP, tu devrais avoir accès au journal d'erreur (error log) de ton serveur web dans lequel tu auras les éventuelles erreurs PHP à corriger (ou active l'affichage des erreurs le temps du développement si tu préfères, bien penser à désactiver ensuite).

  14. #14
    Membre averti Avatar de ddaweb
    Homme Profil pro
    Webmaster amateur
    Inscrit en
    Janvier 2013
    Messages
    329
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Webmaster amateur
    Secteur : Associations - ONG

    Informations forums :
    Inscription : Janvier 2013
    Messages : 329
    Points : 430
    Points
    430
    Par défaut
    J'ai constaté un problème identique sur mon site en utilisant les ancres.
    Peux-tu essayer de mettre ton menu "Accueil" sans ancre (je ne crois pas que ce soit utile d'en mettre une d'ailleurs) -> juste index.php et essayer si ce problème disparaît en cliquant sur "Accueil" ... je pressent que oui.

    Si les spécialistes trouvent une solution, je suis preneur également

  15. #15
    Membre averti Avatar de awalter1
    Inscrit en
    Août 2004
    Messages
    994
    Détails du profil
    Informations forums :
    Inscription : Août 2004
    Messages : 994
    Points : 407
    Points
    407
    Par défaut
    Pytet, j'ai demandé à mon hébergeur al procédure afin d'avoir l'accès au journal d'erreurs.
    Ddawe, oui j'ai enlevé l'ancre #accueil pour le retour à la page principale. Cela ne change rien.
    Merci à vous pour vos suggestions.

  16. #16
    Membre averti Avatar de ddaweb
    Homme Profil pro
    Webmaster amateur
    Inscrit en
    Janvier 2013
    Messages
    329
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Webmaster amateur
    Secteur : Associations - ONG

    Informations forums :
    Inscription : Janvier 2013
    Messages : 329
    Points : 430
    Points
    430
    Par défaut
    Citation Envoyé par awalter1 Voir le message
    Ddawe, oui j'ai enlevé l'ancre #accueil pour le retour à la page principale. Cela ne change rien.
    Tu as laissé un # qui est une ancre je crois

  17. #17
    Membre confirmé
    Homme Profil pro
    Autre
    Inscrit en
    Juillet 2021
    Messages
    321
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Autre

    Informations forums :
    Inscription : Juillet 2021
    Messages : 321
    Points : 642
    Points
    642
    Par défaut
    Bien vu ddaweb ! Je n'avais pas fait attention mais tu as oublié de changer l'attribut action de ton formulaire dans ton dernier extrait. Il faut pointer le fichier contact.php si tu veux tester le traitement avec ce fichier <form method="post" action="contact.php">

  18. #18
    Membre averti Avatar de ddaweb
    Homme Profil pro
    Webmaster amateur
    Inscrit en
    Janvier 2013
    Messages
    329
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Webmaster amateur
    Secteur : Associations - ONG

    Informations forums :
    Inscription : Janvier 2013
    Messages : 329
    Points : 430
    Points
    430
    Par défaut
    J'ai eu un doute sur le code de Pytet (j'ai donc testé) et il y a une petite erreur à mon sens, l'array a un étage de trop

    Code PHP : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    $_SESSION['messages'][] = ['success' => 'Message envoyé !'];
    // ----- Devrait être
    $_SESSION['messages']= ['success' => 'Message envoyé !'];
    // ----- Les autres messages également

    Évidemment, comme cela il n'y a plus d'ancre qui semble garder les champs du formulaire de contact en mémoire.
    Le seul soucis : la personne qui a envoyé le message se retrouve en haut de page, et ne peut pas voir le message du résultat sans devoir redescendre au formulaire, le mettre en haut de page serait bizarre

    Vous n'avez pas mis le CSS pour le message.

    La piste des sessions est une idée à creuser.

    EDIT : Résultat sans les crochets vides, avec un var_dump de la session

    Nom : erreur_mail.jpeg
Affichages : 256
Taille : 19,9 Ko

  19. #19
    Membre averti Avatar de ddaweb
    Homme Profil pro
    Webmaster amateur
    Inscrit en
    Janvier 2013
    Messages
    329
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Webmaster amateur
    Secteur : Associations - ONG

    Informations forums :
    Inscription : Janvier 2013
    Messages : 329
    Points : 430
    Points
    430
    Par défaut
    J'ai un peu simplifié le code, le CSS pour styliser les messages est entre <style> ... </style> (à mettre dans le fichier CSS + mettre en forme) : j'ai enlevé les htmlspecialchars qui me semblent inutiles et le contrôle d'un champs vide qui est fait par required des champs.
    Cela semble bien fonctionner.

    index.php :
    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
    32
    33
    34
    <?php
    session_start();
    ?>
    <!DOCTYPE html>
    <html lang="fr">
    <head>
        <meta charset="UTF-8">
        <title>Contact</title>
    </head>
    <body>
        <style>
            .message { font-size : 1.1em; font-weight: bold; }
            .message.erreur { color: red; }
            .message.reussi { color : green; }
        </style>
     
        <?php
        if (!empty($_SESSION['messages'])) {
            foreach ($_SESSION['messages'] as $type => $message) {
                echo '<p class="message ' . $type . '">' . $message . '</p>';
            }
            unset($_SESSION['messages']);
        }
        ?>
     
        <form id="contact" method="post" action="contact.php">
            <input type="text" name="nom" placeholder="Nom" required><br>
            <input type="email" name="email" placeholder="E-mail" required><br>
            <textarea name="message" placeholder="Message" required></textarea><br>
            <input type="submit" value="Envoyer">
        </form>
     
    </body>
    </html>

    Contact.php :
    Code PHP : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    <?php
     
    session_start();
    $_SESSION['messages'] = [];
     
    if (mail('to@exemple.com', 'Peindreamonampteuil.go.yj.fr',  $_POST['nom'] . "\n" . $_POST['email'] . "\n" . $_POST['message'])) {
        $_SESSION['messages'] = ['reussi' => 'Message envoyé !'];
    } else {
        $_SESSION['messages'] = ['erreur' => 'Erreur lors de l\'envoi du mail.'];
    }
     
    header('location: index.php#contact');

    EDIT : il faudrait protéger les post

  20. #20
    Membre confirmé
    Homme Profil pro
    Autre
    Inscrit en
    Juillet 2021
    Messages
    321
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Autre

    Informations forums :
    Inscription : Juillet 2021
    Messages : 321
    Points : 642
    Points
    642
    Par défaut
    Attention aux bonnes pratiques : Never trust user input !

    La validation coté client (en javascript ou via les attributs html pattern, required, type="email", type="tel", etc.) est très pratique pour l'utilisateur et il ne faut pas s'en priver.
    Mais il faut toujours faire une validation coté serveur. On ne peut pas se fier à la validation coté client car il n'y a aucune garantie qu'elle soit prise en charge ou respectée.

    Pour utiliser un élément d'un tableau php ($_POST ou autre), il faut vérifier que l'élément existe (via isset, empty ou l'opérateur null coalescing) sinon php lève une notice "undefined index...".
    Selon le traitement des données, il faut ajouter plusieurs conditions : vérifier que l'adresse mail est valide, que le nom contient un minimum de caractères, etc.

    Les fonctions htmlspecialchars ou htmlentities devraient presque toujours être utilisées lorsqu'on affiche des variables php dans dans du code html. Dans mon exemple ca ne change rien, mais si je change le message de succès en "Message envoyé, merci $nom <$email> !", les chevrons seront déjà convertis en entités et on se protège contre les failles xss.

    Ici les données du formulaire sont utilisées dans le contenu d'un mail au format texte.
    Si on change le format du mail pour utiliser du html, il faut utiliser htmlspecialchars/htmlentities sur les variables POST affichées dans le contenu du mail html.

    Merci ddawab d'avoir tester mon code car j'ai bien caffouillé sur mon implémentation de message flash sous forme de tableau associatif. Ca m'apprendra à ne pas tester Et ma suggestion concernait surtout l'utilisation d'une redirection.

    Un exemple minimaliste :

    contact.php
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    <?php
     
    if (isset($_POST['nom']) && isset($_POST['email']) && isset($_POST['message'])) {
        session_start();
     
        if (mail('test@localhost', 'Peindreamonampteuil.go.yj.fr',  $_POST['nom'] . "\n" . $_POST['email'] . "\n" . $_POST['message'])) {
            $_SESSION['alert'] = 'Message envoyé';
        } else {
            $_SESSION['alert'] = 'Erreur mail';
        }
     
        header('location: index.php');
        exit();
    }
    index.php
    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
    <?php
    session_start();
    ?>
    <!-- doctype, html, head, body... -->
     
    <?php
    if (isset($_SESSION['alert'])) {
        echo htmlspecialchars($_SESSION['alert']);
     
        // on supprime la variable de session pour ne pas afficher le message lors des prochaines visites de cette page
        unset($_SESSION['alert']);
    }
    ?>
     
    <form method="post" action="contact.php">
        <input type="text" name="nom" required>
        <input type="email" name="email" required>
        <textarea name="message" required></textarea>
     
        <input type="submit" value="Envoyer">
    </form>

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. Requêtes php dans une application pour mon site web
    Par Coussati dans le forum Web & réseau
    Réponses: 20
    Dernier message: 12/05/2022, 23h02
  2. Ajout de PHP dans mon site web
    Par Bocage dans le forum Langage
    Réponses: 2
    Dernier message: 18/04/2013, 19h32
  3. Créer une page php a partir de mon site web
    Par mangasource dans le forum Langage
    Réponses: 9
    Dernier message: 27/06/2010, 10h23
  4. [MySQL] aide pour connection mysql avec du php sur mon site web
    Par cuisto44000 dans le forum PHP & Base de données
    Réponses: 9
    Dernier message: 23/09/2007, 00h30
  5. [Upload] Php : script d'Upload vers mon site : Big Probleme
    Par CyberTwister dans le forum Langage
    Réponses: 8
    Dernier message: 27/03/2006, 08h06

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo