Problème réception données d'un formulaire de contact

Signaler
Messages postés
12
Date d'inscription
jeudi 22 février 2007
Statut
Membre
Dernière intervention
9 octobre 2009
-
Messages postés
3708
Date d'inscription
lundi 5 juillet 2004
Statut
Membre
Dernière intervention
27 avril 2012
-
lennynero58
Bonjour à tous. Voilà j'ai mis un formulaire en ligne sur mon site qui fontionne très bien mais une seule chose me manque:
Je ne récupère pas tous les champs, il me manque le prénom et l'adresse?
voici le code que j'utilise pour l'envoi : (merci de votre aide)
======================================================
<?php
$nom=$HTTP_POST_VARS['nom'];
$prenom=$HTTP_POST_VARS['prenom'];
$adresse=$HTTP_POST_VARS['adresse'];
$mail=$HTTP_POST_VARS['mail'];
$objet=$HTTP_POST_VARS['objet'];
$message=$HTTP_POST_VARS['message'];

/////voici la version Mine
$headers = "MIME-Version: 1.0\r\n";

//////ici on détermine le mail en format text
$headers .= "Content-type: text/plain; charset=iso-8859-1\r\n";

////ici on détermine l'expediteur et l'adresse de réponse
$headers .= "From: $nom <$mail>\r\nReply-to : $nom <$mail>\nX-Mailer:PHP";

$subject="$objet";
$destinataire="contact@monsite.fr"; //remplacez "webmaster@votre-site.com" par votre adresse e-mail
$body="$message";
if (mail($destinataire,$subject,$body,$headers)) {
echo "Votre mail a été envoyé
";
} else {
echo "Une erreur s'est produite";
}
?>


Vous allez bientôt être redirigé vers la page d'accueil

Si vous n'êtes pas redirigé au bout de 5 secondes cliquez ici




Voilà
je pense qu'il manque une variable

Cordialement

21 réponses

Messages postés
14
Date d'inscription
samedi 21 février 2009
Statut
Membre
Dernière intervention
9 octobre 2009

slt,

essaye ceci :

<?php
$nom=$HTTP_POST_VARS['nom'];
$prenom=$HTTP_POST_VARS['prenom'];
$adresse=$HTTP_POST_VARS['adresse'];
$mail=$HTTP_POST_VARS['mail'];
$objet=$HTTP_POST_VARS['objet'];
$message=$HTTP_POST_VARS['message'];

/////voici la version Mine
$headers = "MIME-Version: 1.0\r\n";

//////ici on détermine le mail en format text
$headers .= "Content-type: text/plain; charset=iso-8859-1\r\n";

////ici on détermine l'expediteur et l'adresse de réponse
$headers .= "From: $nom <$mail>\r\nReply-to : $nom <$mail>\nX-Mailer:PHP";

$subject.="message : ".$object."\n"; //ici le message
$subject.="prenom : ".$prenom."\n"; //ici le prenom
$subject.="adresse : ".$adresse."\n"; // ici l'adresse
$destinataire="contact@monsite.fr"; //remplacez "webmaster@votre-site.com" par votre adresse e-mail
$body="$message";
if (mail($destinataire,$subject,$body,$headers)) {
echo "Votre mail a été envoyé
";
} else {
echo "Une erreur s'est produite";
}
?>
Messages postés
12
Date d'inscription
jeudi 22 février 2007
Statut
Membre
Dernière intervention
9 octobre 2009

Merci pour ton aide mais ca ne marche pas j'ai encore moins de données qu'avant
lennynero58
Messages postés
14
Date d'inscription
samedi 21 février 2009
Statut
Membre
Dernière intervention
9 octobre 2009

sinon tu peux mettre le tout sur une seule page comme ceci :

<?php

