Afficher le sommaire de la page

mardi 29 janvier 2008

Warning: Cannot modify header information - headers already sent by ...

29 01 2008

Une erreur si récurrente que tout le monde la pose encore sur tous les forum :)

Les fonctions php telles que header(), setcookie() ou session_start() sont des fonctions qui manipulent les entêtes http d'une page. Les entêtes http sont là pour spécifier au navigateur client quel type de page il va devoir afficher.

Avant l'appel de ces fonctions il ne faut donc pas générer le moindre flux vers le client.

Que ce soit html ou bien un simple espace blanc ou saut de ligne avant la balise <?php, le serveur renverra l'erreur Warning: Cannot modify header information - headers already sent by ... (ou similaire) ne pouvant plus modifier les entêtes déjà envoyés.

Certains serveurs ne seront pas touchés si leur configuration php contient la variable output_buffering à on

Il est aussi possible de forcer la configuration grâce à une ligne dans un htaccess : PHP_FLAG output_buffering on Cela permet de faire patienter le flux (bufferisation) si une fonction devant modifier les header est appelée avant.



vendredi 25 janvier 2008

exit() et redirection via header()

25 01 2008
<?php
  if($redirect) 
  {
    header("Location: http://developpeur.mediabox.fr");
  }
  
  unlink('mon_fichier_tres_important.pdf');
 
  ma_fonction_qui_nexiste_pas();
 
  unset($_SESSION);
 
  mysql_query("DROP DATABASE mb_db", $connexion); // : )
?>

Essayez ceci pour voir ^^

Bon effectivement je sort l'artillerie lourde, mais il faut savoir que la fin d'une page php continue d'être exécutée sur le serveur malgré une redirection via un header Location.

Du coup vous pouvez faire échouer votre redirection si une erreur survient, faire une manipulation non souhaitée ou redéclarer des variables et ensuite vous demander à quelle endroit tout ceci a été modifié.

Donc un petit conseil :

<?php
  if($redirect) 
  {
    header("Location: http://developpeur.mediabox.fr");
    exit(); // Important !
  }
 
  unlink('mon_fichier_tres_important.pdf');
 
  ma_fonction_qui_nexiste_pas();
 
  unset($_SESSION);
 
  mysql_query("DROP DATABASE mb_db", $connexion); // : )
?>

Stoppez vos scripts après un header :)