Bonsoir à tous,

Me voici une fois de plus devant un problème (de débutante, c'est vrai). J'aurais, je l'admets, peut-être pu trouver la réponse dans les sujets déjà existants, mais il y'a des tartines de pages et les titres des sujets ne sont pas toujours explicites.

Alors, voilà. J'ai crée un site portfolio, et me voici rendue au moment où je tente de joindre mon formulaire avec ma boîte mail via un script en php. Mais comme je suis ultra débutante, ça coince.
Le problème : j'ai suivi le tuto vidéo très complet de Grafikart qui nous explique comment qu'on fait.
J'ai essayé de tout bien faire comme il dit Smiley lol mais en voulant tester mon formulaire, rien ne se passe. La page se recharge, et c'est tout ! Mes messages (même d'erreur) ne s'affichent pas, et je ne reçois pas de mail dans ma boîte (même en en testant plusieurs). Avant que la question ne soit posée : je travail en local, mais j'ai utilisé WAMP pour faire mon test Smiley smile
Pour couronner le tout, autre problème : Mon site est un one-page horizontal ! J'ai peur que, même si mon formulaire finisse par fonctionner, le fait de le valider ne recharge ma page et ne fasse revenir mon visiteur à l'ancre #home et non pas à l'ancre #contact qui lui dirait que tout s'est bien passé et tout et tout...

Trêves de bavardage, je vous livre mon code. J'aime bien mes cheveux, alors j'aimerais qu'ils restent sur ma tête... Aidez-moi à ne pas tous les arracher un par un s'il vous plait ! Smiley biggol



<?php

if(!empty($_POST)){
    extract($_POST);
    $valid = true;    
    if(empty($nom)) {
        $valid = false;
        $erreurnom = "Vous n'avez pas mis votre nom";
    }
    
    if(!preg_match("/^[a-z0-9\-_.]+@[a-z0-9\-_.].[a-z]{2,3}$/i", $email)){
    
    echo "Email non valide";
    
    }
    
    if(empty($email)) {
        $valid = false;
        $erreuremail = "Vous n'avez pas mis votre e-mail";
    }
    
    if(empty($message)) {
        $valid = false;
        $erreurmessage = "Vous n'avez pas mis votre message";
    }
    
    if($valid) {
            $to = "contact@wishbone-design.com";
            $sujet = "Demande de contact";
            $texte = "Nom : $nom\n
            Email : $email\n
            Message : $message";
            $headers = "From: $nom\n
            Reply-To: $email";
            mail($destinataire, $objet, $texte, $headers);
            if(mail($to,$sujet,$texte)) {
            echo "Votre message a bien été envoyé, merci";
        }

    else {
        echo "Il y'a une erreur quelque part !";
    }
}
    
}


?>


    
                        <form action="index.php" method="post">				    
					<fieldset>					
					<p>Quelques mots avant notre entretien ?</p>
					<label for="nom"> /Nom : </label>
					<input type="text" name="nom" id="nom" required> <br>
					<span class="error"><?php $erreurnom ?> </span>
					<label for="prenom">/Prénom : </label>
					<input type="text" name="prenom" id="prenom" <br>					
					<label for="email">/Email: </label>
					<input type="text" name="email" id="email" required><br>
                                        <span class="error"><?php $erreuremail ?> </span>
					<label>/Message :</label>
					<textarea name="message" required></textarea><br>
					<span class="error"><?php $erreurmessage ?></span>
					<input class="bouton" type="submit" value="Envoyer" />
					<input class="bouton" type="reset" value="Annuler"/>
					</fieldset>
					</form>			



Je vous remercie à plat ventre d'avoir au moins lu mon message Smiley smile
Modifié par Dakota (19 Jul 2014 - 19:49)
Je reviens rajouter quelques infos à mon SOS.

J'ai plus ou moins fini par comprendre que mon problème venait plus de WAMP que de mon formulaire (quoique!). J'ai téléchargé sendmail qui permet d'envoyer des "fake mails" et j'ai tout reglé comme il faut, du moins je crois...
J'ai aussi cru comprendre que, de toute façon, ce n'était pas vraiment nécessaire vu que wamp gérait lui-même l'envoi des mails... Même si j'ai du mal à comprendre comment, vu que je ne lui ai pas donné d'infos sur le port ou le SMTP, et dans php.ini on ne me demande pas grand chose comme infos...

Voilà, même si j'ai un peu avancé, je ne me sens pas beaucoup moins perdue Smiley decu

A ce stade, je ne peux que citer quatre garçons dans le vent et vous dire "HELP, I need somebody HELP" !
Modérateur
Bonjour,

Alors plusieurs choses à voir.
Dans le code php que tu nous proposes, tu utilises la fonction extract pour récupérer les valeurs envoyées par le formulaire (par la méthode post). Je pense qu'il est plus sûr de les récupérer individuellement (cela te permet également d'améliorer la lisibilité du code puisque tu définis les différentes variables à disposition avant le traitement) :

$nom = $_POST['nom'];
$prenom = $_POST['prenom'];
$email = $_POST['email'];
$message = $_POST['message'];

Ensuite, le traitement de l'email fournit par le visiteur :
if(!preg_match("/^[a-z0-9\-_.]+@[a-z0-9\-_.].[a-z]{2,3}$/i", $email)){
    
    echo "Email non valide";
    
    }

Il manque ici $valid = false; :
if(!preg_match("/^[a-z0-9\-_.]+@[a-z0-9\-_.].[a-z]{2,3}$/i", $email)){
  $valid = false;    
  echo "Email non valide";
}

Bon ce que je viens de donner là était un peu hors-sujet, mais la clarification me semblait important pour ne pas dire indispensable...
Pour ton souci d'envoi de mail, je pense effectivement qu'il y a un problème au niveau de la configuration de ton serveur. Le plus simple est de vérifier dans ton php.ini accessible par clic sur l'icône wampserver » PHP » php.ini si tu as bien quelque chose comme ça :

[mail function]
; For Win32 only.
;  http://php.net/smtp
 
[b]SMTP = smtp.orange.fr[/b]
; SMTP = smtp-auth.sfr.fr
;  http://php.net/smtp-port
 
[b]smtp_port = 25[/b]
; smtp_port = 587

Je t'ai collé ce qui marche pour moi (je suis chez orange, les valeurs importantes étant en gras). Ne pas prendre en considération les lignes qui commencent par un ";" (elles ne sont pas traitées par php, le fait de placer un ";" devant une ligne la transforme en commentaire et n'est donc pas traitée). Si tu fais des modifications, il faudra relancer les services...
Dernier point, pour revenir sur la même portion de page après validation, remplacer :
<form action="index.php" method="post">

