Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: php a nowa sesja w zakładce
Forum PHP.pl > Forum > PHP
Gizypl
Witam serdecznie
Dopadła mnie pewna bezsilność - nie bardzo mam pomysł na rozwiązanie problemu:

jest strona z kreatorem - przechodzi kilka podstron i zadaje pytania
w sesji są zbierane odpowiedzi
następnie na podstawie tych odpowiedzi jest generowane podsumowanie = wyliczenie
wszystko jest ok poza sytuacją gdy użytkownik odpali w przeglądarce drugą zakładkę
do do tego kreatora - oczywiście dane z jednej zakładki zmieniają jednocześnie zbierane dane
z drugiej zakładki - czyli nie mogę poprowadzić równolegle dwóch osobnych wyliczeń - jednego w jednej zakładce a drugiego w drugiej.

Czy ktoś ma może jakiś sprawdzony sposób na to lub może poda pod czym szukać rozwiązania?

Pozdrawiam serdecznie.
PS> domyślam się iż pewnie JS pomoże ale wolał bym uniknąć.
ohm
Może lepiej bazować na cookie? Dla każdego nowego wyliczenia tworzysz cookie i w nim zapisujesz odpowiednio wybrane opcje.
johny_s
Tylko że cookie też jest to samo dla całej przeglądarki, możesz z jakimś dodatkowym parametrem w linku się pobawić, ale to też jak go skopiuje na nic się zda.
Gizypl
wygląda mi na to że dla serwera php nowe okno w przeglądarce niczy się nie różni do starego
ani ciacho ani id sesji ani parametr w linku
Crozin
1. Przy wejściu na pierwszy krok kreatora wygeneruj jakiś losowy identyfikator. md5(uniqid()) wystarczy.
2. Identyfikator ten będziesz na każdym kroku kreatora (włącznie z pierwszym) przekazywał w jakimś ukrytym polu formularza.
3. Dane w sesji składuj w $_SESSION['ankiety'][$identyfikator][...]
Gizypl
wersja z generowanym losowym identyfikatorem problem rozwiązuje połowicznie
- czyli można poprowadzić 2 kreatory ale znowu gdy użytkownik w trakcie działania kreatora np. na 2 lub 3 stronie otworzy link w nowym oknie to sprawa pada bo mam 2 okna z tym samym identyfikatorem
bo głównie o to chodzi - trochę źle przekazałem inf - nie potrzebuję 2 kreatorów tylko chcę uniknąć sytuacji gdy użytkownik idzie jednym kreatorem a drugi otwiera "dla pamięci" i pierwszy kreator nadpisuje dane drugiego więc po chwili pomimo że na stronie w kreatorze A są wyświetlone dane A to w sesji są dane z B i naciśnięcie przycisku "zamawiam" w kreatorze A zamówi produkt B.

Sephirus
Ja bym zastosował mechanizm tokenów z zabezpieczeń przed CSRF. Trochę rozwiązanie podobne do Crozina.

Otóż:

Klient otwiera stronę z formularzem. Generujesz jakiś TOKEN (hash, md5, sha1 - whatever), zapisujesz go do sesji pod "form_token" i wrzucasz do ukrytego pola formularza.

Klient wysyła form - > sprawdzasz czy token z sesji jest taki jak token z forma - jeśli tak działasz jeśli nie - dajesz info o błędzie.

Jak to może rozwiązać Twój problem?

Klient będąc na stronie z formularzem otwiera nową zakładkę. W tym momencie nowa zakładka z tym formem ma aktywny token (zastąpił on stary token w sesji). Aktywną stroną zatem jest teraz strona nowa.

Przy wysyłaniu danych ze strony 1 dostaniesz błąd. Przy wysyłaniu ze strony 2 (nowej) wszystko pójdzie. Rozwiązanie oczywiście skaluje się na n otwieranych nowych okien.

Możesz w tej styuacji dodać dodatkowy "bajer". Na stronie wrzucić ajaxa który co powiedzmy 5 sekund będzie odwoływał się do skryptu php wysyłając token. PHP zwróci info czy jest on aktualny. Jeśli nie możesz wyświetlić na stronie info w stylu "OTWORZYŁEŚ NOWĄ ZAKŁADKĘ Z FORMULARZEM - SESJA W TEJ ZAKŁADCE WYGASŁA... bla bla bla" itp wink.gif
Gizypl
Hej wróciłem ponownie do tematu
i nadal po grzebaniu w sieci nie udało mi się znaleść sensownego sposobu na rozróżnienie zakładek w przeglądarce - jakieś id czy inny sposób i wyglada na to iż jedynym wyjściem jest pomysł Sephirusa (dzięki!) czyli ograniczenie do jednego aktywnego formularza.
Czy może ktoś ma jakiś świerzy pomysł ?

Pozdrawiam
freewalker
możesz pobawić się z bazą danych, przykładowo wystartowanie formularza zakłada rekord w bazie danych, którego ID jest zwracane i przesyłane przez formularz w następnych krokach. Wystartowanie w nowej zakładce formularza założy nowy rekord w bazie danych, jednocześnie powodując, że ID dwóch formularzy będzie inne i wprowadzane dane z różnych zakładek będą dotyczyły tylko konkretnego formularza założonego w danej zakładce. Pomysł z tokenem też nie jest głupi, dla bezpieczeństwa dobrze byłoby zawrzeć unikalny token dla każdego wywołanego formularza.
com
@up bez sensu, bo wygenerujesz mu zaraz miliard rekordów do bazy smile.gif
Gizypl
Kurcze - po zastosowaniu metody Sephirusa doszedł nowy prolem - nie mogę stwierdzić czy strona została otwarta w nowej zakładce czy po prostu odświerzona - i wygląda na to że się tego nie przeskoczy bo jedna i druga funkcja działa w oparciu o ten sam mechanizm.
Sposób z bazą to to samo tylko że zamias losowego id generowanego przez php jest id generowane przez baze = te same ograniczenia.
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.