8796 sujets

Développement web côté serveur, CMS

Bonjour à tous et merci d'avance pour votre aide.

J'ai déjà lu et relu plusieurs source traitant du probléme.
Mais franchement c'est à s'arracher les cheuveux.

J'ai trois pages, index.php, contact.php et devis.php
Ces trois pages envoie parfaitement mes mail.
J'ai juste ce message "headers already sent by" qui s'affiche juste sur les page contact et devis juste aprés un envoie réussi du mail

Et pourtant c'est quasi le même code pour les trois pages.

Voici la partie PHP de la page contact


<?php
if (isset($_POST['send_message']))
{
    /* Récupération des valeurs des champs du formulaire */
    if (get_magic_quotes_gpc())
    {	
		$nom		= stripslashes(trim($_POST['NAME1']));
		$telephone	= stripslashes(trim($_POST['PHONE']));
		$expediteur	= stripslashes(trim($_POST['EMAIL']));
		$sujet2		= stripslashes(trim($_POST['SUBJECT']));
		$message	= stripslashes(trim($_POST['MESSAGE']));	  
    }
    else
    {
		$nom		= trim($_POST['NAME1']);
		$telephone	= trim($_POST['PHONE']);
		$expediteur	= trim($_POST['EMAIL']);
		$sujet2		= trim($_POST['SUBJECT']);
		$message	= trim($_POST['MESSAGE']);
    }

	$sujet = "Site M&amp;M CONTAINER - Message";
	$date = date("d/m/Y");
	$hour = date("H:i");

    /* Expression régulière permettant de vérifier si le 
    * format d'une adresse e-mail est correct */
    $regex_mail = '/^[-+.\w]{1,64}@[-.\w]{1,64}\.[-.\w]{2,6}$/i';
    
    /* Expression régulière permettant de vérifier qu'aucun 
    * en-tête n'est inséré dans nos champs */
    $regex_head = '/[\n\r]/';
    
    /* Si le formulaire n'est pas posté de notre site on renvoie 
    * vers la page d'accueil */
    if($_SERVER['HTTP_REFERER'] != 'http://www.mmcontainer.be/contact.php')
    {
	header('Location:  http://www.mmcontainer.be/contact.php');
 
	$alert = 'C pas la page';
	echo "<script>alert(\"".$alert."\");</script>"; 
 
    }
    /* On vérifie que tous les champs sont remplis */

    elseif (empty($nom)
			|| empty($sujet2) 
			|| empty($expediteur) 
			|| empty($message)
			|| empty($telephone))
    {
      $alert = 'Tous les champs doivent être complété.';
	  echo "<script>alert(\"".$alert."\");</script>"; 
    }
    /* On vérifie que le format de l'e-mail est correct */
    elseif (!preg_match($regex_mail, $expediteur))
    {
      $alert = 'L\'adresse '.$expediteur.' n\'est pas valide';
	  echo "<script>alert(\"".$alert."\");</script>"; 
    }
    /* On vérifie qu'il n'y a aucun header dans les champs */
     elseif (preg_match($regex_head, $nom) 
			|| preg_match($regex_head, $sujet2) 
            || preg_match($regex_head, $expediteur) 
            || preg_match($regex_head, $message)
			|| preg_match($regex_head, $telephone))
    {
        $alert = 'Erreur de donnée dans les champs du formulaire';
		echo "<script>alert(\"".$alert."\");</script>";
    }
    /* Si aucun problème et aucun cookie créé, on construit le message et on envoie l'e-mail */
    elseif (!isset($_COOKIE['sent']))
    {
        /* Destinataire (votre adresse e-mail) */
        $to = 'contact@mmcontainer.be';
      
        /* Construction du message */
       	$msg  = 'code html';      
        /* En-têtes de l'e-mail */
		$headers = "From: $expediteur\n";
		$headers .= "MIME-Version: 1.0\n";
		$headers .= "Reply-To: contact@mmcontainer.be\n";
		$headers .= "Content-Type: text/html; charset=iso-8859-1\n";
		$headers .= "X-abuse-contact: abuse@lws.fr";
		

        
        /* Envoi de l'e-mail */
        if (mail($to, $sujet, $msg, $headers))
        {
			$alert = 'Votre message à bien été envoyé.';
			echo "<script>alert(\"".$alert."\");</script>";
            
            /* On créé un cookie de courte durée (ici 120 secondes) pour éviter de 
            * renvoyer un mail en rafraichissant la page */
            setcookie("sent", "1", time() + 120);
            
            /* On détruit la variable $_POST */
            unset($_POST);
        }
        else
        {
		    $alert = 'Erreur, votre message n\'a pu être envoyé.';
			echo "<script>alert(\"".$alert."\");</script>";
        }
          
    }
    /* Cas où le cookie est créé et que la page est rafraichie, on détruit la variable $_POST */
    else
    {
        unset($_POST);
		$alert = 'Probléme surevenue lors de la procédure d\'envoie.';
		echo "<script>alert(\"".$alert."\");</script>";

    }
}
?>




