Erreur variable mail()

claire51
Invité n'ayant pas de compte PHPfrance

09 nov. 2013, 16:37

Bonjour à tous,

Je suis chargée de faire le site internet de ma promo et jusque là tout va bien. Seul hic, c'est que je ne connais que très peu le PHP et pour faire mon formulaire de contact, j'en ai bien besoin!
Alors j'ai bidouillé un peu, en regardant à droite à gauche sur internet mais malheureusement, je coince toujours et je suis incapable de voir où donc c'est pour ça que je demande votre aide.
L'erreur qui ressort lors de l'envoi de mon formulaire et une erreur au niveau de la fonction mail(): Warning: mail() expects parameter 1 to be string, array given.
L'idée de mon formulaire est de pouvoir sélectionner un ou plusieurs contact et d'envoyer le mail à ces contacts sélectionnés.
Voici donc mon code HTML pour le formulaire puis le code PHP.
<div id="form">
        <form id="contact_form" name="form_contact" method="post" action="traitement.php"> 
		<fieldset><legend>Vos coordonnées</legend>
            <p><label for="nom">Nom:</label> </p> 
            <p><input type="text" id="nom" name="nom" placeholder="nom" required tabindex="1"/></p>
            
            <p><label for="nom">Prénom:</label> </p> 
            <p><input type="text" id="prenom" name="prenom" placeholder="prenom" required tabindex="2"/></p>
            
            <p><label for="email">Votre email:</label></p> 
            <p><input type="text" id="email" name="email" placeholder="[email protected]" required tabindex="3"/> </p>
            
            <p><label for="destinataire">Destinataire :</label></p>
            <p> <select multiple name="destinataire" id="destinataire" size="6">
    			<option value="claire">Claire</option>
    			<option value="mathieu">Mathieu</option>
 				</select></p>
            </fieldset>
            
            <fieldset><legend>Votre message :</legend>
            <p><label for="objet">Objet:</label></p> 
            <p><input type="text" id="objet" name="objet" placeholder="L'objet de votre mail" required tabindex="5" /> </p>
            
            <p><label for="message">Votre message:</label></p> 
            <p><textarea name="message" id="message" tabindex="6" placeholder="Votre mail"> </textarea> </p>
            
            <p><input type="submit" id="envoi" name="envoi" tabindex="7" value=""/></p>
        	</fieldset>
        </form>
    </div>
<?php

	$destinataire = array(
                    'claire'  => '[email protected]',
                    'mathieu'  => '[email protected]',
                );
	$cible = $destinataire;
 
	$copie = 'non'; // 'oui' ou 'non'
	
	$message_envoye = "<div class='msg'> Votre message nous est bien parvenu . Nous y répondrons dans les plus brefs délais. Pour retourner au site cliquez <a href='monsite/contact'>ici</a></div>";
	$message_non_envoye = "<div class='msg'>L'envoi du mail a échoué, veuillez réessayer s'il vous plait ou utiliser une méthode traditionnelle.</div>";
	
	$message_erreur_formulaire = "<div class='msg'>Vous devez d'abord <a href='monsite/contact'>envoyer le formulaire</a>.</div>";
	$message_formulaire_invalide = "<div class='msg'>Vérifiez que tous les champs soient bien remplis et que l'email soit sans erreur.</div>";
 
 
		// on teste si le formulaire a été soumis
	if (!isset($_POST['envoi']))
	{
		// formulaire non envoyé
		echo '<p>'.$message_erreur_formulaire.'</p>'."\n";
	}
	else
	{
		// formulaire envoyé, on récupère tous les champs.
		$nom     = (isset($_POST['nom']))     ? Rec($_POST['nom'])     : '';
		$prenom     = (isset($_POST['prenom']))     ? Rec($_POST['prenom'])     : '';
		$email   = (isset($_POST['email']))   ? Rec($_POST['email'])   : '';
		$objet   = (isset($_POST['objet']))   ? Rec($_POST['objet'])   : '';
		$message = (isset($_POST['message'])) ? Rec($_POST['message']) : '';
 
		// On va vérifier les variables et l'email ...
		$email = (IsEmail($email)) ? $email : ''; // soit l'email est vide si erroné, soit il vaut l'email entré
 
		if (($nom != '') && ($email != '') && ($objet != '') && ($message != '') && ($prenom != ''))
		{

			// Envoi du mail
			if (mail($cible,$objet,$message))
			{
				echo '<p>'.$message_envoye.'</p>'."\n";
			}
			else
			{
				echo '<p>'.$message_non_envoye.'</p>'."\n";
			}
		}
		else
		{
			// une des 4 variables (ou plus) est vide ...
			//echo htmlentities($objet);
			echo '<p>'.$message_formulaire_invalide.'<a href="...">Retour au formulaire</a></p>'."\n";
		}
	} // fin du if (!isset($_POST['envoi']))

	
	function Rec($text)
	{
		$text = trim($text); // supprime les espaces avant et après le texte
		if (1 === get_magic_quotes_gpc())
		{
			$stripslashes = create_function('$txt', 'return stripslashes($txt);');
		}
		else
		{
			$stripslashes = create_function('$txt', 'return $txt;');
		}

		// magic quotes ?
		$text = $stripslashes($text);
		$text = htmlspecialchars($text, ENT_QUOTES); // converts to string with " and ' as well
		$text = nl2br($text);
		return $text;
	}
	
