Version complète: sur le forum Webmaster Hub : Traitement auto d'un formulaire par mail
Webmaster Hub > Création et exploitation de Sites Internet > Les langages du Net > PHP
gt4mike
Bonjour tout le monde rolleyes.gif ,

J'ai créé un formulaire en php "donnez nous votre opinion" (page opinion.php)avec les champs :
"civilité", "nom", "prenom", "email", "age', "formation suivie", "commentaires".

Les champs "age", "formation suivie" sont des listes modifiables dans la zone administration du site, donc des listes dynamiques.

Tous les champs sont obligatoires à la saisie.

Ce formulaire contient les boutons "apercu", "envoyer", et "effacer"

Sur la meme page j'ai un formulaire avec un bouton "voir les opinions dejà postées" (page commentaires.php)

Lorsque le client envoie le formulaire il est dirigé sur la page opinion.php ou il voit son commentaire. Ma base de données enregistre bien les données envoyées. Et le client voit bien son commentaire.

Je souhaiterai que l'administrateur recoive un mail qui récapitule les informations du formulaire, il sera ainsi prévenu de l'écriture du mail.

PROBLEME : des qu'un utilisateur se met sur la page, un mail part avec à l'intérieur ce message :
"Submit : Votre opinion nous interesse"
(en faite cet intitulé se trouve sur la page d'accueil du site sur un bouton qui permet d'accéder directement à cette page)


S'il quitte la page et qu'il revient, à chaque fois un mail contenant ces 5 mots part !!!! angry.gif

Mais lorsque le client rentre les informations, un autre mail part et là, le mail est parfait, il contient bien tous les champs enrichis rolleyes.gif


Alors avant de vous envoyer le code du formulaire et le code d'envoi du mail, je voudrais savoir si vous avez des pistes à me communiquer afin que je contrôle ou j'ai fais des erreurs.

Merci de votre aide, cela fait plusieurs jours que je bute sur ce probleme. wacko.gif
NorSeb
Bonjour,

CITATION(gt4mike @ lundi 07 novembre 2005, 14h28)
Alors avant de vous envoyer le code du formulaire et le code d'envoi du mail, je voudrais savoir si vous avez des pistes à me communiquer afin que je contrôle ou j'ai fais des erreurs.

whistling.gif Ca serait mieux avec du code quand même....

Si tu es en php, il serait utile de controler la valeurs des variables envoyées par le formulaire. Si elles sont vides, tu n'envoie pas le formulaire. (idem pour la base de données d'ailleurs)

Si non tu stocke dans ta base le fait d'avoir envoyé le mail (un peu lourd à mon avis)

Ou alors tu redirige automatiquement sur une autre page...

Bref, des solutions, c'est pas ce qui manque smile.gif

[EDIT]Essaye de poster dans le forum adéquat[/EDIT]
gt4mike
Merci, smile.gif Je ne savais ou le poster, voici le code en question :


code de l'envoi du mail :

CODE
$datedujour=date("j M Y à H:i:s ");
$email = "moi_AT_free.fr";
while (list ($key, $val) = each ($_POST))
{
$message .= "$key : $val\n";
}
mail($email, "Un nouveau commentaire vient d'etre écrit le $datedujour", $message, "From: Formulaire");  



Code du formulaire édité

Merci smile.gif


J'avais essayé cela aussi :
CODE
while (list($key, $val) = each($HTTP_POST_VARS)) {
   $message .= "$key : $val\n";
}



et cela
CODE
if(count($HTTP_POST_VARS)){
   while (list($key, $val) = each($HTTP_POST_VARS)){
      $body.="$key : $val\n";
   }  
}

if(count($HTTP_GET_VARS)){
   while (list($key, $val) = each($HTTP_GET_VARS)){
     $body.="$key : $val\n";
   }  
}
NorSeb
CITATION(gt4mike @ lundi 07 novembre 2005, 14h38)
Merci, je vais fournir le code, mais avant dis moi ou tu veux que je le mette, j'éditerai mon précédent message. huh.gif

