Accueil » Articles » Erreur fréquente avec la fonction header() et la solution

Erreur fréquente avec la fonction header() et la solution

Que vous vouliez faire une redirection, ou avoir plus de contrôle sur l'entête HTML de vos réponsesLien externe, la fonction header() est tout indiquer.

Mais la fonction doit être utilisée AVANT que le moindre contenu ne soit envoyé au client.

Qu'est-ce que ça veut dire? Ça veut dire que vous ne devez pas avoir envoyé directement (echo, print, etc) ou indirectement (retour de chariot, espace, etc) d'output au client. C'est probablement l'erreur typique que j'ai vue le plus souvent sur les forums.

Voici des exemples :

<?php
  header("Location: http://www.google.ca/");
?>
Correct

<html>
<head>
<?php
  header("Location: http://www.google.ca/");
?>
<title>Vers Google.ca</title>
</head>
  <body>
  </body>
</html>
Warning: Cannot modify header information - headers already sent by...


<?php
  header("Location: http://www.google.ca/");
?>
Warning: Cannot modify header information - headers already sent by...

Pourquoi la troisième version n'a tel pas marché? Le code est le même pourtant que la première version? C'est bien simple, il y a un retour de chariot à la première ligne. Ce retour de chariot est automatiquement envoyé au client, rendant la fonction header() inutilisable.

La solution

Assurez-vous de ne rien envoyer au client avant d'utiliser header(), mais si vous n'avez pas le choix, vous pouvez utiliser deux autres fonctions PHP (ob_start() et ob_end_flush()) pour vous aider. Noter que cette solution ne fonctionne que si ob_start() est à la première ligne, comme header() devrait être.

Voici comment :

<?php
  ob_start()
  echo "J'envoie des données au client, donc header() ne devrait pas marcher.";
  header("Location: http://www.google.ca/");
  ob_end_flush()
?>
Correct

ob_start() met en cache tous les outputs et empêche PHP d'envoyer quoi que ce soit au client, tant que la fonction ob_end_flush() n'est pas appelée. N'oublier pas d'appeler ob_end_flush(), ou sinon rien ne se passeras.

Cet article vous a plu? Lisez mes autres articles pour découvrir d'autres trucs.

Sébastien Brodeur

Il est strictement interdit de reproduire ce texte sans la permission écrite de l'auteur.


Commentaire(s)

Ajouter un commentaire

Les gens qui ont consulter cet article, ont aussi consultez ceux-ci :


Valid XHTML 1.0 Transitional

Valid CSS!