Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP]problem z sesjami
Forum PHP.pl > Forum > Przedszkole
siemieng
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
erix
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?
siemieng
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
Pilsener
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.
erix
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.
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.