Tu aurais très bien pu le mettre dans ce message biggrin.gif

Et il n'est peut-être pas utile de mettre tout ton code... La partie d'envoi du mail sera sans doute suffisante.
NorSeb
Arrète d'éditer ton message screugneugneu !
L'intéret d'un forum est de mettre les messages les uns à la suite des autres de façon à avoir un semblant de chronologie !
Non mais... Je m'y perd moi maintenant.
gt4mike
Promis, je recommencerai plus ^_^ , j'essaye de faire de mon mieux smile.gif
NorSeb
Dans ton while, tu fait la liste des variables envoyées par le formulaire ; fait une vérification du genre :

CODE
envoyer = true;
while (list ($key, $val) = each ($_POST))
{
 if ($val != "") { // Si $val n'est pas vide
   $message .= "$key : $val\n";
 }
 else { // sinon
   $envoyer = false;
   continue; // sortie du while
 }
}
if ($envoyer) {
 mail($email, "Un nouveau commentaire vient d'etre écrit le $datedujour", $message, "From: Formulaire");  
}
NorSeb
CITATION(gt4mike @ lundi 07 novembre 2005, 15h13)
Promis, je recommencerai plus  ^_^ , j'essaye de faire de mon mieux smile.gif
*

Pas grave allez smile.gif

Tiens nous au courant de la suite des choses...
gt4mike
Merci de ta réponse aussi rapide, voilà ce que j'ai mis :

CODE
$envoyer = true;
while (list ($key, $val) = each ($_POST))
{
if ($val != "") { // Si $val n'est pas vide
  $message .= "$key : $val\n";
}
else { // sinon
  $envoyer = false;
  continue; // sortie du while
}
}
if ($envoyer) {
mail($email, "Un nouveau commentaire vient d'etre écrit le $datedujour", $message, "From: Formulaire");  
}


Ca ne marche, j'ai toujours un mail vide composé des 5 mots cités dans mon précédent message des que je reviens sur la page.

Mais maintenant, losque je rempli les champs, dans le mail de confirmation j'ai en plus :

"envoyer : Envoyer votre opinion" unsure.gif
gt4mike
Alors, je viens de supprimer l'identité du bouton 'envoyer votre opinion" (qui était : "envoyer") et il n'apparait plus dans le mail lorsqu'on rempli tous les champs du formulaire.

Mais j'ai toujours un mail vide composé des 5 mots à chaque accés à la page wacko.gif
NorSeb
Le doute m'habite blink.gif dans ton premier message tu dis :
CITATION(gt4mike @ lundi 07 novembre 2005, 14h28)
Tous les champs sont obligatoires à la saisie.

Tu vérifie ça comment ?

Bref... Pour modifier ton code :

CODE
$envoyer = false;
while (list ($key, $val) = each ($_POST))
{
if ($val != "") { // Si $val n'est pas vide
 $message .= "$key : $val\n";
$envoyer = true;
}

}
if ($envoyer) {
mail($email, "Un nouveau commentaire vient d'etre écrit le $datedujour", $message, "From: Formulaire");  
}
gt4mike
J'ai modifié, meme résultat.

Pour le contrôle des champs, je le fais via un javascript

Le code dans le formulaire est :

CODE
</form>
<form action="<?php echo $editFormAction; ?>" method="post" name="form3" onsubmit="YY_checkform('form3','nom','#q','0','Le champ nom est obligatoire','prenom','#q','0','Le champ pr&eacute;nom est obligatoire','email','#S','2','Le champ email est obligatoire ou mal rempli','civilite','#q','1','Le champ civilit&eacute; est obligatoire','age','#q','1','Le champ age est obligatoire','formation','#q','1','Le champ formation est obligatoire','commentaires','#q','1','Le champ commentaires est obligatoire');return document.MM_returnValue">
<table align="center">
.
..
...


Le script est sur un fichier.js à la racine de mon site, son code est :

