Page 1 sur 2

templeet warning avec fonction php

Posté : 06 juin 2006, 16:29
par konjiki
salut a tous,
je place ce sujet dans ce forum mais je ne sais pas si il est au bon endroit. Mais puiqu'il s'agit d'une fonction php je tente (les modo si vous jugez ce post non conforme n'hésitez pas à le deplacer)
Alors voila j'utilise une fonction qu'on appelera menu_portail.
Avec du code php pur tout va bien mais des que je passe sous templeet j'ai des warning qui apparaissent et je n'arrive pas à les faires disparaitre.
voila la fonction:
function return_menu_portail(){

$host="blabla";
$user="blabla";
$pass="";
$database="blabla";

$connect=mysql_connect($host, $user, $pass) or die("connexion impossible");
mysql_select_db($database, $connect) or die("connexion à la base impossible");

$req="SELECT nom FROM `portails`";
$rows = mysql_query($req);

$aff.="<table>";
$aff.="<tr align=\"center\"><td><a href=\"home.html\">index</a></td></tr>";
while($result = mysql_fetch_array($rows)){
$aff.= "<tr align=\"center\"><td><a href=".str_replace(" ", "_",strtolower($result["nom"])).".html>".$result["nom"]."</a></td></tr>";
}

$aff.="</table>";

return ($aff);

}
J'ai deja enlevé tous les echo mais l'erreur poursuit.
erreur:

Code : Tout sélectionner

Warning: Cannot modify header information - headers already sent by (output started at /var/www/html/---------/templeet/modules/stat/menu_portail.php:34) in /var/www/html/---------/templeet/templeet.php on line 641
Si vous pouviez m'eclairer de votre lanterne se serai bien. Merci

Posté : 06 juin 2006, 17:29
par Ryle
Hello !

A priori ton problème vient du fais que tu essayes de modifier les entêtes de ta page (Cannot modify header information) alors que celles-ci ont déjà été envoyées au navigateur (headers already sent).

A priori je dirais que tu dois avoir un appel à la fonction header() dans ton fichier templeet.php ligne 641, alors que tu as déjà eu un envoi de code html dans menu_portail.php ligne 34 (ca peut être echo voir même un retour charriot ou un espace en dehors des balises php <? et ?>)

Peux tu nous montrer ces lignes ? (avec les quelques lignes qui suivent et qui précèdent)

Posté : 06 juin 2006, 17:49
par konjiki
La fonction menu_portail.php ne comporte pas 34 lignes, elle s'arrete avant. En ce qui concerne le fichier templeet.php voila un extrait aux lignes concernées: ligne 571 à 593
sendhttpstatus($http_status);

	if ($cache==0) {
		header("Expires: Mon, 17 Jul 1978 05:00:00 GMT"); 
		header('Last-Modified: '.gmdate('D, d M Y H:i:s',time()).' GMT');
		header("Cache-Control: no-store, no-cache, must-revalidate");//HTTP/1.1
		header("Cache-Control: post-check=0, pre-check=0", false);
		header("Pragma: no-cache"); //HTTP/1.0
	}

	if ($config['errorReporting'] && !empty ($errorLog)) {
		global $global_var,$evalerror;
		$global_var['errorLog'] = $errorLog;
		$errorLog='';
		$evalerror=1;
		if (file_exists('template/error/eval.html')) {
			return parsetemplate('template/error/eval.html');
		} else {
			return $global_var['errorLog'];
		}
	}
	return $txt;
}
j'ai essayé de supprimer les sauts de lignes pour la fonction menu_portail mais rien n'y fait. Je suis tout ouîe pour la suite.

Posté : 06 juin 2006, 23:49
par Ryle
Le problème vient donc bien comme je le pense des headers que tu envois pour le cache. Il considère qu'un flux a déjà commencé à être envoyé et il ne peut donc plus y ajouté d'en-tête.

Quand tu dis que la "fonction menu_portail.php ne comporte pas 34 lignes" tu parles bien du fichier qui fait moins de 34 lignes ?

Ce ne sont pas les retours chariot qu'il faut spécialement viré, mais tout ce qui est sortie html... ca peut être un saut de ligne ou un espace au début de ton fichier avant le premier <?php, la même chose perdue entre ?> et <?php... ca peut aussi etre à cause d'un print ou un echo :)

A vérifier à partir du haut de ta page jusqu'à l'appel des headers, en regardant également dans les fichiers inclus :)

