Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> [PHP]Sesja - dziwne zachowanie
qrzysztof
post 7.01.2010, 11:38:08
Post #1





Grupa: Zarejestrowani
Postów: 220
Pomógł: 19
Dołączył: 25.04.2009

Ostrzeżenie: (0%)
-----


Witam,

Mam stronę o następującym szkielecie:

[PHP] pobierz, plaintext
  1. <?php
  2. session_start();
  3. if($_POST['costam'])
  4. {
  5. $obiekt= new Obiekt;
  6. #inne nieistotne instrukcje
  7. $_SESSION['obiekt']=$obiekt;
  8. }
  9. if($_POST['inne_costam'])
  10. {
  11. $obiekt=$_SESSION['obiekt']
  12. $obiekt->zrobCos();
  13. #inne nieistotne instrukcje
  14. }
  15. ?>
[PHP] pobierz, plaintext

Lokalnie wszystko działa dobrze. Jedyny problem jest taki, że wywala w 14. linii jakoby funkcja zrobCos() była wykonywana na non-object, w następujących okolicznościach (wszystkie muszą zajść równocześnie):

1) na serwerze,
2) w przeglądarce firefox,
3) tuż po włączeniu tej przeglądarki (tzn nie było wcześniej ani jednego jej okna, przechodzimy od razu na moją stronę),
4) klikamy szybko (nie jakoś błyskawicznie, ale po prostu szybko żeby wywołać część tworzącą obiekt i część z niego korzystającą.

Rozumiem, że obiekt w pierwszej części kodu nie zdążył jeszcze powstać, kiedy wywoływana już jest w drugiej części funkcja na obiekcie. Tyle, że jest to dla mnie dziwne - takie opóźnienia. Ciekawe, że inne przeglądarki tego problemu nie mają. Da się to jakoś wyprostować? Czy może mam łapać wyjątek z komunikatem "Spróbuj jeszcze raz", "Klikaj wolniej" albo "Nie tak szybko mistrzu"?

Ten post edytował qrzysztof 7.01.2010, 11:41:27


--------------------
Znalazłeś sam rozwiązanie swojego problemu? Nie pisz "już wiem, do zamknięcia". Podziel się rozwiązaniem - inni będą mieli łatwiej.
Go to the top of the page
+Quote Post
Meares
post 7.01.2010, 11:43:11
Post #2





Grupa: Zarejestrowani
Postów: 102
Pomógł: 13
Dołączył: 16.10.2009
Skąd: Łódź

Ostrzeżenie: (0%)
-----


  1. if(isset($_POST['inne_costam'])) {
  2. if(!is_object($_SESSION['obiekt'])) $obiekt = new $_SESSION['obiekt']; else $obiekt = $_SESSION['obiekt'];
  3. $obiekt->zrobCos();
  4. }


PS. Używaj isset() i empty().

Ten post edytował Meares 7.01.2010, 11:44:51


--------------------
manual mmocenter
Nie pomagam na PW!
Go to the top of the page
+Quote Post
qrzysztof
post 7.01.2010, 12:08:20
Post #3





Grupa: Zarejestrowani
Postów: 220
Pomógł: 19
Dołączył: 25.04.2009

Ostrzeżenie: (0%)
-----


Jest to na pewno jakieś rozwiązanie, ale uświadomiło mi jedynie, że za mało szczegółów podałem w przykładzie. Tak więc jeszcze raz:

  1. <?php
  2.  
  3.  
  4. if(isset($_POST['wazna_dana']))
  5. {
  6. $obiekt= new Obiekt;
  7. $obiekt->zaktualizuj($_POST['wazna_dana']);
  8. #inne nieistotne instrukcje
  9. $_SESSION['obiekt']=$obiekt;
  10. }
  11.  
  12. if($_POST['inne_costam'])
  13. {
  14. $obiekt=$_SESSION['obiekt']
  15. $obiekt->zrobCos();
  16. #inne nieistotne instrukcje
  17. }
  18.  
  19. ?>


Obiekt niestety nie bez przyczyny jest tworzony w pierwszej części kodu. Są na nim tam wykonywane operacje. Bez nich funkcja zrobCos() nie da oczekiwanych rezultatów.

Dodam jeszcze, że POST['wazna_dana'] i POST['inne_costam'] pochodzą z różnych formularzy, umieszczonych na różnych stronach. Także obydwie te zmienne nie mogą zostać przesłane do skryptu równocześnie. Najpierw jest przesyłana jedna, a potem druga.

Ten post edytował qrzysztof 7.01.2010, 11:59:27


--------------------
Znalazłeś sam rozwiązanie swojego problemu? Nie pisz "już wiem, do zamknięcia". Podziel się rozwiązaniem - inni będą mieli łatwiej.
Go to the top of the page
+Quote Post
Meares
post 7.01.2010, 12:15:39
Post #4





Grupa: Zarejestrowani
Postów: 102
Pomógł: 13
Dołączył: 16.10.2009
Skąd: Łódź

Ostrzeżenie: (0%)
-----


A nie możesz zapisać $_POST['wazna_data'] w $_SESSION['wazna_data']? Wtedy wystarczyło by "rozszerzyć" to co podałem wyżej:
  1. <?php
  2.  
  3. if(isset($_POST['wazna_dana'])) {
  4. $obiekt = new Obiekt;
  5. $obiekt->zaktualizuj($_POST['wazna_dana']);
  6. $_SESSION['obiekt'] = $obiekt;
  7. $_SESSION['wazna_data'] = $_POST['wazna_data'];
  8. }
  9.  
  10. if(!isset($_POST['inne_costam'])) {
  11. if(!is_object($_SESSION['obiekt'])) {
  12. $obiekt = new $_SESSION['obiekt'];
  13. $obiekt->zaktualizuj($_SESSION['wazna_dana']);
  14. } else $obiekt = $_SESSION['obiekt'];
  15. $obiekt->zrobCos();
  16. }
  17. ?>


Ten post edytował Meares 7.01.2010, 12:17:06


--------------------
manual mmocenter
Nie pomagam na PW!
Go to the top of the page
+Quote Post
qrzysztof
post 7.01.2010, 13:01:46
Post #5





Grupa: Zarejestrowani
Postów: 220
Pomógł: 19
Dołączył: 25.04.2009

Ostrzeżenie: (0%)
-----


Owszem, mogę tak zrobić. Ale nie bardzo mi się podoba to rozwiązanie. Uszczegółowię już do końca mój kod

  1. <?php
  2.  
  3.  
  4. if(isset($_POST['wazna_dana']))
  5. {
  6. $obiekt= new Obiekt();
  7. $obiekt->zaktualizuj($_POST['wazna_dana']);
  8. $obiekt->pobierzZBazy();
  9. $_SESSION['obiekt']=$obiekt;
  10.  
  11. $ekran=new Strona1($obiekt);
  12. $ekran->wyswietlStrone();
  13. }
  14.  
  15.  
  16. if($_POST['inne_costam'])
  17. {
  18. $obiekt=$_SESSION['obiekt'];
  19. $obiekt->zrobCos();
  20.  
  21. $ekran= new Strona2($obiekt);
  22. $ekran->wyswietlStrone();
  23. }
  24. ?>


Mogę zachować zmienną "wazna_dana" w sesji a następnie przy odbraniu POST['inne_costam'] zaktualizować obiekt, pobrać dane z bazy i dopiero później wykonać funkcję zrobCos().

Odkryłem jednak coś dziwnego. Polecenie

  1. $ekran=new Strona1($obiekt);
  2. $ekran->wyswietlStrone();


wykonuje się bezbłędnie. A to znaczy, że obiekt w tym momencie był w pełni funkcjonalny. Problematyczna zatem jest część:

  1. $obiekt=$_SESSION['obiekt'];
  2. $obiekt->zrobCos();


Zanim obiekt zostanie rozpakowany i przypisany do zmiennej - wywoływana jest już funkcja zrobCos(). W tym układzie zastosowałem lepsze obejście. Umieściłem to przypisanie w pętli.

  1. do
  2. {
  3. } while (!$obiekt=$_SESSION['obiekt']);


I działa.

Tyle, że to nie jest rozwiązanie tylko właśnie obejście. Bo nadal nie jestem ani trochę mądrzejszy. Jeśli jest faktycznie tak, jak napisałem to czemu, do diabła, problem występował tylko w firefoxie? Na czuja coś mi podpowiada, że tu chodzi o jakieś parametr, który wpływałby na czas dostępu sesji do obiektu i pewnie jest bardziej eleganckie rozwiązanie tego problemu.


--------------------
Znalazłeś sam rozwiązanie swojego problemu? Nie pisz "już wiem, do zamknięcia". Podziel się rozwiązaniem - inni będą mieli łatwiej.
Go to the top of the page
+Quote Post
Meares
post 7.01.2010, 13:30:18
Post #6





Grupa: Zarejestrowani
Postów: 102
Pomógł: 13
Dołączył: 16.10.2009
Skąd: Łódź

Ostrzeżenie: (0%)
-----


Może masz wyłączone cookies w FF? Sesje przechowują swoje dane w plikach tekstowych (w połączeniu z $_GET), lub właśnie w cookies.


--------------------
manual mmocenter
Nie pomagam na PW!
Go to the top of the page
+Quote Post
qrzysztof
post 7.01.2010, 14:12:38
Post #7





Grupa: Zarejestrowani
Postów: 220
Pomógł: 19
Dołączył: 25.04.2009

Ostrzeżenie: (0%)
-----


Nie. Tak jak pisałem - wszystko zależy od szybkości klikania. Przy szybszym są te błędy, przy wolniejszym nie ma.

A niestety moje obejście rozwiązuje problem tylko w jednym miejscu.

W innym gdzie kod zależy od tego czy istnieje SESSION['obiekt'] czy nie, już tego nie da się zastosować.

Jeśli klika się szybko to nigdy nie istnieje.

Jeśli wolniej to wtedy dopiero może istnieć bądź nie. Bo sprawdzania czy istnieje w pętli już nie zrobię. Bez sensu - sprawdza czy istnieje dopóki nie zaistnieje? winksmiley.jpg

Dziwny ten firefox.


--------------------
Znalazłeś sam rozwiązanie swojego problemu? Nie pisz "już wiem, do zamknięcia". Podziel się rozwiązaniem - inni będą mieli łatwiej.
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
1 Użytkowników czyta ten temat (1 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Wersja Lo-Fi Aktualny czas: 14.08.2025 - 06:15