Par
<form action="index.php#contact" method="post">

Pour les messages non affichés, c'est normal, il faudrait ajouter echo devant les variables qui doivent s'afficher. Par exemple :
<?php $erreurmessage ?>

Devrait s'écrire :
<?php echo $erreurmessage ?>


Tiens-nous au courant.
Modifié par jojaba (20 Jul 2014 - 09:18)
Merci Jojoba pour cette réponse matinale très appréciable Smiley smile

J'ai changé les paramètres dans php.ini, comme conseillé.

Voici que j'y ai mis :


[mail function]
; For Win32 only.
;  http://php.net/smtp
 
SMTP = smtp.sfr.fr 
;  http://php.net/smtp-port
 
smtp_port = 465

; For Win32 only.
;  http://php.net/sendmail-from
 
; sendmail_from = 

; For Unix only.  You may supply arguments as well (default: "sendmail -t -i").
;  http://php.net/sendmail-path
 
;sendmail_path = 


Je ne sais pas encore si cela fonctionne, car entre temps j'ai voulu tester mes messages d'erreur en envoyant un formulaire vide, et ça ne fonctionne pas Smiley fache . Pour ça j'ai retiré les valeurs "required" qui bloquaient l'envoi du formulaire si les champs étaient vides. D'ailleurs, ces valeurs sont bien pratiques et peut-être que je devrais m'en contenter, mais c'est bien aussi d'avoir des messages personnalisés...

