8721 sujets

Développement web côté serveur, CMS

Bonjour.
J'utilise un formulaire d'envoi de mail en html.
<form action="contact.php" method="post">
  <fieldset>
    <legend><b>Contactez moi</b></legend>
    <label for="nom">Votre nom</label><br>
    <input type="text" name="nom" value="" id="nom" size="39"><br>
    <label for="adresse">Votre mail</label><br>
    <input type="text" name="adresse" value="" id="adresse" size="39"><br><br>
    <label for="message">Votre message</label>
    <textarea name="message" id="message" rows="6" cols="30"></textarea><br>
    <input id="submit" type="submit" name="submit" value="Envoyez"><br><br>
  </fieldset>
</form>

Ne connaissant pas grand chose en php j'ai trouvé ce code pour mon script contact.php
<?
/* contact.php: envoie un mail */
mail ("contact@monsite.com","contact web", $_POST["nom"]." (".$_POST["adresse"].") vous envoie ce message:\n".$_POST["message"]);
?>

Le problème est qu'une fois le mail envoyé, je me retouve sur une page blanche monsite/contact.php sans message de confirmation ou d'erreur (en l'occurence le mail est bien envoyé).
De plus, si les champs ne sont pas remplis (ou si on pointe le fichier contact.php directement), un message est également envoyé.

Comment puis-je faire pour créer ce message de confirmation ainsi qu'un lien de retour au site (ou bien ouvrir la confirmation dans un autre onglet) ?
Comment faire également pour bloquer le mail si les champs ne sont pas bien remplis ?

Accessoirement, la mise en page du message envoyé dans le corps du mail est très basique.
Peut-on la mettre un peu plus en forme (saut de ligne etc.)

Je débute en php.
Merci d'avance.
Modifié par Lich (14 May 2014 - 14:57)
Regarde la "citation" de Musset là en bas.
1 tu fouilles la doc PHP sur la fonction mail.
2 une petite recherche pour apprendre le reste.
Merci Smiley smile
Je cherche déjà depuis ce matin.
Je vais m'arrêter un peu là.
Modifié par Lich (14 May 2014 - 17:04)
a écrit :
Comment puis-je faire pour créer ce message de confirmation ainsi qu'un lien de retour au site (ou bien ouvrir la confirmation dans un autre onglet) ?

Fonction header() ou simplement un echo

a écrit :
Comment faire également pour bloquer le mail si les champs ne sont pas bien remplis ?

En lien avec la première partie d'ailleurs, il va falloir te pencher sur la structure de base en php :
if, if/elseif/else

Avec des fonctions de tests :
empty()

filter_var()

Pour la mise en page de base, faut aller voir du coté de nl2br et de htmlentities().


Et mettre tout ce joli truc au-dessus de ton formulaire pour utiliser des messages d'erreur ou un message de confirmation.


Et bien sûr, tu reviens nous voir si t'arrives pas à mettre tout ça ensemble ^^ (mais la "citation" en-dessous reste vrai... sauf si t'es prêt à rémunérer l'un des nombreux pro du forum Smiley rolleyes *ouais, bon, je sors, faut pas trop rêver*)
Modifié par Lothindil (14 May 2014 - 18:22)
Merci encore.
Bon, entretemps j'étais allé faire pas mal de recherches. J'ai même appris un nouveau mot "concaténer" Smiley biggrin
Ça avance mais ça n'est pas encore tout à fait ça.
Mon code php :
<?php

$EmailFrom = $_POST['email']; 
$EmailTo = "contact@monsite.com";
$Subject = "Un message sur mon site";
$Nom = $_POST['nom']; 
$Email = $_POST['email']; 
$Message = $_POST['message']; 

// validation
$validationOK=true;
if (!$validationOK) {
  echo "Error";
  exit;
}

// mise en form mail
$Body = "";
$Body .= "Nom: ";
$Body .= $Nom;
$Body .= "\n";
$Body .= "Email: ";
$Body .= $Email;
$Body .= "\n";
$Body .= "Message: ";
$Body .= "\n";
$Body .= $Message;
$Body .= "\n";

// envoi email 
$success = mail($EmailTo, $Subject, $Body, "From: <$EmailFrom>");

// message success-error
if ($success){
  echo "Votre message à bien été envoyé.";
}
else{
  echo "Une erreur s'est produite à l'envoi de votre message.";
}
?>

Dans mon mail reçu j'ai bien le Sujet mais pas le EmailFrom.
Dans mon corps de mail j'ai bien le Nom et le Message mais pas l'Email
Un problème dans l'enregistrement de l'email donc Smiley sweatdrop

Pour l'echo c'est bon.
Modifié par Lich (19 May 2014 - 11:32)
pour le emailfrom essaye :

$success = mail($EmailTo, $Subject, $Body, "From: <".$EmailFrom.">");


Il est possible que PHP ait un peu de mal à analyser la variable avec le < juste devant si tu ne l'extrait pas du string. (et là je concatène la variable pour qu'il n'ait pas à analyser si c'est une variable ou juste un morceau de la chaîne) ^^