CODE
function YY_checkform() { //v4.71
//copyright (c)1998,2002 Yaromat.com
var a=YY_checkform.arguments,oo=true,v='',s='',err=false,r,o,at,o1,t,i,j,ma,rx,cd,cm,cy,dte,at;
for (i=1; i<a.length;i=i+4){
if (a[i+1].charAt(0)=='#'){r=true; a[i+1]=a[i+1].substring(1);}else{r=false}
o=MM_findObj(a[i].replace(/\[\d+\]/ig,""));
o1=MM_findObj(a[i+1].replace(/\[\d+\]/ig,""));
v=o.value;t=a[i+2];
if (o.type=='text'||o.type=='password'||o.type=='hidden'){
if (r&&v.length==0){err=true}
if (v.length>0)
if (t==1){ //fromto
ma=a[i+1].split('_');if(isNaN(v)||v<ma[0]/1||v > ma[1]/1){err=true}
} else if (t==2){
rx=new RegExp("^[\\w\.=-]+@[\\w\\.-]+\\.[a-zA-Z]{2,4}$");if(!rx.test(v))err=true;
} else if (t==3){ // date
ma=a[i+1].split("#");at=v.match(ma[0]);
if(at){
cd=(at[ma[1]])?at[ma[1]]:1;cm=at[ma[2]]-1;cy=at[ma[3]];
dte=new Date(cy,cm,cd);
if(dte.getFullYear()!=cy||dte.getDate()!=cd||dte.getMonth()!=cm){err=true};
}else{err=true}
} else if (t==4){ // time
ma=a[i+1].split("#");at=v.match(ma[0]);if(!at){err=true}
} else if (t==5){ // check this 2
if(o1.length)o1=o1[a[i+1].replace(/(.*\[)|(\].*)/ig,"")];
if(!o1.checked){err=true}
} else if (t==6){ // the same
if(v!=MM_findObj(a[i+1]).value){err=true}
}
} else
if (!o.type&&o.length>0&&o[0].type=='radio'){
at = a[i].match(/(.*)\[(\d+)\].*/i);
o2=(o.length>1)?o[at[2]]:o;
if (t==1&&o2&&o2.checked&&o1&&o1.value.length/1==0){err=true}
if (t==2){
oo=false;
for(j=0;j<o.length;j++){oo=oo||o[j].checked}
if(!oo){s+='* '+a[i+3]+'\n'}
}
} else if (o.type=='checkbox'){
if((t==1&&o.checked==false)||(t==2&&o.checked&&o1&&o1.value.length/1==0)){err=true}
} else if (o.type=='select-one'||o.type=='select-multiple'){
if(t==1&&o.selectedIndex/1==0){err=true}
}else if (o.type=='textarea'){
if(v.length<a[i+1]){err=true}
}
if (err){s+='* '+a[i+3]+'\n'; err=false}
}
if (s!=''){alert('Vos informations sont incompletes ou contiennent des erreurs:\t\t\t\t\t\n\n'+s)}
document.MM_returnValue = (s=='');
}
NorSeb
C'est normal que ca donne le même résultat... Au temps pour moi. Je continue, ca va le faire smile.gif
gt4mike
J'ai passé tout le week end dessus :gueule: ma femme commence a en avoir marre, merci de ton aide smile.gif
NorSeb
CITATION(gt4mike @ lundi 07 novembre 2005, 16h38)
ma femme commence a en avoir marre

Tu m'étonne ! biggrin.gif

Pour en venir (et en finir) à ton problème, il faut faire une vérification en php pour vérifier qu'il y a quelque chose à envoyer.
Le plus simple, pour que tu n'as pas à tout modifier et de tester la validité de au moins un des champs.

Par exemple, l'email... si le champ s'appelle 'email'

CODE
if (isset($_POST['email'])) {

$datedujour=date("j M Y à H:i:s ");
$email = "moi_AT_free.fr";
while (list ($key, $val) = each ($_POST))
{
 $message .= "$key : $val\n";
}
mail($email, "Un nouveau commentaire vient d'etre écrit le $datedujour", $message,  "From: Formulaire");  

}

