Page 1 sur 2

Cannot modify header information - headers already sent (...

Posté : 23 août 2010, 15:09
par Z
Bonjour à toutes et tous,

Je dois débugguer le code suivant. Celui-ci me génère un warning sur l'envoi de headers
<?php header('Content-type: text/html; charset=UTF-8', true); ?>
--> ne peut pas envoyer le header demandé, quelque chose ayant déjà été envoyé avant.
Le message m'indique la ligne en cause, celle-ci contient l'inclusion d'un fichier de connexion vers la BDD : <?php require_once('../../eee/xxx.php'); ?>
Or ce fichier ne contient aucune impression de caractère (j'ai remplacé les paramètres par des aaa, bbb, ccc...) :
<?php
# FileName="Connection_php_mysql.htm"
# Type="MYSQL"
# HTTP="true"

$hostname = "aaa";
$database = "bbb";
$username = "ccc";
$password = "ddd";
$yyy = mysql_pconnect($hostname, $username, $password) or trigger_error(mysql_error(),E_USER_ERROR);

?>
J'ai essayé de supprimer les #, ainsi que le trigger_error.... rien à faire.
Est-ce que quelqu'un verrait l'origine du problème ???

Merci de votre aide !

Z

Re: Cannot modify header information - headers already sent (...

Posté : 23 août 2010, 15:21
par AoSiX
Salut,

ce serait sympa de nous mettre les lignes environnantes, pas juste la ligne ou il y a l'erreur. parfois ça vient de juste au dessus, ou juste en dessous

Re: Cannot modify header information - headers already sent (...

Posté : 23 août 2010, 15:25
par sylvaing26
Mettre ton header avant ton include

http://www.php.net/manual/fr/function.header.php
header() permet de spécifier l'en-tête HTTP string lors de l'envoi des fichiers HTML. Reportez-vous à » HTTP/1.1 Specification pour plus d'informations sur les en-têtes HTTP.

N'oubliez jamais que header() doit être appelée avant que le moindre contenu ne soit envoyé, soit par des lignes HTML habituelles dans le fichier, soit par des affichages PHP. Une erreur très classique est de lire un fichier avec include() ou require(), et de laisser des espaces ou des lignes vides, qui produiront un affichage avant que la fonction header() ne soit appelée. Le même problème existe avec les fichiers PHP/HTML standards.

Re: Cannot modify header information - headers already sent (...

Posté : 23 août 2010, 15:33
par Z
Re,

OK, merci Julien.
La ligne incriminée est la première du fichier. En gros ça fait :

<?php require_once('../../eee/xxx.php'); // cette ligne envoie apparemment des headers... ?>

<?php
mysql_query('SET NAMES UTF8');
?>
<?php
(...)
et plus loin :
mysql_select_db($database, $yyy);
$query_rsMembre = sprintf("SELECT * FROM users WHERE id_membre = %s", GetSQLValueString($colname_rsMembre, "int"));
$rsMembre = mysql_query($query_rsMembre, $biodiversite2010) or die(mysql_error());
$row_rsMembre = mysql_fetch_assoc($rsMembre);
$totalRows_rsMembre = mysql_num_rows($rsMembre);
?>

<?php header('Content-type: text/html; charset=UTF-8', true); // et cette ligne ne peut pas envoyer de heander à cause de la première ?>

<?
require("conf.php");
// CONNEXION MYSQL
$id = '1';
if ($HTTP_GET_VARS['id']) {
  $id = $HTTP_GET_VARS['id'];
}
(...)
Voilà !
Merci !
Z

Re: Cannot modify header information - headers already sent (...

Posté : 23 août 2010, 15:36
par sylvaing26
Une erreur très classique est de lire un fichier avec include() ou require(), et de laisser des espaces ou des lignes vides, qui produiront un affichage avant que la fonction header() ne soit appelée. Le même problème existe avec les fichiers PHP/HTML standards.

Re: Cannot modify header information - headers already sent (...

Posté : 23 août 2010, 16:47
par Z
Re,

Vi vi, merci Sylvaing26 !
J'en étais resté à la proscription de tout "echo" ou dans le même genre avant une entete, mais ne savais pas que même un espace dans le code pouvait produire le même effet.
En effet, cela fonctionne, sur cet aspect.

Reste néanmoins un message que je croyais lié :

Code : Tout sélectionner

Warning: Invalid parameter type on class XPertMailer->headers() in /var/www/meeddm/biodiversite2010/n+1/www/prive/ac/XPertMailer.php on line 154
XPerMailer étant une classe existante permettant l'envoi de mails. Je pensais que le header fourni en argument correspondait justement à celui qui ne passait pas :
<?php header('Content-type: text/html; charset=UTF-8', true); ?>

Mais ce n'est peut-être pas ça...
Ca va être un peu plus complexe à débugger....

Merci en tout cas !
Z

Re: Cannot modify header information - headers already sent (...

Posté : 23 août 2010, 17:12
par sylvaing26
Tu as quoi dans ton fichier XPertMailer.php à la ligne 154 (avant et après)?

Code : Tout sélectionner

/var/www/meeddm/biodiversite2010/n+1/www/prive/ac/XPertMailer.php on line 154

Re: Cannot modify header information - headers already sent (...

Posté : 23 août 2010, 18:10
par Z
Ceci :
	function headers($arrh){

		if(is_array($arrh) && count($arrh) > 0){
			$rebh = array();
			foreach($arrh as $numh => $valh){
				if(is_string($numh) && is_string($valh) && !empty($numh) && !empty($valh)){
					if(isset($rebh[$numh]) && PRINT_ERROR) trigger_error("Duplicate array key on class XPertMailer->headers()", 1024);
					$rebh[$numh] = $valh;
				}elseif(PRINT_ERROR) trigger_error("Invalid array parameter type on class XPertMailer->headers()", 1024);
			}
			$this->_setarrh = $rebh;
		}elseif(PRINT_ERROR) trigger_error("Invalid parameter type on class XPertMailer->headers()", 512); // <--- ligne 154

	}
Meeerciii !
Z

Re: Cannot modify header information - headers already sent (...

Posté : 25 août 2010, 10:14
par Z
Hello !

Arf... personne n'aurait une p'tite idée de la chose ?
A part l'envoi du header qui ne passait pas (et qui passe maintenant), je n'ai pas d'autre explication...

++ !

Z

Re: Cannot modify header information - headers already sent (...

Posté : 25 août 2010, 11:19
par Berzemus
Tout tes fichiers sont bien en UTF8 sans BOM ?

Re: Cannot modify header information - headers already sent (...

Posté : 25 août 2010, 11:20
par sylvaing26
Et si tu enlèves ", true" dans ton header ca marcherai pas sinon ?
Après ba ya la methode brute si ca t'agace cette erreur, tu supprime cette partie (à condition que le reste marche quand même) :
elseif(PRINT_ERROR) trigger_error("Invalid array parameter type on class XPertMailer->headers()", 1024);

Re: Cannot modify header information - headers already sent (...

Posté : 25 août 2010, 11:30
par Z
Merci Sylvaing26, oué, je vais essayer ça.
@Berzemus : c'est quoi "BOM" :-) ?

++

Z

Re: Cannot modify header information - headers already sent (...

Posté : 25 août 2010, 11:39
par sylvaing26
c'est quoi "BOM" :-) ?
BOM c'est Marque d'Ordre des Octets

Re: Cannot modify header information - headers already sent (...

Posté : 25 août 2010, 11:42
par Z
Ah, yes... merci.
Et comment on fait pour voir s'il n'y en a pas ? les entêtes de fichiers ? (je crois qu'on peut les voir sous Linux mais sous Windows.... oups...)

Z

Re: Cannot modify header information - headers already sent (...

Posté : 25 août 2010, 11:45
par sylvaing26
Moi ce que je fait, je développe mes scripts PHP avec Notepad2
Pour un script en UTF-8 je vais dans File->Encoding->UTF-8

Sinon en francais qui est pas mal tu as Notepad++
Tu vas dans Encodage -> Encoder en UTF-8 (sans BOM) !