Page 1 sur 1

messages d'erreurs à cause des headers

Posté : 17 juin 2006, 01:48
par alaingpl
Bonsoir,

J'ai un site architecturé en pseudo - frame avec comme fichier en haut "entete.php", à gauche "menug.php" et à droite "menud.php"

ci - dessous mon fichier :
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
<title>qcmresto.com</title>
</head>

<body>
  <table width="100%" border="0" cellpadding="0" cellspacing="0">
  <tr>
    <td colspan="10"><?php include('entete.php'); ?></td>
    </tr>
   <tr>
    <td width="15%" rowspan="6" valign="top"><?php include('menug.php'); ?></td>
    <td width="70%" colspan="8" rowspan="5" valign="top"><?php

  // pages autorisées
  // ----------------------------------------------------
  $pageOK = array('pagep/qcm.php' => 'pagep/qcm.php', 
				  'pagep/ressource.php' => 'pagep/ressource.php',
				  'inscription/inscription.php' => 'inscription/inscription.php',
				  'pagep/challenge.php' => 'pagep/challenge.php',
				  'pagep/profil.php' => 'pagep/profil.php',
				  'accueil.php' => 'accueil.php',
				  'journal.php' => 'journal.php',
				  'news.php' => 'news.php',
				  'contact.php' => 'contact.php');

  // On teste que le paramètre d'url existe et qu'il est bien autorisé
  // -----------------------------------------------------------------
  if ( (isset($_GET['page'])) && (isset($pageOK[$_GET['page']])) ) {
    include($pageOK[$_GET['page']]);   // Nous appelons le contenu central de la page
  } else {
    include('accueil.php');   // Page par défaut 
  }

?>
</td>
    <td width="15%" rowspan="6" valign="top"><?php include('menud.php'); ?></td>
  </tr>
  <tr>
  
  </tr>
  <tr>
    
  </tr>
  <tr>
    
  </tr>
  <tr>
    
  </tr>
  <tr>
    <td colspan="8"><?php include('piedpage.html'); ?></td>
    
  </tr>
</table>

</body>
</html>
Dans une des pages autorisées il y a des headers. (c'est eux qui m'embêtent)

Ci - dessous la page
<?php
//Partie 1. Laissez cette partie au sommet de la page. Avant les en-têtes.
header("Expires: " . gmdate("D, d M Y H:i:s") . "GMT");
header("Last-Modified: " . gmdate("D, d M Y H:i:s") . "GMT");
header("Pragma: no-cache");
header("Cache-Control: no-cache, must-revalidate");

// Charger le fichier de configuration du quiz
include("config/quiz_connect.inc.php3");
include("config/config.inc.php3");
//Fin de la partie 1
?>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN">
<html>
<head>
<meta http-equiv="content-type" content="text/html; charset=iso-8859-1">
<TITLE>qQCMRESTO.COM</TITLE>
<meta name="keywords" content="">
<meta name="author" content="SK">
<meta name="description" content="">
<link rel="stylesheet" href="config/feuille_de_style.css">
</head>
<body>
<?php
//partie 2 a copier dans le corp de votre page
if ($fond=='uni'){
	print "<body bgcolor=\"$couleur\">";
}
else {
	print "<body background=\"$image\"";
}
print "<div align=\"center\">";
print "<h1>$titre</h1></div><br>";
//Si on veut toutes les questions sur une page :
if($mono=='ensemble'){
	echo "<FORM name=\"formaffiche\" ACTION=\"pagep/fqcm/quiz.php3\" METHOD=\"POST\">";
}
//Si on veut 1 question par page :
elseif($mono=='mono'){
	echo "<FORM name=\"formaffiche\" ACTION=\"quiz2.php3\" METHOD=\"POST\">";
}
//Si on veut jouer sans limites de questions :
else{
	echo "<FORM name=\"formaffiche\" ACTION=\"quiz_maxi.php3\" METHOD=\"POST\">";
	}