(post eventuellement ta page menu_portail.php en entier si tu veux qu'on y jette un oeil :))

Posté : 07 juin 2006, 10:26
par konjiki
oki alors voila mon fichier ou j'appel la fonction menu_portail().
!attention c'est un fichier templeet
En tout cas je veux bien vos avis parce que la c'est rude :shock:
<div class="liste_portails">

		~menu_portail()
	</div>


	<div class="contenu">
		<h2>Consultation globale </h2>
		jour du ~format_timestamp('%d/%m/%Y',~now()) <br>
		Nombre actuelles de dépèches totales:
		~noeval("requete  ")<br>
		Nombre actuelles de dépèches modérées:
		~noeval("requete  ")<br>
		Nombre actuelles de dépèches postées:
		~noeval("requete  ")<br>
		total pages vues :
		~noeval("requete  ")<br>
		pages vues aujourd hui:
		~noeval("requete  ")<br>
		
		<h3>Recherche </h3>
			<form name="annee" method="post" action="~relative_templeet_script()">
			~menu_annee()
			</form>


		~set("popup","~getpost('popup')")<br>


			<form name="mois" method="post" action="~relative_templeet_script()">
				
			~if(~empty("~get('popup')"),"","selectionnez un mois<br>
			~menu_mois()")
				
			</form>
	</div>

a+

Posté : 07 juin 2006, 10:35
par konjiki
je viens d'essayer quelque chose et le je comprend pas le resultat :shock:
J'ai enlevé tous le code de ma fonction menu_portail mais je continu à l'appeler et la j'ai toujours une erreur de header.
Comment ça se fait puisque ma fonction est vide.

Posté : 07 juin 2006, 10:45
par Ryle
C'est une question d'ordre.. en fait si on résume tu fais quelque chose comme ceci dans ton script principal :

1. un traitement quelconque qui va faire appel au template
2. puis un traitement qui renvoi les headers()

Le problème je pense provient du fait que le template renvoi du code html dès que tu l'appel (<div class="liste_portails"> ... ) indépendament de ta fonction menu_portail, et par conséquent, les headers ne peuvent plus être envoyés.

Remonte le code des headers avant l'appel au template pour qu'ils soient envoyés avant tout flux html, cela devrait te résoudre le problème :)

Posté : 07 juin 2006, 10:49
par konjiki
oki j'essaye ça tout de suite

Posté : 07 juin 2006, 11:06
par konjiki
apres quelques essais je suis pas sur d'avoir compri :oops:
tu entends quoi par remonter le code des headers?

Posté : 07 juin 2006, 11:10
par Ryle
Toute la partie
   if ($cache==0) { 
        header("Expires: Mon, 17 Jul 1978 05:00:00 GMT"); 
        header('Last-Modified: '.gmdate('D, d M Y H:i:s',time()).' GMT'); 
        header("Cache-Control: no-store, no-cache, must-revalidate");//HTTP/1.1 
        header("Cache-Control: post-check=0, pre-check=0", false); 
        header("Pragma: no-cache"); //HTTP/1.0 
    } 
doit être appelée avant que tu ne commences à renvoyer des infos au navigateur. Il te faut donc l'appeler avant de faire appel à ton (ou tes) template(s). Il te suffit pour cela de placer ce bout de code au début de ton script (à priori où tu veux, tant que c'est avant le premier envoi de html :))

Posté : 07 juin 2006, 11:10
par mere-teresa
Remonter les lignes header() dans le code, je pense.

Posté : 07 juin 2006, 11:20
par konjiki
vous etes sur que c'est une bonne idée de toucher au fichier templeet.php ?
J'ai peur de foutre le bordel vous comprenez...

Posté : 07 juin 2006, 11:24
par Ryle
Tu fais une copie de ton fichier que tu ranges bien précieusement à l'abri (ça c'est pour la partie rigueur, comme ça quoi qu'il arrive tu pourras le restaurer :)) et tu te lache sur le fichier pour bidouiller, tester, t'amuser à changer des trucs.. (et ca c'est pour la partie fantasie ;))

(Comme quoi bien choisir sa signature, c'est important ;))

Posté : 07 juin 2006, 11:25
par konjiki
que dire sinon bonne repartie je test

Posté : 07 juin 2006, 11:27
par mere-teresa
Hors sujet : quel est le rapport avec les signatures ?