redirection vers page accueil après envoi formulaire mail

Joho
Invité n'ayant pas de compte PHPfrance

01 mars 2013, 01:01

Bonjour à tous,
Je sèche depuis plusieurs jours sur un petit soucis...

J'ai mis en place un formulaire pour la fonction mail, mais le code étant sur la même page, il revient sur lui même, et après l'envoi du mail, ne se redirige pas automatiquement vers la page d'accueil (mon site n'a que deux pages, index.php et contact.php).

Voici mon code :

Code : Tout sélectionner

<?php /* ******************************************************************************************** CONFIGURATION ******************************************************************************************** */ // destinataire est votre adresse mail. Pour envoyer à plusieurs à la fois, séparez-les par une virgule $destinataire = '[email protected]'; // copie ? (envoie une copie au visiteur) $copie = 'non'; // Action du formulaire (si votre page a des paramètres dans l'URL) // si cette page est index.php?page=contact alors mettez index.php?page=contact // sinon, laissez vide $form_action = ''; // Messages de confirmation du mail $message_envoye = "Votre message nous est bien parvenu ! <a href=\"/\">Retour &agrave; la page principale</a>"; $message_non_envoye = "<br /> <br />L'envoi du mail a échoué, veuillez réessayer SVP."; // Message d'erreur du formulaire $message_formulaire_invalide = "<br /> <br />Vérifiez que tous les champs soient bien remplis et que l'email soit sans erreur."; /* ******************************************************************************************** FIN DE LA CONFIGURATION ******************************************************************************************** */ /* * cette fonction sert à nettoyer et enregistrer un texte */ function Rec($text) { $text = htmlspecialchars(trim($text), ENT_QUOTES); if (1 === get_magic_quotes_gpc()) { $text = stripslashes($text); } $text = nl2br($text); return $text; }; /* * Cette fonction sert à vérifier la syntaxe d'un email */ function IsEmail($email) { $value = preg_match('/^(?:[\w\!\#\$\%\&\'\*\+\-\/\=\?\^\`\{\|\}\~]+\.)*[\w\!\#\$\%\&\'\*\+\-\/\=\?\^\`\{\|\}\~]+@(?:(?:(?:[a-zA-Z0-9_](?:[a-zA-Z0-9_\-](?!\.)){0,61}[a-zA-Z0-9_-]?\.)+[a-zA-Z0-9_](?:[a-zA-Z0-9_\-](?!$)){0,61}[a-zA-Z0-9_]?)|(?:\[(?:(?:[01]?\d{1,2}|2[0-4]\d|25[0-5])\.){3}(?:[01]?\d{1,2}|2[0-4]\d|25[0-5])\]))$/', $email); return (($value === 0) || ($value === false)) ? false : true; } // formulaire envoyé, on récupère tous les champs. $nom = (isset($_POST['nom'])) ? Rec($_POST['nom']) : ''; $email = (isset($_POST['email'])) ? Rec($_POST['email']) : ''; $objet = "Contact depuis xxxxxxxxxxxxx.fr"; $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é $err_formulaire = false; // sert pour remplir le formulaire en cas d'erreur si besoin if (isset($_POST['envoi'])) { if (($nom != '') && ($email != '') && ($objet != '') && ($message != '')) { // les 4 variables sont remplies, on génère puis envoie le mail $headers = 'From:'.$nom.' <'.$email.'>' . "\r\n"; //$headers .= 'Reply-To: '.$email. "\r\n" ; //$headers .= 'X-Mailer:PHP/'.phpversion(); // envoyer une copie au visiteur ? if ($copie == 'oui') { $cible = $destinataire.','.$email; } else { $cible = $destinataire; }; // Remplacement de certains caractères spéciaux $message = str_replace("'","'",$message); $message = str_replace("&#8217;","'",$message); $message = str_replace(""",'"',$message); $message = str_replace('<br>','',$message); $message = str_replace('<br />','',$message); $message = str_replace("<","<",$message); $message = str_replace(">",">",$message); $message = str_replace("&","&",$message); // Envoi du mail if (mail($cible, $objet, $message, $headers)) { header("location:index.php"); } else { echo '<p>'.$message_non_envoye.'</p>'; }; } else { // une des variables est vide ... echo '<p>'.$message_formulaire_invalide.'</p>'; $err_formulaire = true; }; }; // fin du if (!isset($_POST['envoi'])) if (($err_formulaire) || (!isset($_POST['envoi']))) { // afficher le formulaire echo ' <form id="contact" method="post" action="'.$form_action.'"> <fieldset><legend>Formulaire de contact</legend> <p class="left"><label for="nom">Nom </label><input type="text" id="nom" name="nom" value="'.stripslashes($nom).'" tabindex="1" /></p> <p class="left"><label for="email">Email </label><input type="text" id="email" name="email" value="'.stripslashes($email).'" tabindex="2" /></p> <p class="left"><label for="message">Message :</label><textarea id="message" name="message" tabindex="4" cols="30" rows="8">'.stripslashes($message).'</textarea></p> </fieldset> <div style="text-align:center;"><input type="submit" name="envoi" value="Envoyer le formulaire !" /></div> </form>'; }; ?>
J'ai mis un header location vers la fin du code, mais le navigateur me renvoi ceci :
Warning: Cannot modify header information - headers already sent by (output started at /mnt/171/sda/1/d/monsite/contact.php:4) in /mnt/171/sda/1/d/monsite/contact.php on line 119

