pb avec un formulaire de contact en php

Répondre
dadamuse
le 09/07/2008 à 16:05
dadamuse
Bonjour,
j'ai récupéré un form php de contact auquel j'ai voulu ajouter 3 champs et là patatra !

Mon formulaire apparaît correctement, et quand je valide, j'ai cette erreur :

Warning: mail() expects at most 5 parameters, 7 given in /../../../../../assembler.php(402) : eval()'d code on line 63




voici le formulaire d'origine :

<?php
define( 'MAIL_TO', /* >>>>> */'utilisateur@domaine.tld'/* <<<<< */ ); //ajouter votre courriel
define( 'MAIL_FROM', 'utilisateur@domaine.tld' ); // valeur par défaut
define( 'MAIL_OBJECT', 'objet du message' ); // valeur par défaut
define( 'MAIL_MESSAGE', 'votre message' ); // valeur par défaut

$mailSent = false; // drapeau qui aiguille l'affichage du formulaire OU du récapitulatif
$errors = array(); // tableau des erreurs de saisie

if( filter_has_var( INPUT_POST, 'send' ) ) // le formulaire a été soumis avec le bouton [Envoyer]
{
$from = filter_input( INPUT_POST, 'from', FILTER_VALIDATE_EMAIL );
if( $from === NULL || $from === MAIL_FROM ) // si le courriel fourni est vide OU égale à la valeur par défaut
{
$errors[] = 'Vous devez renseigner votre adresse de courrier &eacute;lectronique.';
}
elseif( $from === false ) // si le courriel fourni n'est pas valide
{
$errors[] = 'L\'adresse de courrier &eacute;lectronique n\'est pas valide.';
$from = filter_input( INPUT_POST, 'from', FILTER_SANITIZE_EMAIL );
}

$object = filter_input( INPUT_POST, 'object', FILTER_SANITIZE_STRING, FILTER_FLAG_ENCODE_HIGH | FILTER_FLAG_ENCODE_LOW );
if( $object === NULL OR $object === false OR empty( $object ) OR $object === MAIL_OBJECT ) // si l'objet fourni est vide, invalide ou égale à la valeur par défaut
{
$errors[] = 'Vous devez renseigner l\'objet.';
}

/* pas besoin de nettoyer le message.
/ http://www.phpsecure.info/v2/article/MailHeadersInject.php
/ Logiquement, les parties message, To: et Subject: pourraient servir aussi à injecter quelque chose, mais la fonction mail()
/ filtre bien les deux dernières, et la première est le message, et à partir du moment où on a sauté une ligne dans l'envoi du mail,
/ c'est considéré comme du texte; le message ne saurait donc rester qu'un message.*/
$message = filter_input( INPUT_POST, 'message', FILTER_UNSAFE_RAW );
if( $message === NULL OR $message === false OR empty( $message ) OR $message === MAIL_MESSAGE ) // si le message fourni est vide ou égale à la valeur par défaut
{
$errors[] = 'Vous devez &eacute;crire un message.';
}

if( count( $errors ) === 0 ) // si il n'y a pas d'erreurs
{
if( mail( MAIL_TO, $object, $message, "From: $from\nReply-to: $from\n" ) ) // tentative d'envoi du message
{
$mailSent = true;
}
else // échec de l'envoi
{
$errors[] = 'Votre message n\'a pas &eacute;t&eacute; envoy&eacute;.';
}
}
}
else // le formulaire est affiché pour la première fois, avec les valeurs par défaut
{
$from = MAIL_FROM;
$object = MAIL_OBJECT;
$message = MAIL_MESSAGE;
}
?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html lang="fr" xmlns="http://www.w3.org/1999/xhtml" xml:lang="fr">
<head>
<title>Contact</title>
<meta http-equiv="content-type" content="text/html; charset=ISO-8859-1" />
<meta http-equiv="content-language" content="fr" />
<style type="text/css">
html{ font-family:Geneva, Arial, Helvetica, sans-serif; margin:0; padding:0; font-size:.88em;}
body{ width:772px; margin:0 auto; padding:0; }
textarea{ width:772px; }
label{ display:block; font-weight:bold; }
p#welcome{ padding:10px 20px; border:1px dotted #00f; color:#00f; font-weight:bold; }
ul{ padding:10px 20px; border:1px dotted #f00; color:#f00; font-weight:bold; }

p#success{ padding:10px 20px; border:1px dotted #0f0; color:#0f0; font-weight:bold; }
p em{ display:block; font-weight:normal; }
</style>
</head>
<body>
<h1>Contact</h1>
<hr />
<?php
if( $mailSent === true ) // si le message a bien été envoyé, on affiche le récapitulatif
{
?>
<p id="success">Votre message a bien &eacute;t&eacute; envoy&eacute;.</p>
<p><strong>Courriel pour la r&eacute;ponse&nbsp;:</strong><br /><?php echo( $from ); ?></p>
<p><strong>Objet&nbsp;:</strong><br /><?php echo( $object ); ?></p>
<p><strong>Message&nbsp;:</strong><br /><?php echo( nl2br( htmlspecialchars( $message ) ) ); ?></p>
<?php
}
else // le formulaire est affiché pour la première fois ou le formulaire a été soumis mais contenait des erreurs
{
if( count( $errors ) !== 0 )
{
echo( "\t\t<ul>\n" );
foreach( $errors as $error )
{
echo( "\t\t\t<li>$error</li>\n" );
}
echo( "\t\t</ul>\n" );
}
else
{
echo( "\t\t<p id=\"welcome\"><em>Tous les champs sont obligatoires</em></p>\n" );
}
?>
<form id='contact' method="post" action="<?php echo( $_SERVER['REQUEST_URI'] ); ?>">
<p>
<label for="from">Courriel pour la r&eacute;ponse</label>
<input type="text" name="from" id="from" value="<?php echo( $from ); ?>" />
</p>
<p>
<label for="object">Objet</label>
<input type="text" name="object" id="object" value="<?php echo( $object ); ?>" />
</p>
<p>
<label for="message">Message</label>
<textarea name="message" id="message" rows="20" cols="80"><?php echo( $message ); ?></textarea>
</p>
<p>
<input type="reset" name="reset" value="Effacer" />
<input type="submit" name="send" value="Envoyer" />
</p>
</form>
<?php
}
?>
</body>
</html>


voici ce que j'ai fais pour rajouter les champs $tel, $postal et *nom :

<?php
define( 'MAIL_TO', 'monmail@monmail.com' ); //ajouter votre courriel
define( 'MAIL_FROM', '' ); // valeur par défaut
define( 'MAIL_OBJECT', 'Indiquez le sujet' ); // valeur par défaut
define( 'MAIL_MESSAGE', '' );
define( 'MAIL_TEL' , '');
define( 'MAIL_POSTAL', '' );
define( 'MAIL_NOM', '' );

$mailSent = false; // drapeau qui aiguille l'affichage du formulaire OU du récapitulatif
$errors = array(); // tableau des erreurs de saisie

if( filter_has_var( INPUT_POST, 'send' ) ) // le formulaire a été soumis avec le bouton [Envoyer]
{
$from = filter_input( INPUT_POST, 'from', FILTER_VALIDATE_EMAIL );
if( $from === NULL || $from === MAIL_FROM ) // si le courriel fourni est vide OU égale à la valeur par défaut
{
$errors[] = 'Vous devez renseigner votre adresse de courrier &eacute;lectronique.';
}
elseif( $from === false ) // si le courriel fourni n'est pas valide
{
$errors[] = 'L\'adresse de courrier &eacute;lectronique n\'est pas valide.';
$from = filter_input( INPUT_POST, 'from', FILTER_SANITIZE_EMAIL );
}

//le sujet du message
$sujet = filter_input( INPUT_POST, 'sujet', FILTER_SANITIZE_STRING, FILTER_FLAG_ENCODE_HIGH | FILTER_FLAG_ENCODE_LOW );
if( $sujet === NULL OR $sujet === false OR empty( $sujet ) OR $sujet === MAIL_OBJECT ) // si l'objet fourni est vide, invalide ou égale à la valeur par défaut
{
$errors[] = 'Vous devez renseigner l\'objet.';
}
//le telephone
$tel = filter_input( INPUT_POST, 'tel', FILTER_UNSAFE_RAW );
if( $tel === NULL OR $tel === false OR empty( $tel ) OR $tel === MAIL_TEL )
{
$errors[] = 'Vous devez indiquer votre t&eacute;l&eacute;phone.';
}

// le nom
$nom = filter_input( INPUT_POST, 'nom', FILTER_UNSAFE_RAW );
if( $nom === NULL OR $nom === false OR empty( $nom ) OR $nom === MAIL_NOM )
{
$errors[] = 'Vous devez indiquer votre nom.';
}

//le code postal
$postal = filter_input( INPUT_POST, 'postal', FILTER_UNSAFE_RAW );
if( $postal === NULL OR $postal === false OR empty( $postal ) OR $postal === MAIL_POSTAL )
{
$errors[] = 'Vous devez indiquer votre code postal.';
}

$message = filter_input( INPUT_POST, 'message', FILTER_UNSAFE_RAW );
if( $message === NULL OR $message === false OR empty( $message ) OR $message === MAIL_MESSAGE ) // si le message fourni est vide ou égale à la valeur par défaut
{
$errors[] = 'Vous devez &eacute;crire un message.';
}


if( count( $errors ) === 0 ) // si il n'y a pas d'erreurs
{
if( mail( MAIL_TO, $sujet, $nom, $tel, $postal, $message, "From: $from\nReply-to: $from\n" ) ) // tentative d'envoi du message
{
$mailSent = true;
}
else // échec de l'envoi
{
$errors[] = 'Votre message n\'a pas &eacute;t&eacute; envoy&eacute;.';
}
}
}
else // le formulaire est affiché pour la première fois, avec les valeurs par défaut
{
$from = MAIL_FROM;
$sujet = MAIL_OBJECT;
$nom = MAIL_NOM;
$tel = MAIL_TEL;
$postal = MAIL_POSTAL;
$message = MAIL_MESSAGE;
}
?>

<style type="text/css">
label{ display:block; font-weight:bold; }
p#welcome{ padding:10px 20px; border:1px dotted #00f; color:#00f; font-weight:bold; }
p#success{ padding:10px 20px; border:1px dotted #0f0; color:#0f0; font-weight:bold; }
p em{ display:block; font-weight:normal; }
</style>

<h1>Contact particuliers </h1>
<hr />
<?php
if( $mailSent === true ) // si le message a bien été envoyé, on affiche le récapitulatif
{
?>
<p id="success">Votre message a bien &eacute;t&eacute; envoy&eacute;.</p>
<p><strong>Courriel pour la r&eacute;ponse&nbsp; :</strong><br /><?php echo( $from ); ?></p>
<p><strong>Votre demande :</strong><br /><?php echo( $sujet ); ?></p>
<p><strong>Votre nom :</strong><br /><?php echo( $nom ); ?></p>
<p><strong>Votre num&eacute;ro de t&eacute;l&eacute;phone :</strong><br /><?php echo( $tel ); ?></p>
<p><strong>Votre code postal :</strong><br /><?php echo( $postal ); ?></p>
<p><strong>Message&nbsp;:</strong><br /><?php echo( nl2br( htmlspecialchars( $message ) ) ); ?></p>
<?php
}
else // le formulaire est affiché pour la première fois ou le formulaire a été soumis mais contenait des erreurs
{
if( count( $errors ) !== 0 )
{
echo( "\t\t<ul>\n" );
foreach( $errors as $error )
{
echo( "\t\t\t<li>$error</li>\n" );
}
echo( "\t\t</ul>\n" );
}
else
{
echo( "\t\t<p id=\"welcome\"><em>Tous les champs sont obligatoires</em></p>\n" );
}
?>
<form id='contact' method="post" action="<?php echo( $_SERVER['REQUEST_URI'] ); ?>">
<table width="550" border="0" align="center" cellpadding="5" cellspacing="5">
<tr>
<td width="177" valign="top"><label for="sujet">Votre demande </label></td>
<td width="338"><input name="sujet" type="text" id="sujet" value="<?php echo( $sujet ); ?>" size="40" /></td>
</tr>
<tr>
<td valign="top"><label for="nom">Votre nom </label></td>
<td><input name="nom" type="text" id="nom" value="<?php echo( $nom ); ?>" size="40" /></td>
</tr>
<tr>
<td valign="top"><label for="from">Votre t&eacute;l&eacute;phone </label></td>
<td><input name="tel" type="text" id="tel" value="<?php echo( $tel ); ?>" size="40" /></td>
</tr>
<tr>
<td valign="top"><label for="from">Votre code postal </label></td>
<td><input name="postal" type="text" id="postal" value="<?php echo( $postal ); ?>" size="40" /></td>
</tr>
<tr>
<td valign="top"><label for="from">Votre email * </label></td>
<td><input name="from" type="text" id="from" value="<?php echo( $from ); ?>" size="40" /></td>
</tr>
<tr>
<td valign="top"><label for="from">Votre message </label></td>
<td><textarea name="message" id="message" cols="40" rows="6"><?php echo( $message ); ?></textarea></td>
</tr>
<tr>
<td valign="top">&nbsp;</td>
<td><input type="submit" name="send" value="Envoyer" /></td>
</tr>
<tr>
<td colspan="2" valign="top">
<p>* Veuillez entrer une adresse e-mail valide (de type vous@fournisseur.com).</p>
<p><small>Conformément à la loi Informatique et Libertés, vous disposez d’un droit d’accès et de rectification et de suppression des données vous concernant (art. 34 de la loi "Informatique et libertés"). SARL.</small></p>
</td>
</tr>
<tr>
<td valign="top">&nbsp;</td>
<td>&nbsp;</td>
</tr>
</table>
</form>
<?php
}
?>


merci pour votre aide :)

