Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Zmiana stanu sesji na stronie
Forum PHP.pl > Forum > PHP
mr_aaa
Witam,

tworzę sobie swój własny system logowania i wylogowywania użytkowników.

Mam pewien problem - gdy dany użytkownik wpisze swoje dane i kliknie 'zaloguj' i dajmy na to wykona się:
  1. $_SESSION['zalogowany']=1;
  2. $_SESSION['uzytkownik']=$user['id'];

Po czym strona się przeładuje i jak sobie dam np. var_dump($_SESSION) na samym początku strony to stan ten zmiennej jest null, a dalej gdzieś w kodzie jest tak jak powinno być.

Jak powinienem sprawdzać stan sesji, czy też jak powinienem wywoływać funkcje by wszystko było ok?

EDIT: Jak się wylogowuje to jest analogicznie - zmiany z session_destroy nie są widoczne np. na początku strony
ADeM
Masz na początku każdego pliku rozpoczętą sesję?
mr_aaa
tak,
generalnie robię to na jednym pliku i jak sobie czytam, to widzę że generalnie stosowana jest zasada, że logowanie ma swój plik, wylogowywanie swój. Ja to robiłem wszystko tylko na index.php, gdzie logowanie czy wylogowywanie było zmienną w $_GET. Czy to się generalnie stosuje? Być może bardziej logiczne jest stosowanie osobnych plików?
ADeM
Może pokaż lepiej kod?
mr_aaa
funkcja sprawdzająca czy wyświetlać przycisk zaloguj czy wyloguj (tu właśnie problem, że źle się pokazują-np zaraz po wylogowaniu jest nadal przycisk do wylogowania):
  1. function LoggedButton(){
  2. if($this->IsLoggedIn() ){
  3. echo '<a href="/wyloguj">wyloguj</a>';
  4. }
  5. else{
  6. echo '<a href="/logowanie">logowanie</a>';
  7. }
  8. }


kod logowania:

  1. $login=$_POST['login'];
  2. $password=sha1($_POST['password']);
  3. $query="Select * from uzytkownicy where mail=:login and haslo=:password and checksum='1'";
  4. $stmt=$this->pdo->prepare($query);
  5. $stmt->bindValue(':login', $login);
  6. $stmt->bindValue(':password', $password);
  7. $stmt->execute();
  8. $user=$stmt->fetch();
  9. if($user){
  10. $_SESSION['zalogowany']=1;
  11. $login=$user['id'];
  12. $_SESSION['uzytkownik']=$login;
  13. $id=$user['id'];
  14. $date = date("y-m-d, G:i:s");
  15. $query="Update uzytkownicy set last_visited='$date' where id='$id'";
  16. $stmt=$this->pdo->prepare($query);
  17. $this->Komunikat('Zalogowano');
  18. return $user;
  19. }


Na początku index.php oczywiście session_start();

funkcja wylogowania:
  1. function Logout(){
  2. unset($_SESSION['uzytkownik']);
  3. unset($_SESSION['zalogowany']);
  4. $this->Komunikat('Zostałeś/aś poprawnie wylogowany/a.');
  5. }
ADeM
Nie pokazałeś zbyt dużo... Mówiąc prawdę, to najważniejsze usunąłeś.
Prawdopodobnie błąd jest taki, że w złym miejscu wylogowujesz ;-)
mr_aaa
Pewnie masz rację. Jednak jak to zrobić by było dobrze? Mam klasę User gdzie mam funkcję do wylogowania i jak tą funkcję wywołać na początku strony po kliknięciu przycisku wyloguj?
ADeM
Tak samo jak dalej, tylko że na początku.
Jak już Ci wcześniej powiedziałem: podaj kod. Tak, to sobię możemy tylko gdybać co, gdzie i jak...
mr_aaa
tylko którą część kodu? bo nie wiem co tu może być jeszcze bardziej istotne?
ADeM
Miejsca, w których działasz na sesjach ;-)
Ewentualnie cały plik.
mr_aaa
Tworzę sesje przy logowaniu:
  1. function UserLogin(){
  2. if($_SESSION['zalogowany']==1){
  3. $this->Komunikat('Jesteś już zalogowany/a.');
  4. }
  5. else{
  6. if(!isset($_POST['submit']) ){
  7. require_once('Page/zalogujform.method.php');
  8. }
  9. elseif(isset($_POST['submit']) ){
  10. $login=$_POST['login'];
  11. $password=sha1($_POST['password']);
  12. $query="Select * from uzytkownicy where mail=:login and haslo=:password and checksum='1'";
  13. $stmt=$this->pdo->prepare($query);
  14. $stmt->bindValue(':login', $login);
  15. $stmt->bindValue(':password', $password);
  16. $stmt->execute();
  17. $user=$stmt->fetch();
  18. if($user){
  19. $_SESSION['zalogowany']=1;
  20. $login=$user['id'];
  21. $_SESSION['uzytkownik']=$login;
  22. $id=$user['id'];
  23. $date = date("y-m-d, G:i:s");
  24. $query="Update uzytkownicy set last_visited='$date' where id='$id'";
  25. $stmt=$this->pdo->prepare($query);
  26. $this->Komunikat('Zalogowano');
  27. return $user;
  28. }
  29. else{
  30. $this->Komunikat('Wpisane dane są nieprawidłowe.');
  31. require_once('Page/zalogujform.method.php');
  32. return false;
  33. }
  34. }
  35. }
  36. }


Usuwam przy wylogowaniu:
  1. function Logout(){
  2. unset($_SESSION['uzytkownik']);
  3. unset($_SESSION['zalogowany']);
  4. $this->Komunikat('Zostałeś/aś poprawnie wylogowany/a.');
  5. }

W index.php jest session_start();

I tyle. Ale skoro chciałbyś więcej kodu, to domyślam się, że gdzieś czegoś nie robię?
ADeM
To wszystko co mi podajesz, to tylko metody. Pokaż jak tego wszystkiego używasz...
Fifi209
Klasa pisana jest chyba po przeczytaniu "Obiektowy PHP4", tak to wygląda, choćby ze względu na brak modyfikatorów dostępu.

Czepię się również bazy i skryptu, dokładniej:
  1. $date = date("y-m-d, G:i:s");
  2. $query="Update uzytkownicy set last_visited='$date' where id='$id'";

Znasz taki typ danych jak DATETIME ?!

Jeżeli tak bardzo chcesz korzystać z dobrodziejstw PDO to rób to wszędzie, bo póki co raz bindujesz parametry a raz wrzucasz do stringa w najgorszy z możliwych sposobów.
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.