if(isset($_POST['submit'])){
$erreur= "";
// on nettoye les entrees
while(list($var,$val)=each($_POST)){
if(!is_array($val)){
$$var=strip_tags($val);
}else{
while(list($arvar,$arval)=each($val)){
$$var[$arvar]=strip_tags($arval);
}
}
}
// on formate
$nom=trim(ucwords(eregi_replace("[^a-zA-Z0-9éèàäö\ -]", "", $nom)));
$prenom=trim(ucwords(eregi_replace("[^a-zA-Z0-9éèàäö\ -]", "", $prenom)));
$adresse=trim(ucwords(eregi_replace("[^a-zA-Z0-9éèàäö\ -]", "", $adresse)));
$codepos=trim(eregi_replace("[^0-9+]", "", $codepos));
$ville=trim(ucwords(eregi_replace("[^a-zA-Z0-9éèàäö\ -]", "", $ville)));
$email=strip_tags(trim($email));
// on verifie
if(strlen($nom)<2){
$erreur.="<li>Le champ « Nom » est vide ou incomplet.";
$errnom=1;
}
if(strlen($prenom)<2){
$erreur.="<li>Le champ « Prénom » est vide ou incomplet.";
$errprenom=1;
}
if(strlen($adresse)<2){
$erreur.="<li>Le champ « Adresse » est vide ou incomplet.";
$erradresse=1;
}
if(strlen($codepos)<2){
$erreur.="<li>Le champ « Code postal » est vide ou incomplet.";
$errcodepos=1;
}
if(strlen($ville)<2){
$erreur.="<li>Le champ « Ville » est vide ou incomplet.";
$errville=1;
}
if(strlen($email)<2){
$erreur.="<li>Le champ « Mail » est vide ou incomplet.";
$erremail=1;
}else{
if(!ereg('^[-!#$%&\'*+\./0-9=?A-Z^_`a-z{|}~]+'.
'@'.
'[-!#$%&\'*+\/0-9=?A-Z^_`a-z{|}~]+\.'.
'[-!#$%&\'*+\./0-9=?A-Z^_`a-z{|}~]+$',
$email)){
$erreur.="<li>La syntaxe de votre adresse e-mail n'est pas correcte.";
$erremail=1;
}
}
if(strlen($message)<2){
$erreur.="<li>Le champ « Message » est vide ou incomplet.";
$errmessage=1;
}
if($erreur==""){
// Création du message
$titre="titre du message";
$tete="From:".$email."\n";
$corps.="Nom : ".$nom."\n";
$corps.="Prénom : ".$prenom."\n";
$corps.="Adresse : ".$adresse."\n";
$corps.="Code postal : ".$codepos."\n";
$corps.="Ville : ".$ville."\n";
$corps.="Mail : ".$email."\n";
$corps.="Message : ".$message."\n";
if(mail("ton@mail", $titre, stripslashes($corps), $tete)){
$ok_mail="true";
}else{
$erreur.="<li>Une erreur est survenue lors de l'envoi du message, veuillez refaire une tentative.";
}
}
}
?>
<? if($ok_mail=="true"){ ?>
Le message ci-dessous nous a bien été transmis, et nous vous en remercions.


<?echo nl2br(stripslashes($corps));?>
Nous allons y donner suite dans les meilleurs délais.
A bientôt.
<? }else{ ?>
<form action='<? echo $PHP_SELF ?>' method='post' name='Form'>

<? if($erreur){ ?>
  ERREUR, votre message n'a pas été transmis 
<?echo$erreur?>
<? } ?>

Les champs marqué d'un * sont obligatoires



        Nom* : ' size ='24' border='0'>
        

        Prénom* : ' size='24' border='0'>
        

        Adresse* : ' size='24' border='0'>
        

        Code postal* : ' size='24' border='0'>
        

        Ville* : ' size='24' border='0'>
        

        Mail* : ' size='24' border='0'>
        

        Message* : <textarea name='message' rows='6' cols='40'><? echo $message?></textarea>
        

        

</form>
<? } ?>
Messages postés
12
Date d'inscription
jeudi 22 février 2007
Statut
Membre
Dernière intervention
9 octobre 2009

Meric encore,
mais peux-tu me dire s'il est possible dans le from de récupérer avec le nom aussi le prénom, sinon pour les reste ok

merci
lennynero58
Messages postés
14
Date d'inscription
samedi 21 février 2009
Statut
Membre
Dernière intervention
9 octobre 2009

Avec ceci sa devrai fonctionner

<?php

