Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> [PHP]problem z sesjami
siemieng
post 1.07.2009, 20:57:15
Post #1





Grupa: Zarejestrowani
Postów: 101
Pomógł: 7
Dołączył: 16.01.2007

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


Widze ze przesadzilem z wielkoscia opisu problemu w poprzednim poscie, dlatego przedstawie go raz jeszcze znacznie skracjac:

Problem dotyczy sesji (istota problemu w najbardziej skrotowej wersji):

  1. <?php
  2. //zmienna weryfikujaca poprawnosc sesji uzytkownika
  3. session_start(); (isset($_SESSION['isValid'])) ? $_SESSION['isValid'] : true;
  4.  
  5. //funkcja bledu
  6. function error() {
  7.    $_SESSION['isValid'] = false;
  8. }
  9.  
  10. //funkcja sesji
  11. function session() {
  12.   if(!$_SESSION['isValid']) {
  13.       $sessionName = session_name();
  14.       if (isset($_COOKIE[$sessionName])) {
  15.          setcookie($sessionName, '', time()-3600, '/');
  16.       }
  17.   }
  18.   echo '<meta http-equiv="refresh" content="0; url=index.php"/>';
  19. }
  20.  
  21. //wywolanie funckji sesji
  22. session();
  23.  
  24. //dowolny kod z if-em
  25. $var = (!$result) ? die(error()) : $result;
  26. ?>


Problem polega na jak gdyby wykonaniu instrukcji warunkowej bez spelnienia jej warunkow. W tym przypadku jeśli zmienna $result = true, zostanie wykonana funkcja error() - znaczy w oryginalnej postaci jest ona znacznie rozbudowana (dochodzi zapisanie danych bledu, wyswietlenie komunikatu o bledzie) - te "podfunkcje" funckji bledow nie zostana wykonane, jedynie zostanie zmieniona wartosc $_SESSION['isValid'] na flase.

Zastanawiam sie jak jest to mozlwie, poniewaz warunke na 100% nie jest spelniony - podmienienie $var = (!$result) ? die(error()) : $result; na echo $var = (!$result) ? 'false' : 'true'; zawsze wyswietli 'true'. Zeby zmienna $_SESSION['isValid'] miala wartosc true, musze usunac funkcje error() z die() lub w samej funkcji error() musze usunac $_SESSION['isValid'] = false;

Prosze o poddanie pomyslu dlaczego tak sie dzieje, przeciez warunek nie jest spelniony czyli wywolanie funckji nie powinno nastapic, a ono jak gdyby nastepuje (jak gdyby bo jak pisalem z zadan funckjji error wykonane zostaje tylko zmiana wartosci $_SESSION['isValid'] na false), z gory dzieki pozdaawiam

Ten post edytował siemieng 1.07.2009, 20:59:02
Go to the top of the page
+Quote Post
erix
post 1.07.2009, 21:25:32
Post #2





Grupa: Moderatorzy
Postów: 15 467
Pomógł: 1451
Dołączył: 25.04.2005
Skąd: Szczebrzeszyn/Rzeszów




Cytat
te "podfunkcje" funckji bledow nie zostana wykonane, jedynie zostanie zmieniona wartosc $_SESSION['isValid'] na flase.

Czyli masz na myśli to, że nie wykonuje się cała funkcja?

A gdy zamienisz die" title="Zobacz w manualu PHP" target="_manual na coś innego, to wówczas działa ok?


--------------------

ZCE :: Pisząc PW załączaj LINK DO TEMATU i TYLKO w sprawach moderacji :: jakiś błąd - a TREŚĆ BŁĘDU? :: nie ponaglaj z odpowiedzią via PW!
Go to the top of the page
+Quote Post
siemieng
post 1.07.2009, 22:30:38
Post #3





Grupa: Zarejestrowani
Postów: 101
Pomógł: 7
Dołączył: 16.01.2007

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


Cytat(erix @ 1.07.2009, 22:25:32 ) *
Czyli masz na myśli to, że nie wykonuje się cała funkcja?

A gdy zamienisz die" title="Zobacz w manualu PHP" target="_manual na coś innego, to wówczas działa ok?

Tak dokladnie, z funckji error() wykonuje sie tylko podmiana zmiennej sesyjnej na false, reszta sie nie uaktywania, gdy podmienie die(), zostawie samo error() jest identycznie, natomiast usuniecie z if'a funckji error() i wstawienie tam czegokolwiek innego zeby sprawdzic czy dziala, zawsze dziala :/

Co wiecej niektore if'y dzialaja, nie mam pojecia jak i dlaczego czasem sie tak dzieje, calosc bardziej szczegolowo opisalem we wcesniejszym poscie Temat: PHPsamoczynne_wykonanie_if_a__problem_z_sesja tyle ze chyba rozmiarem odstraszaml:P

Ten post edytował siemieng 1.07.2009, 22:34:31
Go to the top of the page
+Quote Post
Pilsener
post 2.07.2009, 00:02:57
Post #4





Grupa: Zarejestrowani
Postów: 1 590
Pomógł: 185
Dołączył: 19.04.2006
Skąd: Gdańsk

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


Dla mnie mało zrozumiałe jest Twoje podejście, np:
  1. <?php
  2. die(error());
  3. ?>
- po co zabijać parser, gdy pojawił się błąd i po co ta funkcja? Zabijanie ma sens, gdy np. wykryjemy próbę ataku itp. Nigdy tego nie próbowałem, stąd moje obawy, czy ta funkcja w ogóle się wykona.

Cytat
zmienia wartosc zmiennej $_SESSION['isValid'] na false
- jesteś tego pewien? A co będzie, gdy zmienna nie zostanie ustawiona jako true?

Nie lubię też zapisów bez {} - mało czytelne jak dla mnie, jestem konserwatystą.

I po co sesje do tego? Ciasteczka? (a co gry user ich nie używa) Przekierowania? Np. taka funkcja:
  1. <?php
  2. function session() {
  3.      if(!$_SESSION['isValid'])
  4.      {
  5.             $sessionName = session_name();
  6.             if (isset($_COOKIE[$sessionName])) {
  7.                         setcookie($sessionName, '', time()-3600, '/');
  8.                }
  9.       }
  10.       session_destroy();
  11.       echo '<meta http-equiv="refresh" content="0; url=index.php"/>';
  12. }
  13. ?>
- czym to się różni od include? Funkcja ma zwracać jakiś wynik w zależności od podanych parametrów, a nie wysyłać fragment strony do przeglądarki.

Moim zdaniem zmierzasz w złą stronę i zbyt to skomplikowałeś, masz po prostu odebrać adres i zwalidować go, jeśli nie jest poprawny lub nie prowadzi do żadnej treści to ustawić komunikat błędu i tyle.
Powód edycji: [erix] połączyłem tematy
Go to the top of the page
+Quote Post
erix
post 2.07.2009, 10:16:35
Post #5





Grupa: Moderatorzy
Postów: 15 467
Pomógł: 1451
Dołączył: 25.04.2005
Skąd: Szczebrzeszyn/Rzeszów




Spróbuj zainstalować jakiś debugger, bo przyznam, że to trochę dziwny przypadek.

Daj phpinfo" title="Zobacz w manualu PHP" target="_manual, info o platformie, systemie, etc.


--------------------

ZCE :: Pisząc PW załączaj LINK DO TEMATU i TYLKO w sprawach moderacji :: jakiś błąd - a TREŚĆ BŁĘDU? :: nie ponaglaj z odpowiedzią via PW!
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 - 15:53