2013-01-15 1 views
-1

Possible en double:
Headers already sent by PHPEn-têtes déjà envoyés? ... Où?

Je continue à obtenir cette erreur dans mes fichiers journaux:

[15-Jan-2013 00:50:04] PHP Warning: Cannot modify header information - headers already sent by (output started at /home/usr/public_html/display.php:1) in /home/usr/public_html/display.php on line 17 

Je jeter un oeil à la page sur la première ligne Je ne vois aucun endroit où des en-têtes auraient pu être envoyés.

display.php:

<?PHP 
require './err/errhandler.php'; 
require './assets/display.php'; 
require './assets/excrate.php'; 

$mysql_host = "sqlhost"; 
$mysql_database = "db"; 
$mysql_user = "user"; 
$mysql_password = "password"; 

$name = $_REQUEST["q"]; 
$type = $_GET["s"]; 
$timeperiod = $_POST["tp"]; 
$currency = $_POST["c"]; 

if(isset($currency)){ 
    setcookie("prefCur", $currency, time()+60*60*24*30*12, "/"); 
    $_COOKIE["prefCur"] = $currency; 
} else { 
    if(!isset($_COOKIE["prefCur"])){ 
     setcookie("prefCur", "usd", time()+60*60*24*30*12, "/"); 
     $_COOKIE["prefCur"] = "usd"; 
    } 
} 
... 

errhandler.php:

<?PHP 
ini_set('display_errors', false); 
ini_set('log_errors', true); 
ini_set('error_log', dirname(__FILE__) . '/_err.log'); 
ini_set('output_buffering', 'on'); 

display.php:

<?PHP 
function strip_name($name) 
{ 
    return preg_replace('/\s\([a-zA-Z 0-9]*\)/', '', preg_replace('/[0-9%]+\s/', '', str_replace(":", "", str_replace("-H", "-h", $name)))); 
} 

excrate.php:

<?PHP $eur = 0.747807; $gbp = 0.621828; $rub = 30.227148; 

Alors je me demande si c'est mon hôte qui est un fichier de l'ajout php donc changer mon htaccess en:

php_value auto_prepend_file none 
php_value auto_append_file none 
Options +FollowSymLinks 
... 

Et je reçois toujours l'erreur affirmant que sont déjà envoyés en-têtes. Je suis perplexe en ce moment. Où les en-têtes sont-ils envoyés en première ligne? Je ne peux même pas activer le buffer de sortie car c'est en première ligne!

EDIT: Il n'y a absolument rien avant le <?PHP, même avec la mise en mémoire tampon de sortie, cela ne fonctionne pas. Il vient vers le bas de la ligne se déplace 17 à la ligne 18.

+0

Quel est le contenu de vos autres fichiers? – Daedalus

+0

'$ _COOKIE [" prefCur "] = $ devise;' est ce code valide? – Class

+0

Pas même un espace vide ou une nouvelle ligne avant votre php? même html simple? Spécialement dans vos fichiers d'inclusion? –

Répondre

0

écriture simple ce code dans le haut du fichier

ob_start(); 
+0

J'ai essayé cela. Je l'ai mis dans errhandler.php: ' user1965359

+0

vous devez également mettre fin à la mise en mémoire tampon de sortie' ob_end_flush(); 'cochez cette case [** qu'est-ce que la bufferisation de sortie? **] (http://stackoverflow.com/questions/2832010/what-is-output-buffering) –

+0

@NonPointer, pas nécessairement. Le tampon de sortie se videra à la fin de l'exécution de ** php **. 'ob_end_flush()' est un excellent moyen de le contrôler, cependant. –

0

Retirez l'appel à setcookie() et vérifier la sortie. Il ne suffit pas de lancer un buffer de sortie, ce n'est pas toujours le meilleur choix. Si l'un de vos fichiers inclus génère quelque chose ou n'importe laquelle des fonctions que vous appelez, lancez des avertissements/notifications, qui constituent des en-têtes en cours de définition.

Encore une fois, supprimez le setcookie() et continuez à partir de là. Il est difficile de diagnostiquer plus loin de l'extérieur. :)

+0

Comment vérifierais-je la sortie? – user1965359

+0

Dans votre navigateur lorsque vous testez la page. Il est important que vous travailliez en arrière en retirant les couches de l'oignon jusqu'à ce que vous trouviez le problème. Si vous supprimez 'setcookie()' et que vous voyez ** aucune sortie visible **, nous pouvons supposer qu'il s'agit d'un espace non autorisé. –

+0

Oh, j'ai essayé ça en créant une autre page test.php avec rien d'autre que ce qui était affiché dans l'OP et ça n'a rien retourné dans les en-têtes (pas d'espace, rien). Où serait l'espace voyou alors? – user1965359

0

Comme OP a déclaré son besoin d'avoir aucune étiquette de fin, ajoutez ?> à la fin de chaque exigence.

+0

[Pour les fichiers qui contiennent uniquement du code PHP, la balise de fermeture ("?>") N'est jamais autorisé.] (http://framework.zend.com/manual/1.12/en/coding-standard.php-file-formatting.html) – user1965359

+0

il n'y a pas besoin de balise de fin '?>' si nous écrivons seulement le code php dans le fichier .. –

+0

Je suppose que j'ai appris quelque chose de nouveau. J'ai toujours pensé que vous auriez à mettre fin à la balise, mais je suppose que vous ne le faites pas pour la seule page php. Y at-il une raison à cela. – Class

Questions connexes