if(isset($_post['submit'])){
$erreur= "";
// on nettoye les entrees
while(list($var,$val)=each($_post)){
if(!is_array($val)){
$$var=strip_tags($val);
}else{
while(list($arvar,$arval)=each($val)){
$$var[$arvar]=strip_tags($arval);
}
}
}
// on formate
$nom=trim(ucwords(eregi_replace("[^a-za-z0-9éèàäö\ -]", "", $nom)));
$prenom=trim(ucwords(eregi_replace("[^a-za-z0-9éèàäö\ -]", "", $prenom)));
$adresse=trim(ucwords(eregi_replace("[^a-za-z0-9éèàäö\ -]", "", $adresse)));
$codepos=trim(eregi_replace("[^0-9+]", "", $codepos));
$ville=trim(ucwords(eregi_replace("[^a-za-z0-9éèàäö\ -]", "", $ville)));
$email=strip_tags(trim($email));
// on verifie
if(strlen($nom)<2){
$erreur.="<li>le champ « nom » est vide ou incomplet.";
$errnom=1;
}
if(strlen($prenom)<2){
$erreur.="<li>le champ « prénom » est vide ou incomplet.";
$errprenom=1;
}
if(strlen($adresse)<2){
$erreur.="<li>le champ « adresse » est vide ou incomplet.";
$erradresse=1;
}
if(strlen($codepos)<2){
$erreur.="<li>le champ « code postal » est vide ou incomplet.";
$errcodepos=1;
}
if(strlen($ville)<2){
$erreur.="<li>le champ « ville » est vide ou incomplet.";
$errville=1;
}
if(strlen($email)<2){
$erreur.="<li>le champ « mail » est vide ou incomplet.";
$erremail=1;
}else{
if(!ereg('^[-!#$%&\'*+\./0-9=?a-z^_`a-z{|}~]+'.
'@'.
'[-!#$%&\'*+\/0-9=?a-z^_`a-z{|}~]+\.'.
'[-!#$%&\'*+\./0-9=?a-z^_`a-z{|}~]+$',
$email)){
$erreur.="<li>la syntaxe de votre adresse e-mail n'est pas correcte.";
$erremail=1;
}
}
if(strlen($message)<2){
$erreur.="<li>le champ « message » est vide ou incomplet.";
$errmessage=1;
}
if($erreur==""){
// création du message
$titre="titre du message";
$tete="from:".$email."\n";
$corps.="nom : ".$nom."\n";
$corps.="prénom : ".$prenom."\n";
$corps.="adresse : ".$adresse."\n";
$corps.="code postal : ".$codepos."\n";
$corps.="ville : ".$ville."\n";
$corps.="mail : ".$email."\n";
$corps.="message : ".$message."\n";
if(mail("ton@mail", $titre, stripslashes($corps), $tete)){
$ok_mail="true";
}else{
$erreur.="<li>une erreur est survenue lors de l'envoi du message, veuillez refaire une tentative.";
}
}
}
?>
<? if($ok_mail=="true"){ ?>
le message ci-dessous nous a bien été transmis, et nous vous en remercions.


<?echo nl2br(stripslashes($corps));?>
nous allons y donner suite dans les meilleurs délais.
a bientôt.
<? }else{ ?>
<form action='<? echo $php_self ?>' method='post' name='form'>

<? if($erreur){ ?>
  erreur, votre message n'a pas été transmis 
<?echo$erreur?>
<? } ?>

les champs marqué d'un * sont obligatoires



        nom* : ' size ='24' border='0'>
        

        prénom* : ' size='24' border='0'>
        

        adresse* : ' size='24' border='0'>
        

        code postal* : ' size='24' border='0'>
        

        ville* : ' size='24' border='0'>
        

        mail* : ' size='24' border='0'>
        

        message* : <textarea name='message' rows='6' cols='40'><? echo $message?></textarea>
        

        

</form>
<? } ?>
Messages postés
12
Date d'inscription
jeudi 22 février 2007
Statut
Membre
Dernière intervention
9 octobre 2009

J'utilise mon premier script modifié avec le tiens que tu m'a envoyé en premier.
Tout est presque OK
Voici l'entête mail que je recois :
Objet : demande de rendez-vous Adresse : 1 place de la résistance 91540 ETAMPES

