OVH Cloud OVH Cloud

HEADER()

17 réponses
Avatar
Manu
Hello,

Cela fonctionne mais la quelle de ces 2 lignes est la plus juste ?

1] header("Location: http://mon.site.ici/mon_fichier.php");

OU

2] header("Location: http://mon.site.ici/mon_fichier.php",TRUE);

Si je me trompe faites le moi savoir:
La valeur du paramètre "Location" est une URL complete donc, il vaut mieux
remplacer(TRUE) que
ajouté(FALSE) sachant que par defaut on est sur FALSE ?

Merci d'avance,
Emmanuel, débutant....en php.

10 réponses

1 2
Avatar
CrazyCat
Manu wrote:

Hello,

Cela fonctionne mais la quelle de ces 2 lignes est la plus juste ?

1] header("Location: http://mon.site.ici/mon_fichier.php");

OU

2] header("Location: http://mon.site.ici/mon_fichier.php",TRUE);



Si je puis me permettre, aucune des deux :)
Lorsque tu veux ajouter un header de redirection, utilise plutot la
fonction die() qui permet de passer outre les headers deja envoyés (par
exemple un message d'erreur).
Essayes donc:
die("<meta http-equiv="refresh" content="0;
URL=http://mon.site.ici/mon_fichier.php">");

De plus, tu peux très bien utiliser une url relative avec ce meta.


--
Tout sur les eggdrops
http://www.c-p-f.org
ML @

Avatar
Nudrema
CrazyCat wrote:

Manu wrote:

Hello,

Cela fonctionne mais la quelle de ces 2 lignes est la plus juste ?

1] header("Location: http://mon.site.ici/mon_fichier.php");

OU

2] header("Location: http://mon.site.ici/mon_fichier.php",TRUE);



