Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP]Trzymanie przechwyconej sesji
Forum PHP.pl > Forum > Przedszkole
darney
Witam.
Wiem że ten temat był poruszany ale nie znalazłem kompletnego wyjaśnienia jaką metode zastosować. Tłumacze już o co chodzi.

Chodzi o powrót do strony na której byliśmy kiedy zostaliśmy poproszeni o zalogowanie

User chce wejść ze strony nauka.php w odpowiedni dzial np nauka.php?lekcja=1;
Skrypt przenosi do login.php prosi o zalogowanie się więc w formularzu tworze ukryte pole
hidden gdzie trzymam tam $_SERVER['HTTP_REFERER'];

Wszystko działa wyśmienicie po zalogowaniu ustawiłem sobię header który przenosi mnie do poprzedniej strony nauka.php?lekcja=1;

Problem który mam i chce rozwiązać i czytałem też że to nie takie proste. Mianowicie

Kiedy popełnimy bład w formularzu strona się przeładuje i w hidden polu znajdzie sie wartość adresu czyli strony logowania login.php

Pytanie jest takie. W jaki sposób zmusić za pomocą sesji do zapamiętania na stałe jednorazowego adresu by nie tracić go przy nieudanym logowaniu.
nospor
Przy wejsciu na logowanie zapamietuj adres w sesji. Jesli pamietany adres jest adresem logowania to go nie zapamietuj. proste smile.gif
darney
Nie siedze za bardzo jeszcze w sesjach i dopiero się ich uczę.

Czyli chodzi o to

jezeli adres jest login.php to
nic nie rob
a jezeli jest inny to

  1. $_SESSION['refero']=$_SERVER['HTTP_REFERER'];



a w formularzu

  1. <input type='hidden' value='<?php echo $_SESSION['refero'] ?>' name='adres_refer'/>
nospor
hidden w formularzu jest już nie potrzebny. Przecież adres zapamiętałeś w sesji.
darney
Nie bardzo mi to wychodzi więc potrzebuje porady co do sesji czy poprawnie przypisuje i zadaje zapytanie.

Próbuje wykonać to tak i nie wiem czy dobrze myśle ale pewnie źle tongue.gif

  1.  
  2. // czy wczesniej deklarowac sesje i czy poprawnie wykonuje zapamiętanie zmiennej w sesji?
  3. $_SESSION['referos']=$_SERVER['HTTP_REFERER'];
  4. $referos=$_SESSION['referos'];
  5.  
  6. if ($referos="xxxxl/login") //czy poprawnie przypisuje?
  7. {
  8. //? co tu mam wpisać ?
  9. }
  10. else
  11. {
  12. // ? tutaj tez nie wiem ?
  13. }
vee
zrób sobie tak:
  1. var_dump($_SERVER['HTTP_REFERER']);


zobacz co CI wyświetla dla strony logowania, a co Ci wyświetla dla innych stron. Będziesz wiedział co wrzucić w warunek IF'a. Po zalogowaniu sprawdzasz skąd był referer, jeśli z logowania to przekieruj np na stronę główną, jeśli z innej strony - to tam przekieruj.
by_ikar
Podczas wejścia na stronę logowania, stwórz sobie warunek który będzie sprawdzał czy dany klucz w tablicy sesji istnieje. Jeżeli nie, to tworzysz taki klucz i przypisujesz do niego referer. Jeżeli refererem będzie strona logowania. To wcześniej musisz umieścić sobie warunek, że do strony mają dostęp wszyscy, prócz zalogowanych i jeżeli ktoś wejdzie zalogowany, to przekierujesz go na stronę główną.

