2009-08-10 7 views
5

Comment puis-je rediriger en PHP avec cette configuration ci-dessous sans erreurs d'en-tête, je comprends que rien ne peut être imprimé au navigateur avant un en-tête, je cherche une solution, pas une explication.Comment puis-je rediriger en PHP sans erreur d'en-tête?

<?PHP 
// include header 
include ('header.inc.php'); 



// In my body section file if this is a page that requires a user be logged in then 
// I run a function validlogin($url-of-page-we-are-on); inside of that file 
//the function is below, it outputs a redirect to login page if not logged in 

// include body of page we want 
include ('SOME-FILE-HERE.php'); 



// include footer 
include ('footer.inc.php'); 



// here is the function that is in the body pages, it is only called on a page that we require a logged in user so there are hundreds of pages that do have this and a bunch that don't, it's on a page to page basis 
function validlogin($url) { 
    if ($_SESSION['auto_id'] == '') { 
     $msg = 'Please login'; 
     $_SESSION['sess_login_msg'] = $msg; 
     $_SESSION['backurl'] = $url; 
     $temp = ''; 
     header("Location: /"); 
     exit(); 
    } 
} 
?> 

Je voudrais la fonction d'en-tête de php utilisateur et non une méta ou JavaScript

maintainning également une liste de pages qui nécessitent une connexion ou non pas une option ici si possible

Répondre

2

vous ne pouvez pas faire ceci:

<?php 
validlogin($url); // call the function here 
include ('header.inc.php'); 
include ('SOME-FILE-HERE.php'); 
include ('footer.inc.php'); 
?> 

Ou, mettre les fichiers à inclure dans chacun des « QUELQUES-FILE-ICI » fichiers -type, si cela est possible, si vous vous retrouvez avec :

<?php 
validlogin($url); // call the function here 
include ('header.inc.php'); 
?> 

<h1>Page heading</h1> 
...page content etc... 

<?php 
include ('footer.inc.php'); 
?> 
+0

c'est ce que j'ai fait, lire la section mise à jour de ma question – JasonDavis

+0

désolé II avait une autre question concernant le même problème, je ne savais pas que j'étais sur celui-ci, de toute façon c'est comme ça que j'ai fini earliar – JasonDavis

10

utilisation ob_start() dans la première ligne même avant l'include. Vous pouvez donc définir les en-têtes à tout moment.

+0

ob_start() ne résout ce problème, mais je déteste l'utiliser, je suppose que je dois comprendre comment cela fonctionne mieux, il faut la page entière soit enregistrée dans la mémoire au lieu d'afficher ça c orrect? – JasonDavis

+0

pas directement. php utilise un buffer de sortie à tout moment. mais ça marche différemment. le tampon normal peut être vidé vers le navigateur à tout moment. L'utilisation de outputbuffering n'a qu'un seul inconvénient, vous ne pouvez pas utiliser flush() c'est tout. – Rufinus

0

Tant que vous n'avez pas de sortie de script avant la fonction header(), tout devrait bien se passer. Vérifiez qu'il n'y a pas d'écho ou d'espace. Mettre aussi ob_start() au début peut aider. parfois il y a des espaces invisibles - changer le format de votre document en ANSI ou Unicode peut aider! En guise de note (bien que je pense que vous le sachiez déjà) header ne termine pas le script, de sorte que exit() (que vous avez) est une exigence absolue.

+0

IS sortie, Dans mon exemple mon fichier d'en-tête entier est sorti avant de savoir si je suis sur une page qui doit être connecté ou non! – JasonDavis

+0

Sûrement la fonction validlogin() devrait être appelée avant que l'en-tête ne soit inclus? – Meep3D

+0

pas possible que j'ai également mentionné, pas toutes les pages nécessitent un login et les pages sont construites de façon dynamique – JasonDavis

0

Est-ce que footer.inc.php et SOME-FILE-HERE.php écrivent immédiatement dans le flux de réponse? Parce que si c'est le cas, cela ne fonctionnera pas car vous aurez déjà écrit quelque chose avant d'envoyer les en-têtes.

+0

exactement, maintenant vous comprenez la question =) – JasonDavis

+0

ah, eh bien, cela devient plus difficile :) Il y a une fonction, et je Je ne peux pas, pour la vie de m'en souvenir, forcer le processeur à mettre en cache la réponse jusqu'à ce que vous donniez l'ordre de tout envoyer, j'essaierai de chercher ça parce que ça pourrait résoudre votre problème ... –

+0

jasondavis, la réponse de Gumbo est correcte, mais assurez-vous d'appeler ob_end_flush() à la fin du script pour envoyer le flux de réponse mis en mémoire tampon. Fondamentalement, ob_start(); // tout votre code, y compris tout compris ob_end_fush(); –

0

Vous devez mettre en tampon la sortie afin que l'en-tête HTTP ne soit pas envoyé sur la première sortie. Vous pouvez tamponner implicitement toute sortie en activant ouput_buffering ou explicitement en appelant ob_start. Mais ce dernier doit être appelé avant la première sortie, donc idéalement dans la première ligne du script qui est initialement appelé.

0

Comme déjà mentionné par les autres, utilisez ou output_buffer pour mettre en tampon la sortie. En dehors de cela, il est de mon point de vue pas une bonne pratique pour sortir du contenu au milieu du code fonctionnel, mais c'est un autre sujet. Vous pouvez trouver plus d'informations sur Google ou au this Article about Output Buffering in PHP.

2

utilisation { echo '<META HTTP-EQUIV="Refresh" Content="0; URL=process.php">';}