8725 sujets

Développement web côté serveur, CMS

Bonjour,

au vu des messages qui traitent de ce sujet, je me doute que c'est une erreur fréquente mais étant tellement débutant, je n'arrive pas à comprendre mon erreur.

Voilà, j'ai ce fameux message d'erreur :
Warning: Cannot modify header information - headers already sent by .... etc...

Le code php est bon quand je fais comme ça :


<?php 

$DIR_meteoalerte = $_POST['nom_DIR_meteoalerte']; 
$ville_levercouchersoleil = $_POST['ville_levercouchersoleil']; 

// Enregistre un cookie sur l'ordinateur  :  région meteoalerte en page d'accueil
setcookie("cookie_DIR_meteoalerte", $DIR_meteoalerte,time()+3600*24*365*10,"/","") ;

// // Enregistre un cookie sur l'ordinateur  :  ville pour lever et coucher de soleil en page d'accueil
setcookie("cookie_ville_levercouchersoleil", $ville_levercouchersoleil,time()+3600*24*365*10,"/","") ;


echo 'Vos préférences sont enregistrées. ';
echo '<br>';
echo '<br>';
echo '<br>';
echo 'Vos préférences seront pris en compte au prochain affichage de la page d\'accueil. ';
echo 'Vous pouvez aussi actualiser de suite avec la touche F5';
echo '<br>';
echo '<br>';

echo '<form>';
echo '<input type=\'button\' value=\'Fermer\' onClick=\'window.self.close();\'>';
echo '</form>';

?>



Mais dès que je veux mettre en forme le texte avec un css, plus rien ne marche. Voici le code enrichi :

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
"http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
<link rel="stylesheet" type="text/css" href="style.css"/>
<title>Validation Préférences</title>
</head>

<body>

<div id=cadre>

<?php 

$DIR_meteoalerte = $_POST['nom_DIR_meteoalerte']; 
$ville_levercouchersoleil = $_POST['ville_levercouchersoleil']; 

// Enregistre un cookie sur l'ordinateur  :  région meteoalerte en page d'accueil
setcookie("cookie_DIR_meteoalerte", $DIR_meteoalerte,time()+3600*24*365*10,"/","") ;

// // Enregistre un cookie sur l'ordinateur  :  ville pour lever et coucher de soleil en page d'accueil
setcookie("cookie_ville_levercouchersoleil", $ville_levercouchersoleil,time()+3600*24*365*10,"/","") ;

?>

Vos préférences sont enregistrées. 
<br>
Vos préférences seront pris en compte au prochain affichage de la page d'accueil. 
Vous pouvez aussi actualiser de suite avec la touche F5';
<br>

<form>
<input type='button' value='Fermer' onClick='window.self.close();'>
</form>

</div>


</body>
</html>



Comment puis-je faire pour avoir ma feuille de style qui s'applique au texte ?

Merci encore pour votre aide à chaque fois précieuse
En fait le message d'erreur te l'indique, les headers ont été envoyés avant de faire ton setcookie().