U siebie zrobiłem to tak, że w momencie kiedy jakaś podstrona wymaga uwierzytelnienia, tuż przed samym przekierowaniem na stronę logowania, w sesji jest zapisywany aktualny adres, następnie użytkownik jest przekierowany na stronę logowania. Podczas prawidłowego logowania, na samym końcu kiedy już wszystkie niezbędne operacje się wykonają (aktualizacja ostatniej wizyty użytkownika, aktualnego adresu IP, aktualizacja w tabeli z ludźmi którzy są aktualnie online itp) to jest wcześniej w sesji zapamiętany adres jest przypisywany do zmiennej, a sam adres z sesji jest usuwany. Następnie adres przypisany do zmiennej, jest przekazywany do funkcji która przekierowuje użytkownika na podany adres.

Rozwiązań problemu jest znacznie więcej, bo taki adres możesz również przekazać do adresu i następnie podczas poprawnego logowania pobrać z adresu ten adres i na podany adres przekierować. Osobiście wybrałem sesję, bo wiem że z sesji mi ten adres przypadkiem nie zniknie wink.gif
darney
no to teraz tak.

jesli przejde z innego adresu do logowania to mam
string(143) adres
jeśli logowanie sie nie powiedzie
string(53) adres logowania

Powiedziałeś że jeśli z logowania to przekieruj na strone główną. Otóż ja chciał bym żeby jednorazowo zapamiętał że przeszedłem z adresu i w razie niepowodzenia w logowaniu dalej pamiętał ten adres smile.gif
thek
Logika:
Kiedy masz zapamiętać swoją poprzednią stronę? Gdy wchodzisz na login.php. Tak więc przy wchodzeniu na login.php zapamiętaj referera w sesji LUB dopisz go do GET jako parametr (zależy czy chesz to ukryć czy nie).
Kiedy masz przekierować na ostatnią stronę? Gdy poprawnie się zalogujesz lub naciśniesz link/guzik w stylu "Wróć do ostatnio oglądanej strony". Kiedy to robisz? Kiedy strona na którą przechodzisz wyłapie, że przechodziłeś z login.php, czyli referer to własnie login.php smile.gif Tak naprawdę jedynie tyle wystarczy.
darney
tylko dalej nie rozumiem bo zapisze refa w sesji lecz po ponownym odświeżeniu strony login.php w sesji ma wartość juz adres login.php.
by_ikar
  1. <?php
  2.  
  3.  
  4. if(!isset($_SESSION['zalogowany']))
  5. {
  6. $_SESSION['zalogowany'] = 0;
  7. }
  8.  
  9. if(1 == $_SESSION['zalogowany'])
  10. {
  11. header('Location: /');
  12. }
  13.  
  14. if(!isset($_SESSION['ref']))
  15. {
  16. if(empty($_SERVER['HTTP_REFERER']))
  17. {
  18. $_SESSION['ref'] = '/'; //przekierowanie na główną jeżeli referer jest pusty
  19. } else
  20. {
  21. $_SESSION['ref'] = $_SERVER['HTTP_REFERER'];
  22. }
  23. }
  24.  
  25. if('POST' == $_SERVER['REQUEST_METHOD'])
  26. {
  27. //poprawne logowanie
  28. $_SESSION['zalogowany'] = 1;
  29. //..
  30.  
  31.  
  32. //przekierowanie
  33. $ref = $_SESSION['ref'];
  34. unset($_SESSION['ref']);
  35.  
  36. header('Location: '.$ref);
  37. }


Przykład, dla zobrazowania jak mógłbyś to zrobić.
thek
Ale kto wspomniał, że musisz za każdym przejściem zapamiętywać? Ty zapamiętujesz referera gdy nastąpiło przejście ze strony innej niż login.php. W każdym innym wypadku nie jest to konieczne. A kiedy zrobić przekierowanie na referera? Gdy na login.php było wywołanie poprawne POST, bez błedów (prawidłowe logowanie). Możesz przy okazji zdecydować gdzie przekierować jeśli referer był określoną stroną. Przykładowo jeśli refererem była strona główna, to możesz tak zostawić, albo przenieść do panelu usera. Na pewno można tak zrobić jeśli masz dedykowaną stronę logowania w serwisie. Powrót do niej po zalogowaniu nie ma większego sensu. Lepiej od razu rzucić do profilu lub na główną.
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.