messages d'erreurs à cause des headers

Eléphant du PHP | 271 Messages

17 juin 2006, 01:48

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.
Patience et obstination sont des qualités !

Invité
Invité n'ayant pas de compte PHPfrance

17 juin 2006, 04:29

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 ?

Invité
Invité n'ayant pas de compte PHPfrance

17 juin 2006, 04:32

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.

Eléphant du PHP | 197 Messages

18 juin 2006, 00:46

les headers sont à manier à la légère... c'est assez restrictif comme fonction :?

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

18 juin 2006, 16:29

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 :)

ViPHP
ViPHP | 2144 Messages

18 juin 2006, 18:59

On ajoutera qu'il y a un poste sur la question dans la faq, pensez à faire une recherche avant de poster.

Eléphant du PHP | 271 Messages

18 juin 2006, 22:56

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
Patience et obstination sont des qualités !

Eléphant du PHP | 112 Messages

19 juin 2006, 00:02

ou en xhtml, c'est encore mieu :D
Image

Eléphant du PHP | 271 Messages

19 juin 2006, 07:49

c'est à dire en xhtml ? Le xhtml est pour moi une norme de lisibilité pour les différents navigateurs.

Peux tu m'expliquer..
Patience et obstination sont des qualités !

Eléphant du PHP | 112 Messages

19 juin 2006, 11:56

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 :)
Image

ViPHP
ViPHP | 2144 Messages

19 juin 2006, 12:00

Article de la faq sur le sujet : http://www.phpfrance.com/forums/voir_sujet-47.php

Eléphant du PHP | 271 Messages

19 juin 2006, 12:15

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é.
Patience et obstination sont des qualités !