Page 1 sur 1

Alternative à header()

Posté : 14 avr. 2008, 21:01
par pi-R
Bonjour à tous,

Je vous explique mon problème : pour éviter les inconvénients de la fonction header(), un ami m'a conseillé d'utiliser la fonction suivante :
 function redir($url) {
	echo '<script language="JavaScript">
        setTimeout("window.location=\''.$url.'\'"); 
        </script>';
}
Pour l'utiliser, je n'ai que ça à marquer :

Code : Tout sélectionner

redir('tapage.php');
On m'a aussi donné ça, mais je ne sais pas comment l'utiliser :
if ($HTTP_GET_VARS['page'] == "accueil.php") {
include ('accueil.php');
}
Je voulais utiliser une redirection dans une partie administration. J'entends par là qu'une fois sur la page index.php, on doit rentrer un identifiant et un mot de passe. En envoyant ces données, on créé une session, et ça nous dirige vers la page espacemembre.php, en y affichant les liens principaux dont on a accès, et certaines informations.

Lorsque l'on rentre ces informations, la page index.php semble être actualisée (l'information est envoyée, mais on retourne sur index.php), et on est dirigé vers la page espacemembre.php. Le problème est qu'aucune donnée n'apparaît sur la page espacemembre.php, et qu'on est directement redirigé vers la page index.php, nous indiquant que notre session a expiré...

Bref, je suis bloqué. Si vous pouviez m'éclairer!

Je tiens à préciser qu'avec la fonction header(), le script marchait... Cependant, j'ai préféré changer avec cette obligation de ne pas mettre du html avant...

Merci d'avance

pi-R

Ps : pour ceux qui veulent voir mon compte en entier, me contacter par MP!

Posté : 14 avr. 2008, 21:07
par Berzemus
et euh.. quel est le problème avec les headers, dont tu parles ?

Posté : 14 avr. 2008, 21:13
par pi-R
et euh.. quel est le problème avec les headers, dont tu parles ?
Il faut utiliser header() avant tout code html... Ça me posait problème.

Posté : 14 avr. 2008, 21:16
par Sékiltoyai
Le fait qu'il faille envoyer tous les headers avant d'envoyer des données. Mais le truc, c'est qu'avec la bufferisation de sortie, tu peux n'envoyer aucun texte avant des headers. Le mieux étant tout de même de séparer le php du html et d'utiliser un moteur de template par exemple.

Posté : 14 avr. 2008, 21:21
par pi-R
Le fait qu'il faille envoyer tous les headers avant d'envoyer des données. Mais le truc, c'est qu'avec la bufferisation de sortie, tu peux n'envoyer aucun texte avant des headers. Le mieux étant tout de même de séparer le php du html et d'utiliser un moteur de template par exemple.
Je sais bien, mais les template me sont totalement inconnues... J'aimerais d'abord "maitriser" le php avant de me tourner vers d'autre domaine...

Posté : 14 avr. 2008, 21:57
par Sékiltoyai
Tu n'as pas nécessairement à utiliser un moteur de templates, juste utiliser l'idée, c'est à dire de commencer par exécuter tout le php, et ensuite seulement faire l'affichage, en passant les variables au html.

Posté : 15 avr. 2008, 16:07
par geqr
si tu es véritablement bloqué par header(), utilise la redirection html à savoir :

Code : Tout sélectionner

<META HTTP-EQUIV="Refresh" CONTENT="nbsecondes;URL='page.html'">
cordialement

Posté : 15 avr. 2008, 16:38
par steph29
une jolie fonction :twisted:
function redirection($url){  //fonction permettant de rediriger vers une autre page
    if (headers_sent()){
        print('<meta http-equiv="refresh" content="0;URL='.$url.'">');
    } else {
        header('Location: '.$url."\n");
    }
	exit;
}
marche merveilleusement bien ;)

Posté : 15 avr. 2008, 16:43
par Sékiltoyai
Résultat tu te retrouves avec une balise meta en plein milieu d'un <body> ou bien avant le <html>, ce n'est vraiment pas très malin…

Posté : 15 avr. 2008, 17:03
par geqr
c'est dans l'unique cas où tu es vraiment bloqué sans pouvoir faire autrement. C'est certe pas très propre mais ca peut rendre service.

Posté : 15 avr. 2008, 17:21
par caroube
L'utilisation d'un refresh pour effectuer une redirection est formellement désapprouvée par le w3c
Note. Some user agents support the use of META to refresh the current page after a specified number of seconds, with the option of replacing it by a different URI. Authors should not use this technique to forward users to different pages, as this makes the page inaccessible to some users. Instead, automatic page forwarding should be done using server-side redirects.
http://www.w3.org/TR/1999/REC-html401-1 ... #h-7.4.4.2

Maintenant, chacun fait comme il le sent ...

Posté : 15 avr. 2008, 19:28
par Nagol
il n'y a pas d'alternatives valables pour remplacer header de même que header ne sert pas qu'à faire des redirections. Le mieux est de comprendre pourquoi header ne peut être utilisé après un envois d'html et d'adapter son code. Dans la majeure partie des cas les incompréhension relatives à header() sont les mêmes que les incompréhensions relatives à la notion de script côté serveur. De plus comme l'a dit sekil les templates c'est un must-implement de nos jours, dès le premier site.

Posté : 16 avr. 2008, 09:33
par steph29
en effet ma fonction n'est pas la plus propre au cas ou un flux de donnees est deja envoye, mais cela limite considerablement le risque d'erreur.
Il est evident que ce type de fonction est a utilise au plus tot des traitements afin de ne pas ralentir le temps d'execution et la qualite de la redirection.

pour ma part j'utilise toujours cette fonction, et les redirections se font systematiquement coté serveur, ca doit venir de mon cote parano...
apres c'est une idee d'implementation, je suis le seul a touche a mes scripts rien n'empeche de faire du log en cas de !headers_sent... ;)

Posté : 16 avr. 2008, 11:35
par Sékiltoyai
Je sépare le php du html, j'utilise même quelquefois mon moteur de templates, et je n'ai pas beoin d'astuce pour me rassurer, je sais que je n'aurais pas de headers already sent…