Titi
Keika
le 09/07/2008 à 17:28
Keika
Salut

Va voir ce que fait et comment utiliser la fonction mail() sur la doc PHP, tu remmarqueras qu'effectivement seulement 5 parametres sont attendus au maximum. Tu en as mis 7. a la ligne 63 du second code que tu affiches, la est ton problemes. Je pense que tu veux passer le telephone et autres dans ton message, pour faire ca, rajoute ces valeurs dans le message au niveau des define. mais je vois que tu n'inseres rien dans ces valeurs, donc meme si tu envois un mail, il sera vide.

Bon courage
Le PHP --> C'est dur !
dadamuse
le 10/07/2008 à 09:48
dadamuse
Merci pour la réponse, j'avais bien "compris" que c'etait un pb de nombre mais comme je débute en php, je ne comprenais pas trop quoi ... :(

mais dans ce cas, comment on fait quand on a un devis par exemple avec 10 champs et que l'on souhaite recevoir par mail les 10 champs ???

merci!
dadamuse
le 11/07/2008 à 08:32
dadamuse
merci mais concretement que dois-je faire ? garder les 5 ou 4 parametres de base et envoyer les autres paramatres ailleurs dans une variable ???

j’ai essayé cela , ya pas de bug mais ca renvoit pas la variable $m1
if( count( $errors ) === 0 ) // si il n'y a pas d'erreurs
{
if( mail( MAIL_TO, $sujet, $m1, "From: $from\nReply-to: $from\n" ) ) // tentative d'envoi du message
{
$mailSent = true;
$m1="Bonjour $noms, voici votre téléphone : $tel et votre code postal : $postal.
Votre message : $message.";
}
else // échec de l'envoi


je débute ... smiley
Keika
le 11/07/2008 à 10:29
Keika
Tu fais la meme erreur qu'un autre post avant toi. Tu utilises ta variable avant de la declarer.

Comprends, $m1 est utilisee avant que des infos soient entrees dedans. Donc il y a un probleme, non ?
Le PHP --> C'est dur !
dadamuse
le 11/07/2008 à 13:06
dadamuse
et comment dois-je déclarer cette variable ?
(j'avoue que j'ai essayé pas mal de choses mais je crois que je n'ai pas encore la logique php)

ce que j’ai réussi le plus :

<?php
define( 'MAIL_TO', 'py@mezonet.com' ); //ajouter votre courriel
define( 'MAIL_FROM', '' ); // valeur par défaut
define( 'MAIL_OBJECT', 'Indiquez le sujet' ); // valeur par défaut
define( 'MAIL_MESSAGE', '' );
define( 'MAIL_TEL' , '');
define( 'MAIL_POSTAL', '' );
define( 'MAIL_NOM', '' );

$mailSent = false; // drapeau qui aiguille l'affichage du formulaire OU du récapitulatif
$m1='$noms, $tel et $postal. $message.';
$errors = array(); // tableau des erreurs de saisie

et ce que je recois dans mon mail :
$noms, $tel et $postal. $message.


j’y suis presque ! …
dadamuse
le 11/07/2008 à 13:26
dadamuse
$mailSent = false; // drapeau qui aiguille l'affichage du formulaire OU du récapitulatif
$nom = $_POST["nom"];
$tel= $_POST["tel"];
$postal= $_POST["postal"];
$message= $_POST["message"];
$m1="Bonjour $noms, votre email nous a bien été envoyé. Une réponse vous sera retournée au plus vite.

Pour rappel, voici les informations envoyées :
Votre nom : $nom
Votre téléphone : $tel
Votre code postal : $postal
Votre message : $message
A bientôt ! ";


ca y est enfin ! smiley

Par contre maintenant, je comprends que le script est incomplet : cad que ici :
if( mail( MAIL_TO, $sujet, $m1, "From: $from\nReply-to: $from\n" ) ) // tentative d'envoi du message


l'internaute recoit bien un mail de confirmation comme je l'ai souhaitémais que l'admin 'MAIL_TO' recoit un mail vide ...
Répondre

Ecrire un message

Votre message vient d'être créé avec succès.
LoadingChargement en cours