Php et gestion des redirection - PHP - Programmation
Marsh Posté le 07-02-2008 à 13:55:13
Une solution est de mettre le nom de la page d'origine ou un identifiant quelconque en champ de type hidden dans ton formulaire...
Marsh Posté le 07-02-2008 à 14:12:22
Une autre solution est de regarder le "referer" ( $_SERVER['HTTP_REFERER'] ) et de renvoyer à l'adresse indiqué.
Attention, c'est une donnée non fiable qui peut en plus être vide.
Il y a deux ans j'avais du faire un système du genre, de mémoire, j'avais pris par ordre de priorité décroissante :
- l'URL indiqué par les formulaire (en php : $_POST['mavariable'] )
- l'URL indiqué dans l'adresse du navigateur ( en php : $_POST['mavariable'] )
- l'URL indiqué par le referer ( en php : "$_SERVER['HTTP_REFERER'] )
Ca nous permettait de renvoyer vers la page qu'on voulait si on avait besoin (par exemple pour renvoyer le visiteur sur la page de discussion quand il valide un formulaire de saisie de message) et sinon on renvoyait juste vers la page précédente (pour le formulaire de connexion par exemple).
Marsh Posté le 07-02-2008 à 14:13:27
Oui j'ai penser à cette solution, maiq comme je l'explique, je redirige vers la page, donc je ne peut plus recupérer les $_POST après la redirection
EDIT => Le HTTP_REFERER il ne me renvera pas direrctement vers ma page de traitement plutôt que le formulaire (qui se trouve a page-2)
Par contre j'ai pas trop compris ce que t'a expliqué plus bas
Marsh Posté le 07-02-2008 à 14:24:30
J'avais essayé mai en fait, mais je galérai un peu, quelle methode me préconise tu avec les sessions?
Du style :
Sur la page de formulaire je créer la sessions $_SESSION['lien_retour'],
par contre, je la supprime quand la variable... parce que quand j'avais essayer elle me suivait partout lol
Marsh Posté le 07-02-2008 à 14:43:03
lilougirl8 a écrit : J'avais essayé mai en fait, mais je galérai un peu, quelle methode me préconise tu avec les sessions? |
Tu la supprimes sur la page qui la lit => tu récupères sa valeur et tu supprimes la variable de session toute de suite après.
Marsh Posté le 07-02-2008 à 14:46:21
rhaa... super ça... merci les gards allé je vai planché sur ça
Marsh Posté le 07-02-2008 à 14:58:59
Je ne comprends pas, t'as ta page avec le formulaire. Le visiteur valide le formulaire et est dirigé vers la page de validation de la saisie. Là, si le formulaire est bon mais qu'il a envoyé une image, tu veux afficher à nouveau le formulaire mais en affichant en plus cette image.
C'est peut être une question con, mais pourquoi tu ne fais pas la validation dans la même page que l'affichage du formulaire (surtout qu'il est assez simple de savoir quand quelqu'un valide un formulaire)
Pour l'idée d'utiliser la session pour stocker des informations de redirection, je dirais que c'est une grosse bétise pour une raison simple : qui te dit que personne ne remplira un premier formulaire, le validera une première fois, puis vas faire autre chose sur le site, en remplis un second, le valide deux fois et plus tard revient sur le premier pour le valider un second coup? C'est un coup à être redirigé vers une partie du site qui n'a rien à voir avec le formulaire de départ (ou d'être renvoyé sur une page inexistante si tu n'as plus rien dedans).
Ce que moi je t'indiquais, c'est juste l'ordre dans lequel prendre en compte les infos de redirection si tu veux une fonction qui ne se limite pas simplement à faire des redirection après la réception d'un formulaire. Si t'as une page intermédiaire qui t'empêche d'utiliser directement le referer avec ce genre de fonction et que t'as besoin de son contenu, alors c'est à elle d'indiquer l'adresse finale que ça soit dans le formulaire ou le lien qui vont provoquer entre autre la redirection.
Marsh Posté le 07-02-2008 à 15:25:46
Alors, bon effectivement les sessions resolvent mon problème, après tout une sessions sert bien a stocker des informations concernant l'utilisateur, le cas ici est d'ou vient t'il lorsqu'il souhaite insérer une photos, pour eviter les erreurs, j'ai définition la sessions juste avant la redirection (et pas dans le formulaire, mais dans la page de traitement, donc si l'utilisateur n'envoi pas de photo la session de sera pas créer; de plus je la supprimer à la reception, et si elle n'est pas créer (pour x raison, j'ai défini un lien standard genre succes.php)
Concernant le fait de le renvoyer sur le formulaire, c'est parce qu'il gere les photos de la fiche créer directement dans le formulaire (où il peut par la suite les modifier et supprimer a souhait) plutot que le rediriger vers une enieme page pour devoir gérer les images...
Si c'est bien réaliser c'est vraiment genant d'utiliser les sessions pour ce genre de chose?
Marsh Posté le 07-02-2008 à 15:27:36
lilougirl8 a écrit : Si c'est bien réaliser c'est vraiment genant d'utiliser les sessions pour ce genre de chose? |
non.
Marsh Posté le 07-02-2008 à 15:36:48
lilougirl8 a écrit : Si c'est bien réaliser c'est vraiment genant d'utiliser les sessions pour ce genre de chose? |
Sur un site qui n'a qu'un ou deux formulaires qui nécessitent une double validation, non pour 99.999% du temps.
Pour un site qui n'a que des formulaires de ce genre, alors ça deviendra de plus en plus gênant au fur et à mesure de l'arrivé de nouveaux formulaires (la redirection pètera à chaque fois que quelqu'un prépare deux formulaires et plus il y a de possibilité, plus ça risque d'arriver)
Maintenant à toi de voir si t'as beaucoup de formulaires dans ce cas là (auquel cas ça peut devenir très gênant) ou si t'en as qu'un ou deux auquel cas ça ne l'es pas du tout.
Marsh Posté le 07-02-2008 à 15:41:15
omega2 a écrit : |
Euh je vois pas comment tu pètes tout, en fait.
A moins d'avoir plusieurs onglets d'ouverts sur le site à la fois. Et c'est relativement peu courant, comme utilisation, surtout de passer sur un formulaire, arrêter de saisir, et passer sur un auter formulaire dans un autre onglet.
Marsh Posté le 07-02-2008 à 16:03:13
Si tu savais le nombre de fois où ça m'est arrivé ... Parfois, çà m'arrive de chercher des infos sur google ou dans le forum avant de répondre ici même et ça m'arrive même de garder un message en court pendant plus d'une heure le temps qu'un trou de mémoire disparaisse.
Pendant ce temps, je ne me contente pas de jouer au démineur et ça m'est déjà arrivé de répondre à une autre discussion avant de valider mon premier message. D'ailleurs, mon premier message dans celle ci a été posté pendant que je préparais une réponse dans une autre discussion de ce forum.
Sur les sites à double validation, c'est encore pire, ça m'est déjà arrivé d'oublier la seconde validation. Quand c'est le cas, je m'en vais lire les autres pages et discussion du site si j'ai encore des trucs à lire et quand je me rend compte que mon message n'est pas passé, je n'ai plus qu'à espérer qu'il sera encore dans les pages précédentes que le navigateur à en mémoire sans quoi je suis obligé de le taper. Le truc, c'est que si je l'ai en mémoire dans le navigateur, je fais alors juste la seconde validation ... qui peut survenir après plusieurs autres double validation.
En résumé, c'est vrai, pour la grande majorité des gens, ça ne posera pas de problème tout simplement par ce que la grande majorité des gens n'utilisent qu'un onglet ou une fenêtre à la fois mais pour certains, ça peut devenir très gênant voire d'un inconfort important.
Marsh Posté le 07-02-2008 à 16:43:13
Si c'est un problème, cf ma solution proposée au départ.
Marsh Posté le 07-02-2008 à 17:09:38
Oui certe ma moi j'ai pa de probleme pour ce probleme la... j'ai penser a tout,...je declare la session seulement au momen du traitement (donc a la validation du formulaire) ensuite je recupere la session dans une varaible et je détrui la session instantanément (a l'affichage de la nouvelle page), l'utilisateur peu rester 3 heure devant sa fiche ça sera toujours bon
Marsh Posté le 07-02-2008 à 18:29:12
lilougirl8 > Tu veux dire que :
1) dans le même traitement tu stockes la valeur dans la session et que tu la récupères x lignes plus loin.
2) tu stockes la valeur dans la session à la première validation et que tu la récupères à la seconde validation.
Si c'est le second cas alors t'as le problème même si tu n'en as pas conscience.
Par exemple, toto arrive sur le site :
14h, il remplis le formulaire A et le valide puis il fait sa pause café (ben oui, le café se prend juste à la fin du repas)
15h, fin de la pause café, il revient, remplis un formulaire B (qui est un autre formulaire à double validation, mais situé sur une autre page) le valide et le revalide (il est alors redirigé vers la page indiqué dans la $_SESSION)
17h, il se prépare à partir, voit qu'il a oublié de revalider le formulaire A et le revalide donc à ce moment là.
Question : à 17h vers quelle page toto sera t'il redirigé?
Marsh Posté le 07-02-2008 à 18:36:08
je croi que tu ne compren pas, je stoque la session uniquement en cas d'envoi de photo, si l'utilisateur passe pas par le bouton photo (qui redirige instentanément vers la page d'upload qui detruit la session) mais valider il ne peut pas y avoir d'erreur.
J'ai "protéger" le probleme en mettant a la fin du traitement
if(isset($_POST[photo]))
j'ouvre le session
je redirige vers la page dupload (et hop plus de session)puisque je la récupere sous forme de variable
If(isset($_POST[valider]))
je redirige l'utilsateur normalement
Marsh Posté le 07-02-2008 à 18:37:53
lilougirl8 a écrit : je croi que tu ne compren pas, je stoque la session uniquement en cas d'envoi de photo, si l'utilisateur passe pas par le bouton photo (qui redirige instentanément vers la page d'upload qui detruit la session) mais valider il ne peut pas y avoir d'erreur. |
hein?
Je comprends pas vraiment comment c'est censé marcher ton truc, là...
Marsh Posté le 07-02-2008 à 18:50:04
Une partie du code du fomulaire donc je recupere bien la page via lien retour
Code :
|
Le traitement du formulaire
Code :
|
Ca c'est a louverture de la page upload
Code :
|
Voili voulou un peu tordu mais ça marche lol
Marsh Posté le 07-02-2008 à 18:50:23
lilougirl8 > exemple fictif basé sur la solution que tu as choisit.
validation du formulaire A :
if(isset($_POST["photo"])) {
$_SESSION["URL"] = "formulaireA.php";
}
validation du formulaire B :
if(isset($_POST["photo"])) {
$_SESSION["URL"] = "formulaireB.php";
}
seconde validation du formulaire A :
if(isset($_SESSION["URL"])) {
redirect($_SESSION["URL"]);
unset($_SESSION["URL"]);
}
seconde validation du formulaire B :
if(isset($_SESSION["URL"])) {
redirect($_SESSION["URL"]);
unset($_SESSION["URL"]);
}
toto remplis et valide A : $_SESSION["URL"] contient "formulaireA.php"
toto remplis et valide B : $_SESSION["URL"] contient "formulaireB.php"
toto revalide B : redirection vers "formulaireB.php" et $_SESSION["URL"] n'existe plus
toto revalide A : redirection vers ??????? mais dit donc, le code il nous dit qu'il y a plus rien dans $_SESSION["URL"].
Peut être que pour le moment tu n'as qu'un seul formulaire sur ton site qui permet d'envoyer des photos, mais comment feras tu quand tu en auras plusieurs? (les joueurs d'échecs appellent ça calculer plusieurs coups d'avance.)
PS : Le comportement sera le même en pire (ça pètera partout où tu utilises des sessions) si tu fais un session un "session_destroy()" au lieu du unset.
PS2 : En fait, le problème sera le même même si le formulaire A et le B sont les même.
PS3 : Ton code montre bien ce que j'essaye de t'expliquer depuis tout à l'heure : ça marche si on ne fait rien entre la première et la seconde validation, mais ça plantera quand t'auras un visiteur tordu qui validera le formulaire puis attendra avant de le valider et en rempliras puis validera un second. En fait même la séquence suivante plante vu que la valeur est supprimé de la session dès la première revalidation :
validation 1er formulaire => validation 2nd formulaire => revalidation 1er formulaire => revalidation 2nd formulaire
Marsh Posté le 07-02-2008 à 18:55:21
comme tu peux voir mon code je redirge pas comme tu me l'indique
EDIT : Juste une question, peut être que je voit de quoi tu parle, si je recupere la session dans une variable...est ce que cette variable durera le temps de la session ou elle est définitive??
Marsh Posté le 07-02-2008 à 18:57:04
lilougirl8 > Comme je peux voir dans ton code, tu es exactement dans le cas dont je parle. Fait donc le test, tu verras bien que c'est le cas.
Marsh Posté le 07-02-2008 à 18:59:50
je croyait que la session stocker dans une variable était définitive ... :s
Marsh Posté le 07-02-2008 à 19:19:13
Juste un question qui me permettrai de comprendre, la valeur de ma variable $lien retour dur t'elle seulement le temps d'une session ?? où le fait qu'elle soit définit comme variable elle conserve sa valeur indéfiniment?
Marsh Posté le 07-02-2008 à 23:01:41
Le truc, c'est que la session est la même quelque soit la fenêtre ou l'onglet ouvert sur le site. Du coup même si la session dure pendant 24h, dès que tu supprimes une valeur qu'elle contient cette valeur est perdu pour toutes les fenêtres ou onglet. Si une autre fenêtre en avait besoin pour réagir convenablement au clic d'un lien ou à la validation d'un formulaire, alors ça posera problème.
En résumé : Les informations qui ne servent qu'à un traitement qui nécessite un enchainement précis de page ne doivent pas être stocké en session. Par contre les informations utile sur des pages parcouru de manière aléatoire (par exemple la liste des objets mis dans le panier d'une boutique) et qu'on ne peut pas retrouver autrement y ont leur place (ce qui veut dire que le prix d'un produit n'y a pas vraiment sa place hors cas spéciaux)
Marsh Posté le 08-02-2008 à 05:34:05
FAut les mater ses internautes, on fait pas 4 choses en même temps, moi si tu mets 4h à remplir un formulaire ça te pète à la gueule parce que la session a implosé
Marsh Posté le 08-02-2008 à 14:36:43
Même si on parcourt le reste du site entre temps? (méchant )
Marsh Posté le 07-02-2008 à 13:52:40
Bonjour,
Voilà je suis confronté a un gros casse tête pour mon site.
Donc le Problème, j'ai créé divers formulaires, correspondant à différentes parties de mon site, la plupart de ces formulaires sont liés à une seule et même page pour l'upload d'image, mai je suis confronté a un problème => Comment rediriger l'utilisateur vers sa page d'origine ?
Explication en détail :
1 - Le formulaire est traiter en externe via une page qui est validé via différents bouton submit ($_POST[valider], $_POST[photo])
2 - La page Externe traite les données et si erreur redirection vers page d'erreur.
3 - Si ya pas d'erreur on enregistre dans la base
4 - Ensuite on redirige l'utilisateur vers la page concerné via un header selon la valeur du $_POST.
Exemple :
Le problème est donc que j'aimerai savoir comment revenir sur le formulaire, (car j'affiche l'image directement sur le fomrulaire) pour que l'utilisateur voye son image pui revalide la page.
J'ai penser à une solution qui serait de recuperer l'url le la page et de la passer par $_GET mais je c'est si c'est bien propre et bien sécurisé? qu'en pensez vous, je sais vraiment pas comment faire.
Merci à tous