Tout est à la suite ! peux ton mettre une variable pour un retour ligne après la commande :
$subject.="message : ".$objet."\n";

Merci encore de ta patience
lennynero58
Messages postés
14
Date d'inscription
samedi 21 février 2009
Statut
Membre
Dernière intervention
9 octobre 2009

oui bien sur

tu met ceci

$subject.="message : ".$objet."\n
";
Messages postés
12
Date d'inscription
jeudi 22 février 2007
Statut
Membre
Dernière intervention
9 octobre 2009

Désolé mais cela ne marche pas voici ce que j'ai dans l'entête de mon email:

Objet : demande envoi de documentation
Adresse : St germain de marencennes 17000

Le br ets là et pas de retour à la ligne???

lennynero58
Messages postés
14
Date d'inscription
samedi 21 février 2009
Statut
Membre
Dernière intervention
9 octobre 2009

désole lol
une erreur

voici :
$subject.="message : ".$objet."
\n";


ou alors :
$subject.="
adresse : ".$adresse."\n";
Messages postés
12
Date d'inscription
jeudi 22 février 2007
Statut
Membre
Dernière intervention
9 octobre 2009

Non désolé ni l'un ni l'autre


lennynero58
Messages postés
14
Date d'inscription
samedi 21 février 2009
Statut
Membre
Dernière intervention
9 octobre 2009

oki donne moi ton code entier je pourrais mieux voir
Messages postés
12
Date d'inscription
jeudi 22 février 2007
Statut
Membre
Dernière intervention
9 octobre 2009

<?php
$nom=$HTTP_POST_VARS['nom'];
$organisme=$HTTP_POST_VARS['organisme'];
$adresse=$HTTP_POST_VARS['adresse'];
$mail=$HTTP_POST_VARS['mail'];
$objet=$HTTP_POST_VARS['objet'];
$message=$HTTP_POST_VARS['message'];

/////voici la version Mine
$headers = "MIME-Version: 1.0\r\n";

//////ici on détermine le mail en format text
$headers .= "Content-type: text/plain; charset=iso-8859-1\r\n";

////ici on détermine l'expediteur et l'adresse de réponse
$headers .= "From: $nom <$mail>\r\nReply-to : $nom <$mail>\nX-Mailer:PHP";

$subject.="Objet : ".$objet."\n"; //ici l'objet
$subject.="Organisme : ".$organisme."\n"; //ici l'organisme
$subject.="Adresse : ".$adresse."\n"; // ici l'adresse
$destinataire="contact@xxxxxxx.fr"; //remplacez "webmaster@votre-site.com" par votre adresse e-mail
$body="$message";
if (mail($destinataire,$subject,$body,$headers)) {
echo "Votre mail a été envoyé
";
} else {
echo "Une erreur s'est produite";
}
?>


lennynero58
Messages postés
14
Date d'inscription
samedi 21 février 2009
Statut
Membre
Dernière intervention
9 octobre 2009

voila sa devrai fonctionner :
<?php
$nom=$HTTP_POST_VARS['nom'];
$organisme=$HTTP_POST_VARS['organisme'];
$adresse=$HTTP_POST_VARS['adresse'];
$mail=$HTTP_POST_VARS['mail'];
$objet=$HTTP_POST_VARS['objet'];
$message=$HTTP_POST_VARS['message'];

/////voici la version Mine
$headers = "MIME-Version: 1.0\r\n";

//////ici on détermine le mail en format text
$headers .= "Content-type: text/plain; charset=iso-8859-1\r\n";

////ici on détermine l'expediteur et l'adresse de réponse
$headers .= "From: $nom <$mail>\r\nReply-to : $nom <$mail>\nX-Mailer:PHP";

$subject.="Objet : ".$objet."\r\n"; //ici l'objet
$subject.="Organisme : ".$organisme."\r\n"; //ici l'organisme
$subject.="Adresse : ".$adresse."\r\n"; // ici l'adresse
$destinataire="contact@xxxxxxx.fr"; //remplacez "webmaster@votre-site.com" par votre adresse e-mail
$body="$message";
if (mail($destinataire,$subject,$body,$headers)) {
echo "Votre mail a été envoyé
";
} else {
echo "Une erreur s'est produite";
}
?> 
Messages postés
12
Date d'inscription
jeudi 22 février 2007
Statut
Membre
Dernière intervention
9 octobre 2009