Sinon j'ai un doute, $email et $emailFrom ne passent pas, hors les deux viennent de $_POST['email'].

Essaye au début de ton code un
var_dump($_POST['email']);


Ca va permettre d'afficher la véritable valeur de $_POST['email'] pour voir si c'est pas de elle que viendrait le soucis ^^
Aaaaarh !!! J'ai trouvé !

Le problème venait tout simplement de mon formulaire html, l'email n'était pas bien définit Smiley lol
Pour ceux que ça intéresse, les codes qui fonctionnent :

<form action="contact.php" method="post">
  <fieldset>
    <legend><b>Contactez moi</b></legend>
    <label for="nom">Votre nom</label><br>
    <input type="text" name="nom" id="nom" size="39"><br>
    <label for="email">Votre email</label><br>
    <input type="text" name="email" id="email" size="39"><br><br>
    <label for="message">Votre message</label>
    <textarea name="message" id="message" rows="6" cols="30"></textarea><br>
    <input id="submit" type="submit" name="submit" value="Envoyer"><br><br>
  </fieldset>
</form>


et le fichier php :

<?php

$EmailFrom = $_POST["email"]; 
$EmailTo = "contact@monsite.com";
$Subject = "Un message sur mon site";
$Nom = $_POST["nom"]; 
$Email = $_POST["email"]; 
$Message = $_POST["message"]; 

// validation
$validationOK=true;
if (!$validationOK) {
  echo "Error";
  exit;
}

// email body text
$Body = "";
$Body .= "Nom: ";
$Body .= $Nom;
$Body .= "\n";
$Body .= "Email: ";
$Body .= $Email;
$Body .= "\n";
$Body .= "Message: ";
$Body .= "\n";
$Body .= $Message;
$Body .= "\n";

// send email  
$success = mail($EmailTo, $Subject, $Body, "From: <$EmailFrom>");

// redirect to success page 
if ($success){
  echo "Votre message à bien été envoyé.";
}
else{
  echo "Une erreur s'est produite à l'envoi de votre message.";
}
?>


Merci Lothindil de t'être penché sur mon pb.
Il ne me reste plus qu'à trouver comment tester le bon remplissage du formulaire et renvoyer sur ma page de remerciement plutôt que sur l'echo success.
Comprendre les fonctions de test et la fonction header donc Smiley murf
Modifié par Lich (19 May 2014 - 11:36)
Bonjour,

Pour tester le bon remplissage (ou le bon format) de tes variables envoyées, plusieurs possibilités selon ce que tu souhaites :

- Tester que la variable existe
if(isset($_POST['nomDeTonChamp']))
{
   // Faire ceci
}

- Tester que une variable n'est pas vide, ou comporte un minimum de caractères
La fonction strlen() te renvoie le nombre de caractère entrés par l'utilisateur,
tu peux ainsi vérifier que le nombre correspond bien à ce qui est attendu avec les opérateurs supérieur, inférieur, égal etc...
if($_POST['nomDeTonChamp'] != "" AND strlen($_POST['nomDeTonChamp']) >= 5)
{
  // Le traitement sera fait si ton champ n'est pas vide et qu'il comporte ici au moins 5 caractères (à titre d'exemple)
}

Tu peux également vérifier le format pour un email avec un regex, pour être certain qu'il respecte le format "nom@email.extension", des fonctions en PHP existent, voir la doc.

Pour la fonction header, attention elle doit être employée en début de page, ou en tout cas avant toute écriture HTML, autrement dit avant tous tes "echo". Avec cette syntaxe :
header("Location: taPage.php");
Merci ohweb.
Pour la fonction header, aucun problème.

J'en suis maintenant à essayer de compiler toutes les fonctions de test pour tous les champs.