Si je puis me permettre, aucune des deux :)
Lorsque tu veux ajouter un header de redirection, utilise plutot la
fonction die() qui permet de passer outre les headers deja envoyés (par
exemple un message d'erreur).
Essayes donc:
die("<meta http-equiv="refresh" content="0;
URL=http://mon.site.ici/mon_fichier.php">");

De plus, tu peux très bien utiliser une url relative avec ce meta.


Si je puis me permettre, c'est n'importe quoi. Une redirection se
fait par HTTP via la fonction header() en php. Pas par l'écriture
d'une obscure balise meta qui n'a rien de standard et dont on
n'est pas assuré du résultat. Pour "passer outre un éventuel
message d'erreur", la solution est plus probablement à chercher
dans la fonction error_reporting(E_NONE), qui permettra en outre
de ne pas révéler accidentellement une éventuelle faille du site
aux visiteurs.

De plus, la fonction die() ne sert pas à créer une redirection ou
quoi que ce soit, mais à faire avorter le script. À n'utiliser
qu'en dernière extrémité, c'est à dire jamais en dehors de phases
de débogage.

Pour revenir à la question, les deux sont acceptables, et aucun
n'est plus correct que l'autre. Le second a comme différence
qu'il remplace un en-tête Location déjà envoyé plutôt que de s'y
ajouter. Sans le TRUE, si tu envoies deux headers('Location:
...'), les deux seront envoyés. Sinon, seul le second.

--
Nudrema (S.F.)
http://tw.o0o.ch


Avatar
Olivier Miakinen

Cela fonctionne mais la quelle de ces 2 lignes est la plus juste ?
1] header("Location: http://mon.site.ici/mon_fichier.php");
OU
2] header("Location: http://mon.site.ici/mon_fichier.php",TRUE);


Lorsque tu veux ajouter un header de redirection, utilise plutot la
^^^^^^(*)

fonction die() qui permet de passer outre les headers deja envoyés (par
exemple un message d'erreur).
Essayes donc:
die("<meta http-equiv="refresh" content="0;
URL=http://mon.site.ici/mon_fichier.php">");


ÀMHA, l'avantage principal de l'entête HTTP sur la balise META, c'est
que cela fonctionne aussi bien pour les binaires (par exemple les
images) que pour les pages HTML. Un autre avantage, c'est que si le
visiteur passe par un proxy, eh bien le proxy redemandera la page
correcte tout seul comme un grand, au lieu de remonter la page HTML puis
d'attendre une nouvelle requête.

Enfin, moi ce que j'en dis...

Olivier


(*) La balise META n'est pas un header HTTP. Cela va peut-être sans
dire, mais toujours mieux en le disant.


Avatar
CrazyCat
Nudrema wrote:

Si je puis me permettre, c'est n'importe quoi. Une redirection se
fait par HTTP via la fonction header() en php. Pas par l'écriture
d'une obscure balise meta qui n'a rien de standard et dont on
n'est pas assuré du résultat. Pour "passer outre un éventuel
message d'erreur", la solution est plus probablement à chercher
dans la fonction error_reporting(E_NONE), qui permettra en outre
de ne pas révéler accidentellement une éventuelle faille du site
aux visiteurs.


Evidemment, j'oubliais que tout le monde sauf moi à accès au php.ini du
serveur et peut donc modifier le error_reporting directement, et aussi
que tout le monde maitrise tellement le php que modifier ce type de
fonctions est aisé. On se demande même pourquoi ce NG existe.

De plus, la fonction die() ne sert pas à créer une redirection ou
quoi que ce soit, mais à faire avorter le script. À n'utiliser
qu'en dernière extrémité, c'est à dire jamais en dehors de phases
de débogage.


Je m'inscris en faux. J'adore cette fonction qui me permet de sauter
allègrement d'une page à une autre quel que soit l'état final d'un
traitement.

Pour revenir à la question, les deux sont acceptables, et aucun
n'est plus correct que l'autre. Le second a comme différence
qu'il remplace un en-tête Location déjà envoyé plutôt que de s'y
ajouter. Sans le TRUE, si tu envoies deux headers('Location:
...'), les deux seront envoyés. Sinon, seul le second.



Par contre, je veux bien faire mon mea culpa: le "aucune des deux" était
mal tourné, je voulais dire qu'aucune n'était plus juste que l'autre,
les deux se valent.

Et pour désamorcer les grands penseurs du PHP, je signale que
l'utilisation du die(), même si elle est soit-disant juste pour le
débuggage, est très pratique (NB ce mot: pratique). Je suis désolé de ne
pas avoir suivi de cours pour le PHP, j'ai appris sur le tas et je ne
pense pas me débrouiller trop mal avec des solutions qui, si elles ne
sont pas RFC compliant, sont efficaces et stables.

--
Tout sur les eggdrops
http://www.c-p-f.org
ML @

Avatar
CrazyCat
Olivier Miakinen wrote:


Cela fonctionne mais la quelle de ces 2 lignes est la plus juste ?
1] header("Location: http://mon.site.ici/mon_fichier.php");
OU
2] header("Location: http://mon.site.ici/mon_fichier.php",TRUE);


Lorsque tu veux ajouter un header de redirection, utilise plutot la


^^^^^^(*)

fonction die() qui permet de passer outre les headers deja envoyés (par
exemple un message d'erreur).
Essayes donc:
die("<meta http-equiv="refresh" content="0;
URL=http://mon.site.ici/mon_fichier.php">");



ÀMHA, l'avantage principal de l'entête HTTP sur la balise META, c'est
que cela fonctionne aussi bien pour les binaires (par exemple les
images) que pour les pages HTML. Un autre avantage, c'est que si le
visiteur passe par un proxy, eh bien le proxy redemandera la page
correcte tout seul comme un grand, au lieu de remonter la page HTML puis
d'attendre une nouvelle requête.


Oui, effectivement, mais je tachais de donner une réponse pour le
problème particulier, à savoir rediriger sur une autre page :)

Enfin, moi ce que j'en dis...


si si, tu as eu raison :)

(*) La balise META n'est pas un header HTTP. Cela va peut-être sans
dire, mais toujours mieux en le disant.


(*) elle peut être assimilée non?

--
Tout sur les eggdrops
http://www.c-p-f.org
ML @



Avatar
Savut
Une note pour remettre CrazyCat sur la bonne voie. Tel que defini dans
php.net

---------------------------------------------------------------------------
void exit ( [string status])
void exit ( int status)

Note : exit() n'est pas une véritable fonction, mais un élément de langage.

exit() termine l'exécution du script courant. Elle n'a pas de valeur de
retour (et pour cause!), mais elle utilisera le message status comme message
de fin d'exécution.

Note : La fonction die() est un alias de la fonction exit().
---------------------------------------------------------------------------

Donc son usage est de terminer l'execution du script et si on veux, envoyer
un message d'erreur au besoin.
A noter aussi que exit() est a preferer. Aussi un simple note, exit() et
die() devrait etre le plus souvent evite car cela fait des code assez
patche, c'est a dire, avec certaine manque de control de condition, de
verification d'erreur, etc... Sauf certaines cas... :D

Aussi pour header(), j'ajouterai que header(location) sert a renvoyer le
server sur une autre fichier, sans necessairement que ca sois du html, des
images, des bin, etc.
Par exemple j'ai ceci:

index.php
-----------------------------------------------
<img src='im.php'>

im.php
-----------------------------------------------
<?php
if (file_exists("dodo.gif") {
header("location: dodo.gif");
} else {
header("location: notFound.gif");
}
?>

Contrairement a ce que la plupart disent, Header("location: ../") marche,
les url relative marchent.


Je pense avec mes 8 ans d'experiences en PHP d'etre en mesure de participer
au debat.


Au fond, je ne dirais pas que ton code ne marche pas, mais c'est pas la
bonne methode, et que dans certain utilisation plus specifique, ton die()
pourrais te jouer de vilain tour.

sont efficaces et stables ??? Etre efficace et stable c'est comprendre
comment ca marche le language avant tout.

Merci de ta conprehension.

Savut
Avatar
John Gallet
Bonsoir,

De plus, la fonction die() ne sert pas à créer une redirection ou
quoi que ce soit, mais à faire avorter le script. À n'utiliser
qu'en dernière extrémité, c'est à dire jamais en dehors de phases
de débogage.




C'est une vision des choses qui est très restrictive. je serais curieux de
voir comment tu gères les cas d'erreur.


Par contre, je veux bien faire mon mea culpa: le "aucune des deux" était
mal tourné
Mais si, mais si, aucune des deux.

http://faqfclphp.free.fr/#ss2.11

Et pour désamorcer les grands penseurs du PHP, je signale que
l'utilisation du die(), même si elle est soit-disant juste pour le
débuggage, est très pratique (NB ce mot: pratique).


Je n'utilise jamais die pour le débuggage, pour le débugage j'utilise une
fonction avec un niveau de trace activable. Ce que d'aucuns appellent
débugage, c'est de la gestion d'erreur à la goret.

Je suis désolé de ne pas avoir suivi de cours pour le PHP
Il ne s'agit pas de PHP ou pas, mais d'algorithmique, c'est tout. qui je le

rappelle est indépendante du langage.
exit() est utilisée pour arrêter un script. Si l'algorithme que tu fais
l'exige, tu utilises exit(). Point barre.

sont pas RFC compliant, sont efficaces et stables.
Ce qui veut donc dire que tes algoritmes sont corrects, ce qui est le plus

important dans un programme informatique.

a++
JG


Avatar
John Gallet
Bonsoir,

die("<meta http-equiv="refresh" content="0;
(*) La balise META n'est pas un header HTTP. Cela va peut-être sans

dire, mais toujours mieux en le disant.
(*) elle peut être assimilée non?




Pas dans son fonctionnement. C'est du HTML tout ce qu'il y a de plus correct
et non une zone d'entêtes. Tu peux mettre du texte en dessous avec une
valeur de refresh de quelques secondes, ce que header(Location) ne te
permettra jamais de faire.

a++
JG



Avatar
John Gallet
Je pense avec mes 8 ans d'experiences en PHP d'etre en mesure de participer
au debat.



8 ans d'expérience ? Quelqu'un peut me rappeler la date de sortie de PHP/FI
siouplait ?

JG

Avatar
Olivier Miakinen

[...] je tachais de donner une réponse pour le
problème particulier, à savoir rediriger sur une autre page :)


Ben en fait, la réponse était contenue dans la question. Que
reproches-tu au juste au « header("Location: ...") » ?

(*) La balise META n'est pas un header HTTP. Cela va peut-être sans
dire, mais toujours mieux en le disant.


(*) elle peut être assimilée non?


Je voudrais bien te faire plaisir, mais non, je ne peux pas répondre par
l'affirmative. Le header HTTP doit être reconnu par quiconque utilise
HTTP pour récupérer des pages web. La balise META, au contraire, dépend
de l'application qui aura récupéré la page, cherchera à l'interpréter,
puis éventuellement décidera que c'est du HTML et que les caractères
'<', 'M', 'E', 'T', 'A', etc., mis bout à bout, ont une signification et
que cette signification fait qu'il pourrait être bon de laisser tomber
la page en cours et de réouvrir une connexion HTTP pour faire une autre
requête...


1 2