Merci de votre aide

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

01 mars 2013, 09:50

Salut,

Le message est logique : pourquoi faire une redirection serveur alors que tu as affiché quelque chose ?
Le message indique que la redirection utilise l'entête et qu'elle a déjà était envoyé. C'est le cas elle est envoyée des que l'on affiche quelque chose (même un espace ou une ligne vide). Ce problème est vrai des que tu utilise la fonction header.

Si tu souhaite faire la même chose qu'ici quand tu as posté un message oriente toi vers du Javascript.
C'est très simple et fait globalement la même chose.

Le script JS redirige la page (document.location.href) après un certain temps (set_timeout).
Je te laisse cherche un peu sur Google pour le reste ;) (regarder le source du forum quand tu poste un message XD ).

Ton lien de retour ne peu pas fonctionne il faut que tu indique la page index.php dans le href ;)

@+
Il en faut peu pour être heureux ......

Joho
Invité n'ayant pas de compte PHPfrance

01 mars 2013, 10:51

Bonjour et merci de ta réponse.

Voilà donc les modifs que j'ai faite :

Code : Tout sélectionner

// Envoi du mail if (mail($cible, $objet, $message, $headers)) { echo '<p>'.$message_envoye.'</p>';
et
// Messages de confirmation du mail

Code : Tout sélectionner

$message_envoye = "Votre email a bien &eacute;t&eacute; envoy&eacute;. Merci. Vous allez &ecirc;tre redirig&eacute; vers la page principale automatiquement. <script language=\"JavaScript\">setTimeout('window.location=\"index.php\"',2000);></script><noscript><a href=\"index.php\">Cliquez ici pour retourner à la page principale.</a></noscript>";
mais ça ne fonctionne pas...

Voici ce qu'affiche la page :
Votre email a bien été envoyé. Merci. Vous allez être redirigé vers la page principale automatiquement.

et le code source :

Code : Tout sélectionner

<p>Votre email a bien &eacute;t&eacute; envoy&eacute;. Merci. Vous allez &ecirc;tre redirig&eacute; vers la page principale automatiquement. <script language="JavaScript">setTimeout('window.location="index.php"',2000);></script><noscript><a href="index.php">Cliquez ici pour retourner à la page principale.</a></noscript></p>
Qu'est-ce qui ne va pas ?
Merci.

Petit nouveau ! | 1 Messages

01 mars 2013, 14:29

Je ne poste peut etre pas dans la bonne rubrique remarque...
De plus la fonction mail chez Free semble très capricieuse et ne fonctionne pas tout le temps, je pense que je vais abdiquer l'idée...
Merci encore.

solate
Invité n'ayant pas de compte PHPfrance

10 oct. 2015, 13:13

enlève juste les balises "noscript" et ça marche :
<p>Votre email a bien &eacute;t&eacute; envoy&eacute;. Merci. Vous allez &ecirc;tre redirig&eacute; vers la page principale automatiquement.
<script language="JavaScript">setTimeout(location="index.html",500);></script>
<a href="index.html">Cliquez ici pour retourner à la page principale.</a></p>

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

12 oct. 2015, 11:26

Au lieu d'une redirection en javascript, il peut être préférable d'utiliser la balise meta refresh dans le header de ta page

Redirection vers index.php après 2 secondes :
<meta http-equiv="refresh" content="2; url=index.php">
Ce n'est pas en améliorant la bougie que l'on a inventé l'ampoule...