Erreur dans un script de formulaire

Sven78 Messages postés 5 Date d'inscription jeudi 15 février 2007 Statut Membre Dernière intervention 15 février 2007 - 15 févr. 2007 à 15:13
Sven78 Messages postés 5 Date d'inscription jeudi 15 février 2007 Statut Membre Dernière intervention 15 février 2007 - 15 févr. 2007 à 17:48
Bonjour à toutes et à tous

Google m'a conduit ici quand je lui ai demandé de l'aide sur la fonction $_POST qui semble me poser problème


À la base c'est un formulaire de contact qui ne devrait pas poser de problèmes, mais là ça coince.


Voici le code qui pose problème :

***********
<?php

// Dans la ligne qui suit, remplacer webmaster@domaine.tld par l'adresse email du webmaster, à laquelle les messages devront être envoyés

$email_webmaster = "webmestre@toto.com";

// === traitement des données du formulaire ============================================================

if (isset($_POST["envoyer"])){

// le formulaire a été soumis

        $etat = "erreur";

// Valeur par défaut. Prendra la valeur "ok" s'il n'y a pas d'erreur

// --- mise en forme des champs saisis dans le formulaire lors de sa soumission ---

        if (isset($_POST["nom"])) {

                 $_POST["nom"]=trim(stripslashes($_POST["nom"]));

        }

        if (isset($_POST["email_expediteur"])) {

                 $_POST["email_expediteur"]=trim(stripslashes($_POST["email_expediteur"]));

        }

        if (isset($_POST["titre"])) {

                 $_POST["titre"]=trim(stripslashes($_POST["titre"]));

        }

        if (isset($_POST["message"])) {

                 $_POST["message"]=trim(stripslashes($_POST["message"]));

        }

        // --- test de la validité des champs saisis ---

        if (empty($_POST["email_expediteur"])) {

// il manque l'email de l'expéditeur

                 $erreur="Saisissez votre adresse courriel.";

        }

        elseif (!eregi("^[0-9a-z]([-_.]?[0-9a-z])*@[0-9a-z]([-.]?[0-9a-z])*.[a-z]{2,4}$",$_POST["email_expediteur"])){

// l'adresse e-mail n'est pas valide

                 $erreur="Votre adresse courriel ne semble pas correcte. Merci de réessayer.";

        }

                elseif (empty($_POST["nom"])) {

// il manque le nom de l'expéditeur

                 $erreur="Merci de donner votre nom.";

        }

        elseif (empty($_POST["message"])) {

// le message est vide

                 $erreur="Veuillez saisir un message.";

        }

        else {

// --- tous les champs sont correctement remplis: on pourra envoyer le mail ---

                 $etat="ok";

        }

}

else {

// --- le formulaire n'a pas été soumis ---

           $etat="attente";

}

// === fin de traitement des données du formulaire =======================================================

?>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="fr" lang="fr">

<head>

<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />

<title>Contacter le webmestre de nomasis.com</title>

</head>

Contacter le webmestre

<?php

if ($etat!="ok"){// le formulaire n'a pas été soumis, ou soumis avec une erreur

         if ($etat=="erreur"){

//le formulaire a été soumis avec une erreur

                         echo "".$erreur."

n";

// afficher le message d'erreur

         }

?>

        

                <form method="post" action="<?php echo $_SERVER["PHP_SELF"]; ?>">

        <label for="nom">Votre nom (obligatoire):</label>

        <?php

        if (!empty($_POST["nom"])) {

// l'adresse email de l'expéditeur a été saisie: la réafficher

                echo htmlspecialchars($_POST["nom"],ENT_QUOTES);

        }

        ?>" />

        

        <label for="email_expediteur">Votre adresse e-mail (obligatoire):</label>

        <?php

        if (!empty($_POST["email_expediteur"])) {

// l'adresse email de l'expéditeur a été saisie: la réafficher

                echo htmlspecialchars($_POST["email_expediteur"],ENT_QUOTES);

        }

        ?>" />

        

        <label for="titre">Titre de message (facultatif):</label>

        <?php

        if (!empty($_POST["titre"])) {

// le titre du message a été saisi: le réafficher

                echo htmlspecialchars($_POST["titre"],ENT_QUOTES);

        }

        ?>" />

        

        <label for="message">Message (obligatoire):</label>

        <textarea name="message" id="message" cols="40" rows="5"><?php

        if (isset($_POST["message"])) {

// le message a été saisi: le réafficher

                echo htmlspecialchars($_POST["message"],ENT_QUOTES);

        }

        ?></textarea>

        

        

        

        </form>

<?php

}