de cette façon, le mail ne sera envoyé que si email est renseigné...
gt4mike
Tu vois, par habitude, j'essaye toujours de me débrouiller tout seul dans mon coin, j'ai déjà passer beaucoup d'heures sur ce probleme.

En faite lorsque tu est la tete dedans, tu ne fais plus attention, et tu bloques comme moi, j'ai perdu trop d'heures!!!!

Et bien je peux te dire que ta solution MARCHE !

MERCI BEAUCOUP biggrin.gif

PS : je vais me permettre une autre question NorSeb :
j'ai 2 champs masqués dans le formulaire, l'un ou je récupere l'IP dans le mail, l'autre, un champ intitulé
"<input type="hidden" name="MM_insert" value="form3">" qui permet l'insertion des variables dans la base de données

Evidement tu te doutes que dans le mail je vois apparaitre "MM_insert : form3", as-tu une solution pour empécher la variable d'apparaitre ?
NorSeb
CITATION(gt4mike @ lundi 07 novembre 2005, 17h22)
Evidement tu te doutes que dans le mail je vois apparaitre "MM_insert : form3", as-tu une solution pour empécher la variable d'apparaitre ?
*


Tu as deux solutions :
- soit construire le contenu de ton mail proprement, c'est à dire en y mettant ce que tu veux manuellement. De cette façon, tout le reste n'y est pas. wink.gif
CODE
$message = $_POST['nom']."\n".$_POST['prenom']....;


- Soit tester pour empecher certaines valeurs d'être insérées au message (mais c'est pas le plus propre)

CODE
while (list ($key, $val) = each ($_POST))
{
if ($key != "MM_insert") {
  $message .= "$key : $val\n";
 }
}
gt4mike
Bonjour NorSeb,

Juste en passant, je suis surpris de n'avoir pas recu une notification par mail de ta réponse, toutes les autres j'en avais eu, me permettant ainsi de te répondre rapidement et puis, je ne sais pour quelle raison, je n'ai pas recu ta derniere réponse. blink.gif


En faite dans une autre partie du site, le client envoi un autre formulaire et j'ai choisi la solution dont tu parles " construire le contenu de ton mail proprement, c'est à dire en y mettant ce que tu veux manuellement". Et il marche sans probleme. smile.gif C'est un formulaire de demande d'informations, avec lui aussi des listes dynamiques.


Pour ce formulaire dont nous parlons dans ce topic, j'ai fais ce que tu m'as préconisé, c'est à dire :

CODE
while (list ($key, $val) = each ($_POST))
{
if ($key != "MM_insert") {
 $message .= "$key : $val\n";
}
}



et ca MARCHE

Merci infiniment et bonne continuation à toi et à toute l'équipe de ce site, j'ai été très agréablement surpris de ta réactivité et de tes réponses claires et précises.

C'est suffisament rare pour le préciser. B)
Dudu
CITATION(gt4mike @ mardi 08 novembre 2005, 13h12)
Juste en passant, je suis surpris de n'avoir pas recu une notification par mail de ta réponse, toutes les autres j'en avais eu, me permettant ainsi de te répondre rapidement et puis, je ne sais pour quelle raison, je n'ai pas recu ta derniere réponse. blink.gif
*
[HS] Certainement parce que tu es resté connecté sur le forum: dans ce cas aucun mail n'est envoyé (partant du principe que la personne est connectée, elle est censée voir elle-même les réponses).

Rester connecté ne veut pas forcément dire être actif sur le forum, çà peut vouloir dire ne pas s'être deloggué et avoir simplement fermé la fenêtre: dans ce cas tu restes "connecté" quelques minutes. Je pense que c'est ce qu'il a du t'arriver wink.gif
[/HS]
gt4mike
Merci, je confirme, c'était mon cas B)
Ceci est une version "bas débit" de notre forum. Pour voir la version complète avec plus d'information, la mise en page et les images, veuillez cliquer ici.