Et oui, parce qu'on le répète très souvent, j'ai décidé d'en faire un petit tutoriel.
Pour commencer, il faut savoir en premier lieu que les en-têtes se placent toujours en premier ! C'est à dire avant de pouvoir commencer à écrire du code html.
Je m'explique un peu mieux. Imaginons que vous vouliez utiliser les cookies sur votre site, mais que vous faites ça :
<?php echo 'Je te met un cookie sur ton PC'; setcookie('moi', ' ', time() +3600); ?>
A l'exécution du script, on se retrouve avec une belle page d'erreur (je vous laisse découvrir ce que ça contient :)) !
Pourquoi ? Parce qu'utiliser les cookies doit se faire avant TOUTE sortie html sur le navigateur de votre visiteur.
Ce que j'appelle sortie html, c'est par exemple :
-> un echo()
-> un print()
-> du html tout simple
Donc, dans mon exemple du haut, je dois faire :
<?php setcookie('moi', ' ', time() +3600); echo 'Je te met un cookie sur ton PC'; ?>
Et là, comme par magie, ça marche !
Cet exemple fonctionne également pour les sessions !
<?php echo 'je teste ta session'; session_start(); ?>
Ce script renverra (à quelques détails près) la même erreur que pour notre exemple de cookie. Il faut donc mettre session_start() au dessus de tout !
Également pour la fonction header(). C'est la où beaucoup de gens ne comprennent pas. Imaginons ceci :
<?php echo 'Je vais te rediriger sur ma page web'; header('Location: index.php'); ?>
Bah là c'est pareil, il ne faut rien avant le header() (sauf d'autres en-têtes, si y'a un session_start() par exemple, ca ne gène en rien du tout ) ! Ce type d'erreur est flagrante sur les formulaires spécialement.
Si vous ne pouvez pas faire autrement (avis personnel, cela signifie pour moi que le site est un peu mal codé,on ne place jamais des en-têtes en plein milieu d'une page), il existe cependant une autre solution :
<?php ob_start(); ob_end_flush(); ?>
Grâce à ces 2 fonctions, vous allez enfin pouvoir réaliser votre rêve : utiliser les en-têtes comme bon vous semble !
Petit exemple, imaginons un script avec session_start() :
<?php ob_start(); echo 'je teste ta session'; session_start(); ob_end_flush(); ?>
Et la, ça marche bel et bien.
Mais pourquoi ?
Ces 2 fonctions sont utilisées pour faire du cache principalement.
http://fr.php.net/ob_start
http://fr.php.net/manual/fr/function.ob-end-flush.php
Voila voila, au moins comme ça, c'est dit :)
Bisou =)