dans la documentation de la fonction (http://fr.php.net/manual/fr/function.setcookie.php), il y a marqué :
a écrit :
setcookie() définit un cookie qui sera envoyé avec le reste des en-têtes. Comme pour les autres en-têtes, les cookies doivent être envoyés avant tout autre sortie (c'est une restriction du protocole HTTP, pas de PHP). Cela vous impose d'appeler cette fonction avant toute balise <html> ou <head>. Si quelque chose a été envoyé avant l'appel à cette fonction, setcookie() échouera et retournera FALSE. Si setcookie() réussi, elle retournera TRUE. Cela n'indique pas si le client accepte ou pas le cookie.


A toi de changer le code en fonction de ça Smiley smile (mettre le code avant l'appel du html)

Par contre la cookie sera pris en compte qu'après le rechargement de la page une fois qu'il aura été défini.
Pour te montrer simplement, met ton html après ton php :

<?php 



$DIR_meteoalerte = $_POST['nom_DIR_meteoalerte']; 

$ville_levercouchersoleil = $_POST['ville_levercouchersoleil']; 



// Enregistre un cookie sur l'ordinateur  :  région meteoalerte en page d'accueil

setcookie("cookie_DIR_meteoalerte", $DIR_meteoalerte,time()+3600*24*365*10,"/","") ;



// // Enregistre un cookie sur l'ordinateur  :  ville pour lever et coucher de soleil en page d'accueil

setcookie("cookie_ville_levercouchersoleil", $ville_levercouchersoleil,time()+3600*24*365*10,"/","") ;



?>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"

"http://www.w3.org/TR/html4/loose.dtd">

<html>

<head>

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

<link rel="stylesheet" type="text/css" href="style.css"/>

<title>Validation Préférences</title>

</head>



<body>



<div id=cadre>
ahhhhhh Smiley biggrin

je pensais qu'il fallait que le doctype et les balises head soient toujours en haut.


ok merci !!!

ça marche impec
ca vient de setcookie en fait:

vu sur la doc:
a écrit :

Comme pour les autres en-têtes, les cookies doivent être envoyés avant tout autre sortie (c'est une restriction du protocole HTTP, pas de PHP). Cela vous impose d'appeler cette fonction avant toute balise <html> ou <head>. Si quelque chose a été envoyé avant l'appel à cette fonction, setcookie() échouera et retournera FALSE


Il y a quelques fonction php qui on besoin d'etre executee avant tout envoi..
Modifié par steph29 (14 Feb 2008 - 12:42)
Il est nécessaire de comprendre ce phénomène pour l'éviter...

Ceci est dû en effet au protocole HTTP qui ne peut envoyer de headers HTTP si le body HTTP (pas le body HTML) a déjà commencé à être envoyé. Ceci est valable pour la gestion des cookies, des sessions, des redirections, du content-type, etc...

C'est pourquoi il faut faire l'appel à ces fonctions avant toute sortie autre que que les headers HTTP. Mais il est faux de dire que ceci est nécessaire. En effet php possède une fonctionnalités de buffer de sortie (qui peut -être automatisée suivant les reglages de php, ou utilisé avec des fonctions ). En utilisant le buffer de sortie l'envoi du body HTTP se fait uniquement à la fin de l'execution du script (ou de l'appel à la fonction ob_end_flush()) donc on peut continuer à ajouter des headers HTTP même après avoir fait des "echo".

Voilà, petite précision qui a son importance. Bien comprendre le protocole HTTP est une démarche facile et très utile, quelque soit les langages serveurs utilisés derrière.

@microphilou : tout ce qui se trouve entre les balises <?php ?> sera executé coté serveur mais certainement pas envoyé au client et donc dans ce cas précis le Doctype sera bien en première ligne du document HTML Smiley cligne .
Modifié par skywalk3r (14 Feb 2008 - 12:58)
Bonjour,

Alors voila je post dans ce sujet car je rencontre la même erreur...
Sauf que c'est dans une page ne contenant que du code php!


<?php

// test l'existance du cookie
if (isset($_COOKIE["etat"])) {

	$music = $_COOKIE["etat"];
	
}else{

	$music = "on";
	
}

$switch = $_POST['etat'];

if ($switch == 1){

	if($music == "on"){
	
		$music = "off";
		
	}else{
	
		$music = "on";
		
	}
	
}

setcookie('etat', $music, time()+3600);

if(setcookie == true){

//Creation fichier XML
$XML = "etat.xml";		//suppose que tu as préalablement créée un fichier xml sur ton serv nommé : shootbox.xml
$fichier = fopen($XML,"w+");		//autorise l'écriture dans le fichier
$data_XML = '<?xml version="1.0" encoding="utf-8"?>'."\n\n";		// la balise d'ouverture de ton XML, tu va concatener  le "\n" (saut de ligne)
$data_XML .= "<main>\n\n"; 		//ouverture de la balise racine
$data_XML .= "<music value=\"$music\" />\n\n";		//enregistrement de l'état
$data_XML .= "</main>\n"; // fermeture de la balise racine

//Ecriture fichier XML
fputs($fichier, $data_XML);
fclose($fichier);

echo "&ok=1";

}

?>


Il s'agit d'une page php appelée par une animation flash. Alors je me demande si ce n'est pas lié au fait qu'aucune page ne s'ouvre en réalité... Smiley confused J'avoue que je nage un peu la!

J'ai essayé d'ajouter une structure de page html basique après le code pour voir si cela changeait qq'chose... mais non.
Et pourtant j'ai essayé sur une page classique et cela marche! Mais sur cette page qui s'execute sans s'afficher, rien à faire!

Toute aide sera donc la bienvenue car je ne m'en sors plus! Smiley bawling
Il arrive aussi qu'un simple espace blanc ou un saut à ligne avant le <?php ou après le ?> (dans le cas d'un inclure avant une sortie) génère cette erreur.
Merci MatMat pour ta réponse, mais j'ai bien vérifié et je n'ai pas d'espaces qui traine...

Est-ce que cela peut venir du fait que j'appelle la page depuis un flash sans l'afficher?
Une solution qui peut te permettre d'éviter tout problème.

Met ton fichier sous tampon Smiley lol

En clair, commence ton fichier par :

<?php
ob_start();


et finis le par :


ob_end_flush();
?>


Comme ça, même si il y a du html dans ton code, puis un header, tu auras la redirection faites quand même !

C'est surement pas propre, mais en attendant, si ça peut t'aider Smiley cligne
Je viens de relire entièrement le sujet.

Qu'est-ce que tu veux faire exactement ? Redirection, y'en a pas dans ton code, créer un fichier xml ? Ton script ne te génère pas d'erreur, car je crois en voir une grosse :

setcookie('etat', $music, time()+3600);



if(setcookie == true){


Qui devrait plutôt être comme ceci :

$creation_cookie = setcookie('etat', $music, time()+3600);



if($creation_cookie == true){


Si il y a une redirection après, il y a du code généré :

echo "&ok=1";


Donc, c'est normal que la redirection ne fonctionne pas, si il y en a une
Modifié par Super_baloo8 (13 Jun 2008 - 10:21)
Salut,

+1 pour l'erreur Smiley cligne !

En précisant qu'il n'y a pas besoin de redirection car le setcookie a les mêmes caractéristiques que le header.

Je pencherais plutôt pour une écriture de code html dans la page qui contient l'include Smiley murf !

A+
Rebonjour tout le monde!

Bon alors déja Mea Culpa pour l'erreur, j'aurais dut la voir celle la... Smiley confused

Mais malheureusement le problème ne vient pas de la! En revanche je me rends compte que je n'ai pas suffisamment bien exposé le contexte de mon problème donc je vais corrigé ça :

Je travaille en fait sur un header flash qui se trouve sur toutes les pages d'un site. Ce header diffuse une musique que l'on doit pouvoir couper via un bouton situé dans le header flash. Et si l'utilisateur coupe le son, il faut que pour le reste de sa navigation le son reste coupé, même si il change de page (et donc recharge l'animation flash du header).

Mon header flash au chargement appel donc le script php que j'ai cité precedemment. Celui-ci contrôle si un cookie existe et si c'est le cas stocke son etat dans un fichier XML que l'anim flash va lire ensuite pour savoir si le son doit être joué ou non. (la je me suis peut-être compliqué la vie mais je ne sais pas comment lire l'état d'un cookie depuis flash)

Une fois le header chargé, si l'utilisateur clique sur le bouton pour couper/remettre le son, le header flash appelle a nouveau le script, cette fois en transmettant en POST la valeur Switch = 1 qui signifie que l'état doit changer. A ce moment la le script modifie l'état par rapport a celui existant dans le cookie et stock la nouvelle valeur dans le XML que le flash va de nouveau lire pour actualisé son état.

Tout cela se fait evidemment sans que l'utilisateur ne change de page! Ni que le script php en ouvre une nouvelle (en tout cas visuellement, je ne sais pas comment cela se passe concretement...).

Le problème, c'est que j'ai controlé ma liste de cookies après chaque essai et le cookie ne se crée pas! J'ai fait d'autres essais sur une page basique que j'affiche normalement et la cela marche.. D'ou mes craintes sur le fait que mon script soit appeler "en fond" par une anim flash...

Je précise tout de suite que pour mes essais j'avais evidemment autorisé les cookies sur le navigateur! Smiley sweatdrop
Et également que le script php que j'ai cité précedemment est tout ce que contient la page appelée par le flash.
Modifié par Lionel Zero (14 Jun 2008 - 08:41)
Re',

je n'y connais rien en appel de page php depuis un flash mais du coup cela expliquerait pourquoi du code html a déjà été écrit. Je ne sais pas si tu as essayé la technique ob_start(); / ob_end_flush(); mais cela pourrait peut-être fonctionner Smiley rolleyes ...

En fait j'ai quand même un doute car en php il faut obligatoirement réactualiser la page pour qu'un cookie soit disponible Smiley murf ... Le plus simple serait certainement de pouvoir le gérer directement en flash (comme sur cette source de mediabox).

A+
Ah le flash ... Smiley biggol

Ce que tu peux faire, c'est mettre la fonction de création/mise à jour du cookie en lien html sur ta page.

Ce lien doit normalement affiché l'autre page, mais si tu utilises le buffer, alors là, tu vas voir les miracles (je l'utilise en permanence pour des mise à jour rapide de BDD).

En fait, de ta page, tu appelle le script (qui ne contient aucun affichage HTML), le script se déroule, mais comme il est mis en tampon rien ne s'affiche et ta page ne disparait pas. Une fois le script finis, il faut absolument mettre une redirection header("Location: "); à la fin du script qui ramènera sur la page précèdente (possible avec la SuperGlobale $_SERVER['HTTP_REFERER']).

Comme tout était en tampon, le script se sera déroulé, ta page n'aura pas changée, et par contre le script se sera executé, et comme il y a quand même un rafraichissement subtil de page du à la redirection, la page qui contient ton flash à le temps d'aller relire les infos du cookie etc etc ...

Ca marche, si tu veux plus d'explication, pas de soucis Smiley cligne

Je peux même te créer un compte de test sur un de mes site qui utilise cette méthode (récupération xml, traitement xml, update BDD, et renvoie des statuts par $_SESSION pour l'afficher sur la page précèdente)
Modifié par Super_baloo8 (19 Jun 2008 - 15:31)
En gras :

Tu appelerais ce genre de script en cliquant sur le lien :


<?php

ob_start();

Ce que tu as a faire ....

header('Location: '.$_SERVER['HTTP_REFERER']);
exit;

ob_end_flush();
?>