?>
<table width="75%" border="1" align="center">
  <tr bgcolor="#CC99FF"> 
    <td><b>Entrez votre nom/pseudo :</b></td>
    <td><span align="center"><input type="text" name="Nom_visiteur" size="30"></span></td>
  </tr>
<?php
  	//Si on veut envoyer un mail au participant, on lui demande son adresse :
	if($mailparticip=='vrai'){
		echo "<tr bgcolor=\"#CC99FF\">";
			echo "<td><b>Entrez votre adresse &eacute;lectronique :</b></td>";
				echo "<td><span align=\"center\"><input type=\"text\" name=\"Email_visiteur\" size=\"30\"></span></td>";
			echo "</tr>";
  	}
	//Si on a choisi de jouer avec les catégories, on les affiche :
  	if($categorie=='vrai'){
		echo "<tr bgcolor=\"#CC99FF\">";
			echo "<td><b>Choisissez votre cat&eacute;gorie de question :</b></td>";
			echo "<td><span align=\"center\"><select name=\"catego\">";
			// Choisir la catégorie de question
			$sql="SELECT categorie FROM quiz_categorie ORDER BY categorie ";
			$res=mysql_db_query($db, $sql);
				while ($row  =  mysql_fetch_array($res,MYSQL_ASSOC)) {
					reset ($row);
						while (list($key, $elem) = each ($row)) {
							$elem=htmlEntities($elem);
							echo "<option value=\"$elem\">$elem</option>\n";
						}
				}
			echo "</select>";
		echo "</span></td>";
	echo "</tr>";
	}
?>
  	<tr bgcolor="#CC99FF"> 
    	<td colspan="2"> 
      		<div align="center"> 
	  		<input type="hidden" name="depart" value="nx">
        	<input type="submit" name="submit" value="Envoyer">
      		</div>
    	</td>
  	</tr>
</table>
</form>
<?php
//Si le quiz est prévu pour afficher les meilleurs scores sur la première page, on les affiche :
if($score=='index'){
	//Si on n'a pas mis 0 comme nombre maximum d'affichage, on affiche :
	if($nbtop!='0'){
		print "<div align=\"center\"><br><span class=\"comic14\">";
		print "Voici la liste des $nbtop meilleurs scores : </span>";
		$sql="SELECT nomvisiteur, reponsesjustes, categorie FROM quiz_visiteur ORDER BY reponsesjustes DESC LIMIT 0, $nbtop";
		$result=mysql_db_query($db, $sql);
include("table_score.php3");
			echo "</div>";
		}
	}
else{}

?>
</body>
</html>
Quand elle s'affiche, j'ai les messages suivants:
Warning: Cannot modify header information - headers already sent by (output started at /home4/s/sitweb-chr/www/menug.php:9) in /home4/s/sitweb-chr/www/pagep/fqcm/index.php3 on line 8

Warning: Cannot modify header information - headers already sent by (output started at /home4/s/sitweb-chr/www/menug.php:9) in /home4/s/sitweb-chr/www/pagep/fqcm/index.php3 on line 9

Warning: Cannot modify header information - headers already sent by (output started at /home4/s/sitweb-chr/www/menug.php:9) in /home4/s/sitweb-chr/www/pagep/fqcm/index.php3 on line 10

Warning: Cannot modify header information - headers already sent by (output started at /home4/s/sitweb-chr/www/menug.php:9) in /home4/s/sitweb-chr/www/pagep/fqcm/index.php3 on line 11
La ligne 9 correspond à un include mais même en l'éliminant il m'affiche les même erreurs pour le reste de la page. Pour que ça fonctionne il faut que j'efface tout le contenu de la page "menug.php".


Y a t - il un moyen de contourner le problème des headers des lignes 8, 9, 10, 11 du la page index.php3 afin que mon menug puisse s'afficher?
Si quelqu'un à une solution, d'avance merci beaucoup.