function IsEmail($email) {
		return (preg_match('#^[a-z0-9._-]+@[a-z0-9._-]{2,}\.[a-z]{2,4}$#i',$email)) ? true : false;
	}
?>
Je vous remercie d'avance pour votre précieuse aide!

Claire
Modifié en dernier par moogli le 09 nov. 2013, 16:50, modifié 1 fois.
Raison : bbcode php & html

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 8758 Messages

09 nov. 2013, 17:10

salut,

le message est clair, le premier paramètre de la fonction mail doit être une chaîne de caractères (string) et toi tu passe un tableau.

ce qui est le cas car tu passe le tableau qui contient les destinataire que tu creer au début du script.

il te faut gérer le destinataire multiple.
soit en modifiant l'entête et en utilisant le bcc (par exemple) soit en envoyant plusieurs email ;)

exemple du second cas
<?php

$destinataire = array(
    'claire' => '[email protected]',
    'mathieu' => '[email protected]',
);
$subject = $message = '';
if (is_array($_POST['destinataire'])) {
    foreach ($_POST['destinataire'] as $cible) {
        if (array_key_exists($cible, $destinataire)) {
            mail($destinataire[$cible], $subject, $messsage);
        }
    }
}
@+
Il en faut peu pour être heureux ......

claire51
Invité n'ayant pas de compte PHPfrance

09 nov. 2013, 17:24

Merci pour te réponse rapide.
Malheureusement, comme je l'ai dis je n'ai vraiment aucune notion en PHP et l'apprentissage et relativement dur...
J'ai remplacé un bout de mon code avec celui que tu m'as donné mais j'ai toujours le même résultat... Faut-il que je vire ma fonction mail() qui est plus bas dans le code?

ViPHP
AB
ViPHP | 5818 Messages

09 nov. 2013, 19:01

Soit tu utilises le code de moogli soit le tiens, mais à priori il faut utiliser une seule fois la fonction mail().

Au passage il existe une fonction native php pour tester un mail plutôt que d'utiliser un regex. C'est à dire que ta fonction :
function IsEmail($email) {
                return (preg_match('#^[a-z0-9._-]+@[a-z0-9._-]{2,}\.[a-z]{2,4}$#i',$email)) ? true : false;
        }
pourrait être avantageusement remplacée par :
function IsEmail($email) {
                return (filter_var($email, FILTER_VALIDATE_EMAIL));
        }

claire51
Invité n'ayant pas de compte PHPfrance

09 nov. 2013, 19:48

Ok, merci pour ta réponse et pour la nouvelle fonction. Plus de message d'erreur donc bonne nouvelle! Mais pas de mail dans la boite de réception...