//test des champs
if(strlen($_POST['nom']) < 3)
{
echo "Votre nom semble incorrect."
}
elseif(strlen($_POST['message']) < 10)
{
echo "Votre message semble incorrect."
}
//test de l'email
elseif(isset($_POST['email']))
{
	$email = stripslashes(htmlentities($_POST['email']));
        if(preg_match('#^(([a-z0-9!\#$%&\\\'*+/=?^_`{|}~-]+\.?)*[a-z0-9!\#$%&\\\'*+/=?^_`{|}~-]+)@(([a-z0-9-_]+\.?)*[a-z0-9-_]+)\.[a-z]{2,}$#i',str_replace('&amp;','&',$email)))
	{
// envoi email 
	$success = mail($EmailTo, $Subject, $Body, "From: <$EmailFrom>");
	}
        else
        {
        echo "Votre email semble incorrect."
        }
}


Je ne suis pas trop sûr de mon coup sur cette histoire...
Y a de l'idée, mais je préfère personnellement travailler avec un système de drapeau. Ca permet d'afficher plusieurs erreurs d'un seul coup. Le principe est simple :
- on initialise une variable (j'utilise généralement $ok) à true.
- on teste chaque champ, si c'est pas bon, on passe $ok à false
- à la fin de tous les test, si $ok est false, on affiche toutes les erreurs, si $ok est true, on envoie ce qui doit être fait.

En gros :
$ok=true;
if(/*test1 sur la variable 1*/){$ok=false;$erreur[/*nom de la variable*/]=1;}
elseif(strlen($str)<3){$ok=false;$erreur['nom']=2;}

if(empty($_POST['message'])){$ok=false;$erreur['mess']=1;}
elseif(strlen($_POST['message']) < 10){$ok=false;$erreur['mess']=2;}

/*..... autres tests.*/

if($ok){ /*fct mail*/}
else
{
     foreach($erreur as $v=>$code)
     {
          if($code==1){echo "Vous devez remplir tous les champs";}
          elseif($v=='nom'&&$code==2){echo "il y a sans doute une erreur dans votre nom";}
          elseif($v=='message'&&$code==2){echo "votre message est trop court";}
          /*etc...*/
     }
}


Et pour le test du email : va voir du coté de filter_var() et des filtres de validation, ça sera plus simple, plus léger, plus juste et plus lisible.
Excellent !!!
Je viens de tester et ça marche bien comme ça.

<?php

$EmailFrom = $_POST["email"]; 
$EmailTo = "contact@monsite.com";
$Subject = "Un message sur mon site";
$Nom = $_POST["nom"]; 
$Email = $_POST["email"]; 
$Message = $_POST["message"]; 

/*..... test des champs .....*/
$ok=true;

if(empty($_POST['nom'])){$ok=false;$erreur['nom']=1;}
elseif(strlen($_POST['nom']) < 3){$ok=false;$erreur['nom']=2;}

if(empty($_POST['message'])){$ok=false;$erreur['message']=1;}
elseif(strlen($_POST['message']) < 10){$ok=false;$erreur['message']=2;}

/*.....test email .....*/
if(filter_var($_POST["email"], FILTER_VALIDATE_EMAIL)){$ok=true;}
else{$ok=false;$erreur['email']=1;}

/*..... resultat des test .....*/
if($ok){
/*..... envoi email .....*/
	$success = mail($EmailTo, $Subject, $Body, "From: <$EmailFrom>");
}
else
{
     foreach($erreur as $v=>$code)
     {
          if($v=='nom'&&$code==1){echo "Vous n'avez pas indiqué votre nom.<br>";}
          elseif($v=='nom'&&$code==2){echo "Il y a sans doute une erreur dans votre nom.<br>";}
          elseif($v=='email'&&$code==1){echo "Votre email n'est pas valide.<br>";}
          elseif($v=='message'&&$code==1){echo "Vous n'avez pas écrit de message.<br>";}
          elseif($v=='message'&&$code==2){echo "Votre message est trop court.<br>";}
     }
}

/*..... redirection page de remerciement .....*/
if ($success){
  header("Location: page_merci.html");
}
else{
  echo "Désolé.<br>Une erreur s'est produite à l'envoi de votre message.";
}
?>


Si tu vois des erreurs qui m'ont échappé, je suis preneur (mais je pense que c'est bon là).
Dans tous les cas merci beaucoup Smiley biggrin
Modifié par Lich (19 May 2014 - 16:34)