Ok j'essaye mais dapres ce que je lis sur le net le navigateur lis du html et outloook lis aussi en html alors pas sur que ca fonctionne

merci j'eeaye et te tiens au courant



lennynero58
Messages postés
12
Date d'inscription
jeudi 22 février 2007
Statut
Membre
Dernière intervention
9 octobre 2009

Non dsl rien du tout et en plus je ne récupère pas ce que je met dans le champs organisme?
lennynero58
Messages postés
12
Date d'inscription
jeudi 22 février 2007
Statut
Membre
Dernière intervention
9 octobre 2009

C'est bon je récupère le champs organisme !
sorry erreur de ma part mais pour le reste toujours rien

lennynero58
Messages postés
3708
Date d'inscription
lundi 5 juillet 2004
Statut
Membre
Dernière intervention
27 avril 2012
27
Salut,

Je n'ai parcouru que très brièvement.
Mais ...
- tu as de gros problèmes de sécurité dans ton script.
Tel quel, il est possible d'envoyer n'importe quel message sous n'importe quel nom à n'importe qui, voire même attacher des pièces jointes (virus and co)
Pense donc à traiter les données reçues d'un formulaire et fais une recherche sur "php injection fonction mail"
- "$HTTP_POST_VARS"=> à bannir, utilise $_POST
- des retours à la ligne dans l'objet d'un mail ???? ... impossible il me semble.
outloook lis aussi en html

Outlook interprète le mail selon son content-type. Dans ton cas en texte pure, il faut un Content-type: text/html pour qu'il interprète le HTML.

Pour le debug pense à afficher les données qui proviennent de ton formulaire en les affichant en tout début de script :
print_r($_POST);


L'affichage des erreurs est il activé ?

Cordialement,

Kohntark -





Kohntark -
Messages postés
12
Date d'inscription
jeudi 22 février 2007
Statut
Membre
Dernière intervention
9 octobre 2009

Bonsoir Kohntrack

Que penses tu de celui-ci ?
====================================================================

<?php
$msg_erreur = "Erreur. Les champs suivants doivent être obligatoirement remplis :

";
$msg_ok = "Votre demande a bien été prise en compte.";
$message = $msg_erreur;
define('MAIL_DESTINATAIRE','webmaster@6ma.fr'); // remplacer par votre email
define('MAIL_SUJET','Message du formulaire de example.com');

// vérification des champs
if (empty($_POST['civilite']))
$message .= "Votre civilité
";
if (empty($_POST['nom']))
$message .= "Votre nom
";
if (empty($_POST['adresse']))
$message .= "Votre adresse
";
if (empty($_POST['codepostal']))
$message .= "Votre code postal
";
if (empty($_POST['ville']))
$message .= "Votre ville
";
if (empty($_POST['comments']))
$message .= "Votre message
";


// si un champ est vide, on affiche le message d'erreur
if (strlen($message) > strlen($msg_erreur)) {

echo $message;

// sinon c'est ok
} else {

foreach($_POST as $index => $valeur) {
$$index = stripslashes(trim($valeur));
}

$interets = $_POST['interets'];
$sqlinterets = '';
for ($i=0; $i<count($interets); $i++)
{
$sqlinterets .= $interets[$i];
$sqlinterets .= ', ';
}


//Préparation de l'entête du mail:
$mail_entete = "MIME-Version: 1.0\r\n";
$mail_entete .= "From: {$_POST['nom']} "
."<{$_POST['email']}>\r\n";
$mail_entete .= 'Reply-To: '.$_POST['email']."\r\n";
$mail_entete .= 'Content-Type: text/plain; charset="iso-8859-1"';
$mail_entete .= "\r\nContent-Transfer-Encoding: 8bit\r\n";
$mail_entete .= 'X-Mailer:PHP/' . phpversion()."\r\n";

// préparation du corps du mail
$mail_corps = "Message de : $civilite $nom\n";
$mail_corps .= "Adresse : $adresse, $codepostal $ville, $pays\n";
$mail_corps .= "Ses centres d'intérêts : $sqlinterets\n\n\n";
$mail_corps .= $comments;

// envoi du mail
if (mail(MAIL_DESTINATAIRE,MAIL_SUJET,$mail_corps,$mail_entete)) {

//Le mail est bien expédié
echo $msg_ok;
} else {

//Le mail n'a pas été expédié
echo 'Une erreur est survenue lors de l\'envoi du formulaire par email';
}

}
?>