Le liens vers la page contact.php
Page Contact

a écrit :
Warning: Cannot modify header information - headers already sent by (output started at /var/www/mmcontainer.be/htdocs/contact.php:107) in /var/www/mmcontainer.be/htdocs/contact.php on line 240

Merci encore.
Modifié par Rifton007 (22 Sep 2010 - 21:05)
Bonsoir,
C'est une erreur typique liée à la fonction header(). Elle apparait quand des données sont affichées avant l'appel à cette fonction.

Je n'ai pas regardé ton code en détail mais à tout les coup c'est ça. Smiley cligne
Merci de ta réponse.
Mais pourtant j'utilise le meme code et sur l'autre page il fonctionne.


Fonctionne (index.php)

/* En-têtes de l'e-mail */
$headers = "From: $guest_email\n";
$headers .= "MIME-Version: 1.0\n";
$headers .= "Reply-To: contact@mmcontainer.be\n";
$headers .= "Content-Type: text/html; charset=iso-8859-1\n";
$headers .= "X-abuse-contact: abuse@lws.fr";


Fonctionne pas (contact.php)

$headers = "From: $expediteur\n";
$headers .= "MIME-Version: 1.0\n";
$headers .= "Reply-To: contact@mmcontainer.be\n";
$headers .= "Content-Type: text/html; charset=iso-8859-1\n";
$headers .= "X-abuse-contact: abuse@lws.fr";


Elle sont identique comme tu peux le voir, alors pourquoi fonctionne-t-elle sur une page et pas sur l'autre.

Merci
Essaie en utilisant la tamporisation de sortie (avec les fonctions ob_) pour ton header Location. Si je me souviens bien, ça passe mieux de cette manière.
Salut,

la bufférisation va fonctionner mais dans ton cas ça ne semble pas nécessaire : il faut juste vérifier que tu n'as aucune sortie html avant les fonctions header. Si tu ne vois rien (aucun echo ou print typiquement) il peut s'agir d'un simple espace ou saut de ligne avant <?php ou encore d'un caractère BOM qui traîne.

Edit: en regardant mieux tu fais un echo avant setcookie (qui comme header et session_start par exemple) doit être utilisé avant toute sortie html. Smiley cligne
Modifié par Heyoan (23 Sep 2010 - 09:11)
Désolé pour ce retard, je viens seulement de rentrer de ma longue journée de cours.

Alors j'ai vérifier à l'aide du site Richard Ishida, j'ai aucun caractére BOM.
Ensuite j'ai mis sous commentaires tout mes echo.
Et le probléme a persisté.

J'ai donc commencer à chipoter dans tout les sens.
Et je suis arrivé à cela.


<div id="content_forpage">
<p>Professionnels ou particuliers, n'hésitez pas à nous contacter par téléphone ou par email. 
<br>Nous serons en mesure de répondre à vos attentes ou éventuelles questions, quelles qu'elles soient vos attentes.</p>
<h1><a name="1">Coordonées</a></h1>
<p>
M&M Container SPRL<br>
Rue des Ailes 38 - 1030 BRUXELLES<br>
BELGIQUE<br><br>
+32 0489/33 35 21<br>
+32 0485/95 90 59<br>
<br>
<a href="real_index.php">www.mmcontainer.be</a><br>
<a href="mailto:contact@mmcontainer.be?subject=Veuillez indiquer l'objet de votre message">contact@container.be</a></p>