Posté : 17 juin 2006, 04:29
par Invité
Les HEADER doivent être envoyé avant N'IMPORTE QUELLE AUTRE INFORMATION, c'est à dire, que rien, exceptés les headers standards envoyés par Apache/PHP, ne doit se trouver avant, il faut que tu places tes headers avant "<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> " par exemple
Tu peux avoir du code PHP tant qu'il s'agit de calcul, vérification, etc... mais à partir du moment où tu utilises une commande d'affichage ou autre au client, tes headers deviennent obsolètes, car ceux ci sont envoyé avant tout contenu pour informer le navigateur.

OK ?

Posté : 17 juin 2006, 04:32
par Invité
En gros, il faut que tu places <?php include('entete.php'); ?> en tout début de ton code, ou alors que tu crées un autre fichier, exclusivement aux HEADERS.

Posté : 18 juin 2006, 00:46
par HanX
les headers sont à manier à la légère... c'est assez restrictif comme fonction :?

Posté : 18 juin 2006, 16:29
par Ryle
les headers sont à manier à la légère... c'est assez restrictif comme fonction :?
Faudra m'expliquer ce que tu entends par là :)

La fonction header (avec tous les paramètes qui peuvent lui être apportés) est loin d'être restrictive, la simple redirection en php en fait selon moi une fonction indispensable :)
Le problème rencontré vient de l'utilisation des pseudo-frame qui en limite l'utilisation. Pour ne pas perdre cette fonctionnalité il faut appeler une page spécifique qui fera le traitement demandé sans passer par la pseudo frame et qui fera un header vers celle-ci avec les arguments adéquats.

Pour ma part c'est à cause de cette restriction que je n'utilise pas les pseudo-frames. Je préfère définir un en-tête et un pied de page qui sont inclus dans chacun de mes scripts, ce qui me permet de faire ce que je veux sans me soucier du code qui serait envoyé avant les headers, puisque je n'inclus ceux-ci qu'à l'endroit qui me convient :)

Posté : 18 juin 2006, 18:59
par iclo
On ajoutera qu'il y a un poste sur la question dans la faq, pensez à faire une recherche avant de poster.

Posté : 18 juin 2006, 22:56
par alaingpl
Bonjour,

Désolé mais j'ai fait une recherche dans la faq et je n'ai rien trouvé.

Pour ma part n'ayant pas trouvé de solution pour régler mon pbl, j'ai tout simplement recréé une page identique à ma page d'accueil qui utilise les pseudo frame. Il est clair que la prochaine version de mon site sera sans pseudo frame avec des tableaux (comme à l'ancienne).

Merci de votre aide

Posté : 19 juin 2006, 00:02
par Mouet
ou en xhtml, c'est encore mieu :D

Posté : 19 juin 2006, 07:49
par alaingpl
c'est à dire en xhtml ? Le xhtml est pour moi une norme de lisibilité pour les différents navigateurs.

Peux tu m'expliquer..

Posté : 19 juin 2006, 11:56
par Mouet
Le xhtml est bien une norme mais combiné au css, tu peux te passer de tout ce qui est tableau et tu garde une liberté bien plus grande avec les div qu'avec les table.

Personnelement, je n'utilise plus de tableau pour la mise en page de mes site, si tu veux plus d'information, pm moi ou demande ici :)

Posté : 19 juin 2006, 12:00
par iclo
Article de la faq sur le sujet : http://www.phpfrance.com/forums/voir_sujet-47.php

Posté : 19 juin 2006, 12:15
par alaingpl
Je saisi l'architecture que tu proposes. Mais le CSS est pour moi encore assez flou et j'utilise que le strict nécessaire au fonctionnement du site (body, font, text. decoration...) Je n'ai jamais réalisé de mise en page en CSS.
Aurais - tu un exemple de feuille à me fournir ?

Si j'ai bien compris, en réalisant la mise en page par une feuille de style en css, je peux " contourner " les headers et en utilisant les pseudo frames.
La style sheet est dans les balises <head>. Par contre, en pseudo frames, il faudrait que les fichiers (entete, menu, page centrale...)qui composent la page pseudo frames soient "avec" la style sheet si dans une architecture classique, ils sont appelés avant la page centrale contenant les headers. Cela me semble assez compliqué.
J'espère m'être assez bien expliqué.