==========================================================

lennynero58
Messages postés
3708
Date d'inscription
lundi 5 juillet 2004
Statut
Membre
Dernière intervention
27 avril 2012
27
Il y a encore beaucoup de problèmes, même si certaines erreurs du précédent sont gommés.

A la louche et au fur à mesure (sans avoir vu ton formulaire) :
// sinon c'est ok

Ben nan ça ne l'est pas
Rien n'empêche, par exemple, d'entrer en code postal "planète inter galactique", en civilité "alien marié à un berger Allemand", en ville "planète Mars", ...
Avoue que ça la fou mal.
Il faut toujours blinder les données provenant de l'utilisateur.
Le principe :
- contrôle du formulaire côté client :
faciliter la saisie et restreindre les erreurs de frappe ainsi que les petits malins
=> utiliser au maximum les choix via des selects, des radios, ...
ex :
votre sexe ?
<select name="sex"...>
<option value="1">homme</option>
<option value="2">femme</option>
</select>
au lieu d'un input text qui te donnera un jour un sexe "énorme"
> utiliser les regex, les api, les fonctions natives JS, etc .. pour valider les dates, les codes postaux, ...

- contrôle des données reçues côté serveur :
Etant donné qu'elles ont déjà été vérifié côté client les contrôles doivent être bien plus simplistes et sont purement sécuritaire.
Pour reprendre l'exemple précédent :
si sex est différent de 1 et différent de 2 => les données n'ont pas été postées via le formulaire => on consigne éventuellement l'ip et on vire sans état d'âme.

foreach($_POST as $index => $valeur) { 
$$index = stripslashes(trim($valeur)); 
} 

=> $$index
=> $index sera toujours égal à la valeur du dernier champ du post
=> $index ne sert nul part

$_POST['interets'] n'est pas contrôlé, il est ainsi possible de faire de l'injection dans la fonction mail, tout comme les autres ....

J'arrête là, il y a pas mal d'erreurs encore, et pas des moindres.
A mon avis commence par mettre ces 2 lignes tout en haut de ton code :
ini_set('display_errors', 1);
error_reporting(-1);

elles te permettront d'afficher les erreurs, et notamment toutes tes variables qui ne sont pas définies.

Et je me répète :
Pour le debug pense à afficher les données qui proviennent de ton formulaire en les affichant en tout début de script :
print_r($_POST);



Cordialement,

Kohntark -
Messages postés
3708
Date d'inscription
lundi 5 juillet 2004
Statut
Membre
Dernière intervention
27 avril 2012
27
il est temps que j'aille me coucher sans doute.

Oublie donc ça
Code PHP :
foreach($_post as $index => $valeur) {
$$index = stripslashes(trim($valeur));
}

=> $$index
=> $index sera toujours égal à la valeur du dernier champ du post
= > $index ne sert nul part


Ton code devrait fonctionner, même si mes autres remarques restent valables.
Par ailleurs tu aurais tout intérêt à sortir le trim et le stripslashes de la boucle foreach, ce qui te permettrait d'inclure le tableau $interets.

Je ne suis pas pour cette méthode (le foreach et l'utilisation des variables dynamiques) qui laisse à l'utilisateur la possibilité de nommer les variables comme il le souhaite (au final ça revient à un register_global à on) Il y a un gros risque de sécurité l à.
Pour ma part je préfère contrôler ces variables une à une via $_POST['trucmuche'] et appliquer les filtres correspondants (numéro de tel ? => doit satisfaire le masque regex qui va bien, date de naissance ? doit satisfaire l'autre masque regex qui va bien, etc ...)
Traiter l'ensemble des variables postées d'une manière uniforme est impossible sans alourdir considérablement le script.

Cordialement,




Kohntark -