<h1><a name="2">Envoyer un message</a></h1>
<p>Remplissez les champs suivants. Votre message nous sera ainsi envoyé et nous le traiterons dès que possible.</p>
<form method="POST" action="contact.php" name="send_message">
<p class="input_text">     
<label for="NAME1">Nom ou dénomination</label>     
<span> </span><input type="text" name="NAME1" id="NAME1" value="Majid<?php echo (isset($_POST['NAME1'])) ? $nom : '' ?>">
</p>
<p class="input_text">     
<label for="PHONE">Téléphone</label>     
<span> </span><input type="text" name="PHONE" id="PHONE" value="0032<?php echo (isset($_POST['PHONE'])) ? $telephone : '' ?>">
</p>
<p class="input_text">     
<label for="EMAIL">Email</label>     
<span> </span><input type="text" name="EMAIL" id="EMAIL" value="majid@hotmail.com<?php echo (isset($_POST['EMAIL'])) ? $expediteur : '' ?>">
</p>
<p class="input_text">     
<label for="SUBJECT">Sujet</label>     
<span> </span><input type="text" name="SUBJECT" id="SUBJECT"  value="123<?php echo (isset($_POST['SUBJECT'])) ? $sujet2 : '' ?>">
</p>

<p class="input_textarea">        
<label for="MESSAGE">Message</label>     
<textarea name="MESSAGE" id="MESSAGE" cols="1" rows="5">132<?php echo (isset($_POST['MESSAGE'])) ? $message : '' ?>


Alors si quelqu'un pourvais m'expliquer cet abération.
Si j'enléve le contenue de mes deux premiéres balises paragraphe.
a écrit :
Professionnels ou particuliers, n'hésitez ...

a écrit :
M&M Container SPRL...


Si je vide les deux balise <p> alors là l'erreur PHP dissparait.
Modifié par Rifton007 (23 Sep 2010 - 23:03)
Pour allé plus loins dans mes explications

J'ai fait un duplicata de la page et vide les deux balises paragraphe dont je vous parle

<div id="content_forpage">
<p></p>
<h1><a name="1">Coordonées</a></h1>
<p>
</p>


Balise vide:
Fonctionne

Originale:
Fonctionne pas
Modifié par Rifton007 (23 Sep 2010 - 23:08)
if (mail($to, $sujet, $msg, $headers))
{
	$alert = 'Votre message à bien été envoyé.';
	echo "<script>alert(\"".$alert."\");</script>";

            /* On créé un cookie de courte durée (ici 120 secondes) pour éviter de renvoyer un mail en rafraichissant la page */

            setcookie("sent", "1", time() + 120);

            /* On détruit la variable $_POST */

            unset($_POST);
}

pour moi le problème vient juste de là...

Tu as un echo (sortie html donc) avant un "setcookie". Le setcookie doit quoiqu'il arrive être avant les sorties HTML.

Donc ce que tu fais est très simple, tu mets le setcookie devant le "$alert" et surtout avant le "echo" et ça devrait être bon.

(et au passage corrige la faute d'orthographe c'est "a bien été envoyé" pas "à bien été envoyé" )
Tout d'abord mille fois merci d'avoir répondu à ce post.
Et désolé d'avoir tardé, je ne le consultais plus, car je pensais que personne pouvait m'aider.

Ceci dis j'ai effectuer les modification que tu ma préconisé.
Mais le probléme reste le même.


      if (mail($to, $sujet, $msg, $headers))
        {
			$alert = 'Votre message a bien été envoyé.';
			setcookie("sent", "1", time() + 120);
			echo "<script>alert(\"".$alert."\");</script>";
            
            /* On créé un cookie de courte durée (ici 120 secondes) pour éviter de 
            * renvoyer un mail en rafraichissant la page */
            
            
            /* On détruit la variable $_POST */
            unset($_POST);
        }


Message d'erreur

a écrit :
Warning: Cannot modify header information - headers already sent by (output started at /var/www/mmcontainer.be/htdocs/contact.php:109) in /var/www/mmcontainer.be/htdocs/contact.php on line 235


http://www.mmcontainer.be/contact.php
Modifié par Rifton007 (11 Oct 2010 - 10:57)
As tu regardé le lien de Heyoan ?
On s'est tous arraché les cheveux sur ce type de pb, il suffi parfois de modifier l'encodage du fichier à l'aide d'un éditeur de texte(textmate, notepad++) et de retirer le BOM.
Oui Paolo, j'ai vérifier avec le lien de Heyoan.

Moi je suis totalement perdu.
Mais j'aurais bien voulu que quelqu'un me donne une explication à cet abération.

J'ai deux balises paragraphes (hors form) avec du contenu texte.
Si je les vides, l'envoie se fait et sans erreur.
Si je remet du texte dedans, l'envoie se fait aussi, mais avec l'erreur PHP.

Balise paragraphe pleine
Balise paragraphe vide
Modifié par Rifton007 (11 Oct 2010 - 13:17)