Et donc, pour conclure, il ne se passe toujours rien. J'envoie mon formulaire tout vide avec mon bouton submit et la page recharge et c'est tout. Je suis en train de devenir dingue !!
J'ai modifié les qq lignes dont tu m'as parlé Jojoba, mon code ressemble donc à ça maintenant :

<form action="index.php#contact" method="post">				    
					<fieldset>					
					<p>Quelques mots avant notre entretien ?</p>
					<label for="nom"> /Nom : </label>
					<input type="text" name="nom" id="nom" > <br>
					<span class="error"><?php echo $erreurnom ?></span>
					<label for="prenom">/Prénom : </label>
					<input type="text" name="prenom" id="prenom" ><br>					
					<label for="email">/Email: </label>
					<input type="text" name="email" id="email" ><br>
					<span class="error"><?php echo $erreuremail ?></span>
					<label>/Message :</label>
					<textarea name="message" ></textarea><br>
					<span class="error"><?php echo $erreuremessage ?></span>
					<input class="bouton" type="submit" value="Envoyer" />
					<input class="bouton" type="reset" value="Annuler"/>
					</fieldset>
					</form>		


<?php
if(!empty($_POST)){
    $nom = $_POST['nom'];
    $prenom = $_POST['prenom'];
    $email = $_POST['email'];
    $message = $_POST['message']
    $valid = true;    
    if(empty($nom)){
        $valid=false;
        $erreurnom = "Vous n'avez pas mis votre nom";
    }
    
    if(!preg_match("/^[a-z0-9\-_.]+@[a-z0-9\-_.].[a-z]{2,3}$/i", $email)){
    $valid = false;    
    echo "Email non valide";
    
    }
    
    if(empty($email)) {
        $valid = false;
        $erreuremail = "Vous n'avez pas mis votre e-mail";
    }
    
    if(empty($message)) {
        $valid = false;
        $erreurmessage = "Vous n'avez pas mis votre message";
    }
    
    if($valid) {
            $to = "contact@wishbone-design.com";
            $sujet = "Demande de contact";
            $texte = "Nom : $nom\n
            Email : $email\n
            Message : $message";
            $headers = "From: $nom\n
            Reply-To: $email";
            mail(to, $sujet, $texte, $headers);
            if(mail($to,$sujet,$texte,$headers)) {
            echo "Votre message a bien été envoyé, merci";
        }

    else {
        echo "Il y'a une erreur quelque part !";
    }
}
    
}


?>

Modifié par Dakota (20 Jul 2014 - 11:15)
Modérateur
J'ai pris un peu de temps pour voir ton script qui contient beaucoup plus d'erreurs que je n'avais pu constater ce matin. Je te propose donc le code suivant qui devrait fonctionner. La partie php d'abord :

<?php
/* D'abord on fixe la valeur par défaut des messages d'erreur */
$erreurnom = $erreuremail = $erreurmessage = $messageenvoi =  '';

