par
sadeq » 29 juin 2007, 09:04
Exactement,
Les diférences sont nombeuses entre header(), include() et readfile() notamment en terme d'espace de travail (programme) et de portée de variables.
Header
Après l'appel de header("Location: ..") le programme appelant continue à s'exécuter et s'arrête après un exit (implicite ou explicite).
Après l'exit de l'appelant, header("Location: ..") engage le serveur appelé à charger une page/programme, l'exécuter (s'il y'a code) et renvoyer au client la réponse définitive.
Pour le programme appelant, seules les instructions sans echo sont exécutées après un header()
Ceci dit, le code éventuel de la page appelée par header() n'a pas accès aux variables du programme appelant les espaces de travail sont distincts.
Y-a-t-il alors une possibilité de partager des données entre l'appelant et l'appelé dans le cadre d'une liaison avec header()? La réponse est oui, bien sûr, on peut passer les données partagées sous forme de paramètres par la méthode GET (non cryptée) dans l'URL du header() ainsi la page/programme appelée aura accès aux données dans son espace de travail via la variable super-globale $_GET. Si l'on préfére une méthode de transmission protégée, en lecture/écriture et durable des données on peut utiliser des variables de session via la variable super-globale $_SESSION.
Côté affichage, quand l'appelant se termine après un header() c'est le résultat de l'appelé par le header() qui sera affiché au client car le processus de l'appelant accupe à lui seul le buffer de sortie (Mais attention la sortie standard doit être libre auparavant, le programme appelant ne doit avoir rien affiché avant un header())
Exemple:
La page principale "header.php"
<?php
session_start();
$variable1 = "toto1";
$_SESSION["variable2"] = "toto2";
//header
header ("Location: page_header.php?variable1=$variable1");
//Tentative vaine d'affichage après un header
echo "Je suis le programme appelant";
//Routine traitée même si un header est lancé
file_put_contents("message_apres_header.txt", "Le programme appelant a fait un header le ".date("d/m/Y H:i:s"));
//arrêt explicie de la procédure en cours
exit;
?>
la page appelée "page_header.php"
<?php
session_start();
?>
<h1>Page Header</h1>
<?php
echo "j'ai reçu le(s) paramètre(s) GET suivant(s):<pre>"; print_r($_GET); echo "</pre>";
echo "j'ai reçu le(s) paramètre(s) SESSION suivant(s):<pre>"; print_r($_SESSION); echo "</pre>";
?>
Schéma de fonctionnement
Programme principal ---> appel header() et continue ---> puis fin du principal appelant (aucun echo)
---> redirection = Chargement et exécution de la page/programme appelée ---> fin de l'appelé = réponse au client