else {

// le formulaire a été soumis sans erreur, on envoie le mail

        $entete = "From: ".$_POST["email_expediteur"]." <".$_POST["email_expediteur"].">n";

        $entete .= "MIME-Version: 1.0";

        if (@mail($email_webmaster,$_POST["nom"],$_POST["titre"],$_POST["message"],$entete)){

// mail envoyé

                echo "Votre message a bien été envoyé. Nous vous répondrons dès que possible.

n";

                echo "Retour à la page précédente...n";

        }

        else {

// erreur lors de l'envoi du mail

                echo "Un problème s'est produit lors de l'envoi du message

n";

                echo "PHP_SELF"]."">Merci de réessayez...n";

        }

}

?>

</html>

*****************

C'est donc quand j'essaie de le mettre à "ma sauce" que ça se complique.


J'obtiens systématiquement des erreurs. Mais pourquoi ?

Je séche depuis 4 heures (je précise que je ne connais rien au PHP) et j'ai besoin d'un (petit ?) coup de main.


Dans un 1er temps (et c'est déjà là que je bloque) je cherche à
rajouter le nom de l'expéditeur qui n'existait pas dans le formulaire
de base et de le récupérer dans l'email qu'il va m'adresser.


J'ai donc mis ceci dans la 1ère partie :

******

if (isset($_POST["nom"])) {

                 $_POST["nom"]=trim(stripslashes($_POST["nom"]));

        }

et un peu plus bas dans cette partie toujours :

elseif (empty($_POST["nom"])) {

// il manque le nom de l'expéditeur

                 $erreur="Merci de donner votre nom.";

        }

Le contrôle semble bien s'effectuer.


Dans la partie html j'ai donc rajouter un champ de cette manière :

<label for="nom">Votre nom (obligatoire):</label>

        <?php

        if (!empty($_POST["nom"])) {

// le nom de l'expéditeur a été saisi: le réafficher

                echo htmlspecialchars($_POST["nom"],ENT_QUOTES);

        }

        ?>" />

        


Pas de souci encore : tout s'affiche bien.


Et c'est dans cette dernière ligne que les choses se gâtent.

J'ai rajouté

$_POST["nom"]

ainsi :

// le formulaire a été soumis sans erreur, on envoie le mail

        $entete = "From: ".$_POST["email_expediteur"]." <".$_POST["email_expediteur"].">n";

        $entete .= "MIME-Version: 1.0";

        if (@mail($email_webmaster,$_POST["nom"],$_POST["titre"],$_POST["message"],$entete)){

// mail envoyé


Dans ma petite tête j'étais certain que cela fonctionnerait, mais non !

À chaque fois ce que je récupère c'est le message d'erreur déclenché par le script :

<quote>

Un problème s'est produit lors de l'envoi du message</quote


Et je ne comprends pas du tout du tout. :(


Quelle erreur ai-je pu commettre ?

Merci d'avance pour vos réponses.

7 réponses

lesdis Messages postés 403 Date d'inscription mercredi 19 avril 2006 Statut Membre Dernière intervention 7 août 2020
15 févr. 2007 à 15:29
Bonjour,

Si j'ai bien compris, cela coince quand tu veux rajouter le nom dans le sujet du mail?

Pour info sur la fonction mail --> php.net

Je te conseille donc de modifier l'appel à la fonction mail de cette facon :

@mail($email_webmaster,$_POST["nom"]. " " .$_POST["titre"],$_POST["message"],$entete)

Le nom apparaitra normalement dans le sujet du message suivit d'un espace et du sujet du message.

Bonne prog
0
Sven78 Messages postés 5 Date d'inscription jeudi 15 février 2007 Statut Membre Dernière intervention 15 février 2007
15 févr. 2007 à 15:54
Merci beaucoup pour ta réponse si rapide lesdis.

Ce n'était pas dans le sujet mais dans le corps de l'email que je souhaitais récupérer le nom.
Effectivement je récupère un email comme tu l'as dis.
Merci aussi pour le lien de la page que j'ai épluché avec attention.
Malgré cela je ne comprends toujours pas pourquoi (alors que ce que tu indiques semble correspondre à ce que j'ai écris) ça ne marchait pas (peut être suis-je un peu fatigué).
Et je n'arrive pas à déplacer le nom dans le corps même du courriel.
PHP c'est pas évident au démarrage.
0
lesdis Messages postés 403 Date d'inscription mercredi 19 avril 2006 Statut Membre Dernière intervention 7 août 2020
15 févr. 2007 à 16:17
Peux tu nous donner le passage que tu as réécris et qui n'a pas l'air de fonctionner?

Tu peux aussi enlever le @ qui empêche l'envoi de message d'erreur et le IF, afin de récupérer l'erreur.

Voici le code que je ferais pour insérer le nom dans le corps du message:

$_POST["message"] = "message envoyer par : $_POST["nom"]\n" . $_POST["message"];
mail($email_webmaster,$_POST["titre"],$_POST["message"],$entete)

Plusieurs choses supplémentaires à savoir :
- Les lignes du messages ne peuvent comporter plus de 70 caractères.
- Lorsque l'on test la fonction mail sur un hébergeur, il faut utiliser une adresse mail de type : expediteur@domaine.tld, où expediteur peut prendre n'importe quel valeur.
- Lorsque l'on test la fonction mail en local, il faut utiliser une adresse mail de notre fournisseur d'accès !
- Certains hébergeur (ex: online.net) ont désactiver la fonction mail pour la remplacer par une autre (combattons le spam !)
- Bien vérifier le dossier spam de la boîte au lettre de réception, les messages automatiques y sont souvent redirigés.
0
Sven78 Messages postés 5 Date d'inscription jeudi 15 février 2007 Statut Membre Dernière intervention 15 février 2007
15 févr. 2007 à 16:45
- Ce que j'avais écris ?
*****
if (@mail($email_webmaster,$_POST["nom"],$_POST["titre"],$_POST["message"],$entete)
***
et j'ai beau chercher : je ne vois pas la différence avec ce que tu avais écris la 1ère fois.

- j'ai inséré ton code mais j'obtiens cette fois-ci une erreur d'interprétation :
*****
Parse error: parse error, unexpected '"', expecting T_STRING or T_VARIABLE or T_NUM_STRING in /homepages/18/d192307286/htdocs/webmasterform.php on line 131
****
Il devait bien se substituer au code ci-dessus ?

- j'ai pris note de ce qu tu as précisé aussi : ce n'était pas inutile car j'ignorais 2 points que tu cites.

Merci encore de te pencher sur mon "cas".
J'espère ne pas être trop "boulet". ;)
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
lesdis Messages postés 403 Date d'inscription mercredi 19 avril 2006 Statut Membre Dernière intervention 7 août 2020
15 févr. 2007 à 17:10
>>

- Ce que j'avais écris ?
*****
if (@mail($email_webmaster,$_POST["nom"],$_POST["titre"],$_POST["message"],$entete)
***
et j'ai beau chercher : je ne vois pas la différence avec ce que tu avais écris la 1ère fois.

la fonction mail accepte 3 arguments obligatoires + 2 falcutatifs.
Dans l'ordre, il faut renseigner l'email du destinataire, le sujet du message, le corps du message, les entetes, les paramètres additionnels. Chaque arguments doit être séparés d'une virgule.

Dans ton exemple,
$email_webmaster = email du destinataire
$_POST['nom'] = sujet du message
$_POST['titre'] = corps du message
$_POST['message'] = entetes
$entete = parametre additionnels

Si l'on veut concaténée des chaines en php il faut utiliser le point, voici la différence avec ma premiere proposition :
@mail($email_webmaster,$_POST["nom"] . " " . $_POST["titre"],$_POST["message"],$entete)

Ici,
$email_webmaster = email du destinataire

$_POST['nom'] . " " . 
$_POST['titre'] = sujet du message
$_POST['message'] = corps du message

$entete = entetes

-----------------------------------------------------------------------------------------------------------------------

Par rapport à ton erreur de parse, je m'apercoit que j'ai fait une boulette...
Je te propose cette solution :

$_POST["message"] = "message envoyé par :" . $_POST["nom"] . "\n" . $_POST["message"];
mail($email_webmaster,$_POST["titre"],$_POST["message"],$entete);

En espérant que cela fonctionne
0
Sven78 Messages postés 5 Date d'inscription jeudi 15 février 2007 Statut Membre Dernière intervention 15 février 2007
15 févr. 2007 à 17:34
(tu m'excuseras mais je n'arrive pas à utiliser l'éditeur avancé : mon post ne sera pas beau)

- tu dis :
Dans ton exemple,
$email_webmaster = email du destinataire
$_POST['nom'] = sujet du message
$_POST['titre'] = corps du message
$_POST['message'] = entetes
$entete = parametre additionnels

non ce n'est pas ça :
- nom c'est le nom de la personne qui remplit le formulaire (idéalement il devrait aller dans le corps)
- titre c'est le sujet
- message c'est le message déposé qui va se retrouver dans le corps

Après avoir lu, je cite :
"Dans l'ordre, il faut renseigner l'email du destinataire, le sujet du message, le corps du message, les entetes, les paramètres additionnels. Chaque arguments doit être séparés d'une virgule."
Je ne peux donc pas récupérer le nom du visiteur figurant dans le champ "nom" ?
Ou bien alors je dois aller le mettre ailleurs.
0
Sven78 Messages postés 5 Date d'inscription jeudi 15 février 2007 Statut Membre Dernière intervention 15 février 2007
15 févr. 2007 à 17:48
"Par rapport à ton erreur de parse, je m'apercoit que j'ai fait une boulette...
Je te propose cette solution :

$_POST["message"] = "message envoyé par :" . $_POST["nom"] . "\n" . $_POST["message"];
mail($email_webmaster,$_POST["titre"],$_POST["message"],$entete);

En espérant que cela fonctionne"

:( ben nan : c'est toujours la même erreur qui surgit)
0
Rejoignez-nous