/* Ensuite on vérifie si le formulaire a été soumis et on valide les valeurs récupérées */
if (!empty($_POST['submit'])) {
  
  // On récupère les données envoyées par le formulaire
  $nom = $_POST['nom'];
  $prenom = $_POST['prenom'];
  $email = $_POST['email'];
  $message = $_POST['message'];
  $valid = true;
  // test du nom    
  if (empty($nom)) {
    $valid = false;
    $erreurnom = '<br><span class="error">Vous n\'avez pas mis votre nom</span><br>';
  }
  // Test format e-mail    
  if (!preg_match("/^[a-z0-9\-_.]+@[a-z0-9\-_.].[a-z]{2,3}$/i", $email)) {
    $valid = false;    
    $erreuremail = '<br><span class="error">Email non valide</span><br>';
  }
  // Test message
  if (empty($message)) {
        $valid = false;
        $erreurmessage = '<br><span class="error">Vous n\'avez pas mis votre message</span><br>';
    }
    
  /* Si tout est ok, on envoie le courriel */
  if ($valid) {
    $to = "contact@wishbone-design.com";
    $sujet = "Demande de contact";
    $texte = "Nom : $nom\n
    Email : $email\n
    Message : $message";
    $headers = "From: $nom\n
    Reply-To: $email";
    // Envoi du courriel - on vérifie si le mail est envoyé en mettant la fonction mail() dans un if pour voir si la valeur retournée est bien true (valeur envoyée par cette fonction si le mail a été envoyé)
    if (mail($to,$sujet,$texte,$headers)) {
      $messageenvoi =  '<span class="ok">Votre message a bien été envoyé, merci !</span><br>';
    }
    else {
      $messageenvoi =  '<span class="ok">Désolé, une erreur est survenue lors de l\'envoi du message !</span><br>';
    }
  }
}
?>

La partie HTML :
<form action="index.php#contact" method="post">				    
  <fieldset>
    <?php echo $messageenvoi ?>
    <p>Quelques mots avant notre entretien ?</p>
    <label for="nom">/Nom : </label>
    <input type="text" name="nom" id="nom" ><?php echo $erreurnom ?>
    <label for="prenom">/Prénom : </label>
    <input type="text" name="prenom" id="prenom" ><br>					
    <label for="email">/Email: </label>
    <input type="text" name="email" id="email" ><?php echo $erreuremail ?>
    <label>/Message :</label>
    <textarea name="message" ></textarea><?php echo $erreuremessage ?>
    <span class="error"></span>
    <input class="bouton" type="submit" name="submit" value="Envoyer" />
    <input class="bouton" type="reset" value="Annuler"/>
  </fieldset>
</form>


Les lignes commençant par // ou le texte entouré de /* et */ sont des commentaires qui te permettront de comprendre mieux la signification de chaque partie...
J'espère ne pas avoir fait d'erreur de frappe, tiens-moi au courant. On peut l'optimiser bien évidemment, mais ce n'est pas l'objectif pour l'instant hein ? Smiley cligne
Modifié par jojaba (20 Jul 2014 - 15:03)
Peu m'importe si ton code fonctionne ou non (je n'ai pas encore testé) je tiens vraiment à te remercier du fond du coeur pour le temps que tu as passé à t'occuper de mon problème.
C'est extrêmement gentil de ta part, ça me redonne foi en l'humanite Smiley smile
Dommage que je ne m'y connaisse que très peu pour l'instant, j'aimerais vraiment pouvoir rendre la pareille aux membres de ce forum. Je n'y manquerai pas si à l'avenir je me perfectionne Smiley lol

Bref, encore mille merci, je m'en vais tester!

EDIT : Bon, j'ai testé, mais malheureusement ça n'a pas fonctionné Smiley decu
Le problème, c'est que tous les messages ainsi que les commentaires s'affichent tout au début de mon portfolio (c'est à dire juste au dessus de ma page d'accueil) comme ceci :

upload/55299-pbformulai.JPG

J'ai essayé de remettre des span class="error" vide et des echo directement dans mon formulaire : cela efface bien les textes inopportuns mais mon formulaire ne fonctionne toujours pas Smiley decu

Je suis désolée, j'ai l'impression de vous faire perdre votre temps, surtout à toi, Jojoba...
Je vais probablement encore chercher un moyen de faire plus simple Smiley ohwell

Encore merci en tout cas!
Modifié par Dakota (20 Jul 2014 - 15:54)
Modérateur
Donne-moi tout le code de ton fichier *.php s'il te plaît (tu peux me l'envoyer par mp si tu veux).
J'ai peur de mal avoir compris ta question, car j'ai posté tout mon code au début de mon message... Il n'y avait rien de plus. A moins que tu ne souhaites tout mon code "index.php", avec le code HTML et tout et tout ? (en plus, sachant que c'est un one page, il y aurait tout mon site et ça fait beaucoup...)

