Comment bien utiliser les en-têtes !

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 =)

Ce document intitulé « Comment bien utiliser les en-têtes ! » issu de CodeS SourceS (codes-sources.commentcamarche.net) est mis à disposition sous les termes de la licence Creative Commons. Vous pouvez copier, modifier des copies de cette page, dans les conditions fixées par la licence, tant que cette note apparaît clairement.