Erreur fréquente avec la fonction header() et la solutionQue vous vouliez faire une redirection, ou avoir plus de contrôle sur l'entête HTML de vos réponses 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 solutionAssurez-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. Sébastien Brodeur Il est strictement interdit de reproduire ce texte sans la permission écrite de l'auteur. Commentaire(s)boiss - 2006-12-20 09:13:28
une manière tout aussi efficace de regler le problème des redirections :
créé une fonction qu'on nommera redirect. function redirect($url) { if (!headers_sent()) header("Location: $url"); else die('<script type="text/javascript">location.href="'.$url.'";</script>'); } ensuite lorsqu'on veux rediriger, on apelle simplement <?php redirect('http://www.google.com'); ?> sans se soucier si les headers ont déjà été envoyés. Sébastien Brodeur - 2006-12-22 09:46:54
Très bonne idée. Mais il faut faire attention, on ne peut pas mettre une balise <script> n'importe où dans un fichier HTML. Par exemple, le tout ne doit pas se trouver dans avant la balise <html>.
benouche - 2008-02-20 10:33:52
et si javascript est désactivé ? tu l'as dans le ... ;)
Brolo - 2008-07-22 04:48:10
Merci pour cette article, j'avais un problème avec header, car j'aimais trop contourner ce dernier pour éviter les érreurs, avec le code
ob_start() et ob_end_flush() j'ai eu la solution. Super ey merci Jeff - 2008-08-15 07:22:52
Wow ! Enfin je vais pouvoir me débarasser de ce maudit Warning php !!
Merci Eric - 2009-01-23 03:52:57
Merci pour cet article simple et utile. Comme brolo le coup du ob_start() / ob_end_flush() m'a bien aidé, j'étais à 2 doigts de passer par nue redirction javascript...
Yall - 2009-03-31 03:31:08
Merci pour le tuyau.
Ajouter un commentaire |
Les gens qui ont consulter cet article, ont aussi consultez ceux-ci : |
|