Mon php se trouve juste avant ma déclaration du DOCTYPE dans mon fichier index.php, et c'est celui que tu m'as donné... ou bien, avant, il y avait le mien qui ne marchait pas et que j'ai posté au début Smiley decu

Après il y a mon formulaire, que tu connais aussi.
Donc, as-tu besoin d'autre chose?
Modérateur
Problème résolu par mail.

php :
<?php
/* D'abord on fixe la valeur par défaut des messages d'erreur et des variables des inputs */
$erreurnom = $erreuremail = $erreurmessage = $messageenvoi = $nom = $prenom = $email = $message =  '';

/* Ensuite on vérifie si le formulaire a été soumis et on valide les valeurs récupérées */
if (!empty($_POST['submit'])) {
  
  // On récupère les données envoyées par le formulaire
  $nom = $_POST['nom'];
  $prenom = $_POST['prenom'];
  $email = $_POST['email'];
  $message = $_POST['message'];
  $valid = true;
  $envoi = false;
  // test du nom    
  if (empty($nom)) {
    $valid = false;
    $erreurnom = '<br><span class="error">Vous n\'avez pas mis votre nom</span><br>';
  }
  // Test format e-mail    
  if (!preg_match("/^[a-z0-9._-]+@[a-z0-9._-]{2,}\.[a-z]{2,4}$/i", $email)) {
    $valid = false;    
    $erreuremail = '<br><span class="error">Email non valide</span><br>';
  }
  // Test message
  if (empty($message)) {
        $valid = false;
        $erreurmessage = '<br><span class="error">Vous n\'avez pas mis votre message</span><br>';
    }
    
  /* Si tout est ok, on envoie le courriel */
  if ($valid) {
    $to = "contact@wishbone-design.com";
    $sujet = "Demande de contact";
    $texte = "Nom : $nom\n
    Email : $email\n
    Message : $message";
    $headers = "From: $nom\n
    Reply-To: $email";
    // Envoi du courriel - on vérifie si le mail est envoyé en mettant la fonction mail() dans un if pour voir si la valeur retournée est bien true (valeur envoyée par cette fonction si le mail a été envoyé)
    if (mail($to,$sujet,$texte,$headers)) {
      $envoi = true;
      $messageenvoi =  '<span class="ok">Votre message a bien été envoyé, merci !</span><br>';
    }
    else {
      $messageenvoi =  '<span class="error">Désolé, une erreur est survenue lors de l\'envoi du message ! Veuillez essayer ultérieurement.</span><br>';
    }
  }
}
?>


HTML :
<form action="index.php#contact" method="post">				    
   <fieldset>
      <?php if ($envoi) : echo $messageenvoi; ?>
      <?php else : echo $messageenvoi; ?>
      <p>Quelques mots avant notre entretien ?</p>
      <label for="nom">/Nom : </label>
      <input type="text" name="nom" id="nom" value="<?php echo $nom ?>"><?php echo $erreurnom ?>
     <label for="prenom">/Prénom : </label>
     <input type="text" name="prenom" id="prenom" value="<?php echo $prenom ?>"><br>					
     <label for="email">/Email: </label>
     <input type="email" name="email" id="email" value="<?php echo $email ?>"><?php echo $erreuremail ?>
     <label>/Message :</label>
     <textarea name="message" ><?php echo $message ?></textarea><?php echo $erreurmessage ?>
     <input class="bouton" type="submit" name="submit" value="Envoyer" />
     <input class="bouton" type="reset" value="Annuler"/>
     <?php endif; ?>
   </fieldset>
</form>

Dakota, pourrais-tu indiquer dans le titre que cette discussion est résolue ? Merci.
Modifié par jojaba (21 Jul 2014 - 08:03)