Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> [PHP] Sesje, Problemy ze zrozumieniem jej działania
naj
post 23.10.2009, 21:38:36
Post #1





Grupa: Zarejestrowani
Postów: 21
Pomógł: 1
Dołączył: 23.10.2009

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


Dobry wieczór,

mam nadzieję, że znajdzie się użytkownik zechcący odpowiedzieć na moje prosto-głupie pytanie. A jest to pytanie straszne: do czego służy sesja? Jak ją wykorzystać?
Użytkownik mi się zalogował za pomocą swojego loginu i hasła i żeby poszczególne strony, na które klika "wiedziały", że to on - należy wykorzystać sesję. Ale jaki dokładnie jest mechanizm wykorzystania sesji? Z góry dziękuję za odpowiedź.
Go to the top of the page
+Quote Post
MateuszS
post 23.10.2009, 21:47:16
Post #2





Grupa: Zarejestrowani
Postów: 1 429
Pomógł: 195
Dołączył: 6.10.2008
Skąd: Kraków/Tomaszów Lubelski

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


Załóżmy że skrypt ma wyświetlać na podstronie nick zalogowanego, np. Zalogowany jako Mateusz. $_POST tablica po kolejnym przeładowaniu przestaje być ważna (spróbuj dać echo $_POST['cos'] na różnych podstronach, zobaczysz że wyświetli tylko raz po naciśnięciu submita). Dzięki sesji, ten login jest dostępny cały czas aż do wyłączenia przeglądarki praktycznie lub wygaśnięcia sesji po czasie (php.ini).

Dzięki
  1. $_SESSION['nick']=$_POST['nick'];


Możemy na każdej podstronie, wszędzie gdzie chcemy wyświetlać zawartość $_SESSION['nick']. Dzięki temu że sesja od czasu utworzenia jest aktualna przez cały czas (możemy odświeżać, cofać itp. a sesja jest) sprawdzać czy user jest zalogowany, np. przy poprawnym wpisaniu hasła dajemy

  1. $_SESSION['zalogowany']=1; // zalogowany


a potem na każdej podstronie do której ma dostęp tylko user sprawdzamy

  1. if($_SESSION['zalogowany']==1) {
  2. echo 'jestes zalogowany jako '.$_SESSION['nick']; // z poprzedniego skryptiu
  3. // reszta strony panelu usera
  4. } else {
  5. echo 'nie jestes zalogowany';
  6. }


To tak w najwiekszym skrocie. Mysle ze cos zrozumiales, sa to same podstawy, ogolnie ale na poczatek mysle wystarczy (za ew. bledy przepraszam)

aha i pamietaj o

na samym poczatku strony w 1 linijce


--------------------
O! Zimniok :P
Go to the top of the page
+Quote Post
paw-e-l
post 23.10.2009, 21:49:19
Post #3





Grupa: Zarejestrowani
Postów: 115
Pomógł: 23
Dołączył: 27.06.2009
Skąd: Jaworzno

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


sesja to element tablicy $_SESSION . wykorzystuje się je do przekazywania danych pomiędzy stronami. w sesji możesz np przechowywać unikalny kod użytkownika wygenerowany przy logowaniu. na każdej podstronie porównujesz ten kod z kodem w bazie i w ten sposób sprawdzasz tożsamość usera.

// kurde już refleks nie ten winksmiley.jpg

Ten post edytował paw-e-l 23.10.2009, 21:50:57
Go to the top of the page
+Quote Post
InosU31
post 23.10.2009, 22:10:31
Post #4





Grupa: Zarejestrowani
Postów: 221
Pomógł: 14
Dołączył: 11.03.2009
Skąd: Lubaczów

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


ja Ci powiem tyle ze nie rozumialem sesji - tzn. jak to dziala dopuki nie wyswietlilem sobie tego identyfikatora sesji a pozniej juz jakos poszlo z ta sesja;-)

  1. echo session_id()."<br>";


po odswierzeniu strony numerki sie zmieniaja;-) a zeby je zachowac mozna to zrobic np. przypisujac id sesji danemu userowi;-)

Pozdrawiam
Go to the top of the page
+Quote Post
naj
post 23.10.2009, 22:10:49
Post #5





Grupa: Zarejestrowani
Postów: 21
Pomógł: 1
Dołączył: 23.10.2009

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


Dziękuję za dotychczasowe odpowiedzi. Wstyd ogromny zadawać takie pytania, bo czuję, że to same podstawy, niemniej chyba zaczyna mi coś switać :]. Proszę jeszcze o sprawdzenie czy moje myślenie jest poprawne:

W bazie mam tabelę z polami 'id', 'hasło', 'login', 'imię' oraz 'id_sesji'.
Użytkownik loguje się, wiem dokładnie który wiersz (albo inaczej - jednoznacznie wskazane 'id') w tabeli jest związane z tym użytkownikiem.

Rozpoczynam sesję i pobieram numer tej sesji


  1. session_id(); //


Teraz tak, session_id() należy chyba wpisać w pole 'id_sesji' w bazie danych w wierszu właściwym dla zalogowanego użytkownika? Czy dobrze rozumiem, że funkcja session_id sięga do danych zapisanych na dysku komputera użytkownika, czyli można na każdej podstronie wywołując session_id() odnaleźć wiersz w bazie MySQL i tym samym zidentyfikować użytkownika, który stronę przegląda? Czy może jakoś inaczej trzeba odnajdywać ID sesji, które przypisane jest użytkownikowi przeglądającemu podstrony?

Ten post edytował naj 23.10.2009, 22:12:47
Go to the top of the page
+Quote Post
Meares
post 23.10.2009, 22:33:55
Post #6





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

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


Prościej jest zapisać dane użytkownika do tablicy sesyjnej (można zrobić wielowymiarową), i wrzucić do niej najważniejsze dane użytkownika. Np.
  1. $cos = mysql_getch_assoc(mysql_query('SELECT * FROM `users` WHERE `id` = "'.(int)$_POST['id'].'"'));
  2. $_SESSION['daneUzytkownika'] = array(
  3. 'nick' => $cos['nick'],
  4. 'haslo' => $cos['haslo']
  5. // itd...
  6. );


--------------------
manual mmocenter
Nie pomagam na PW!
Go to the top of the page
+Quote Post
InosU31
post 25.10.2009, 19:40:35
Post #7





Grupa: Zarejestrowani
Postów: 221
Pomógł: 14
Dołączył: 11.03.2009
Skąd: Lubaczów

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


Sesja dziala do momentu zamkniecia przegladarki - czyli jak zamkniesz badz zniszcysz sesje to przy ponownym uruchomieniu strony dostaniesz nowy identyfikator.

Logujesz sie na strone i podajac login i haslo skrypt szuka cie w bazie danych czy taki user i haslo sie zgadzaja. Jesli tak to mozesz zrobic tak :

Logiujesz sie i podczas logowania dajesz : session_regenerate_id() - wtedy zmienia ci sie id sesji. nastepnie zapisujesz to id sesji do bazy (mozesz dodatkowo sie zabezpoieczyc i wrzucic do bazy ip oraz przegladarke jakiej uzywasz w danym czasie) - najlepiej w osobnej tabeli ktora ma tymczasowe dane - czyli takie ktore sie skasuja po wylogowaniu - pamietaj aby dac po wylogowaniu session_destroy().

druga tabelka moze wygladac tak :
id, id_usera, id_sesji, ip_usera, przeglagarka

Robisz osobny skrypt ktory dolaczysz do kazdej podstrony a w nim np:

  1. // pobierasz dane z bazy gdzie id_usera z tabeli user = id_usera z tabeli tym_sesje - ip, przegladarka, id_sesji
  2.  
  3. if ($_SERVER['REMOTE_ADDR'] == $ip_z_bazy && $[i]_SERVER[/i]['HTTP_USER_AGENT'] == $przegladarka && session_id() == $id_z_bazy)
  4. {
  5. echo "wszystko ok";
  6. return true;
  7. }
  8. else
  9. {
  10. echo "Nie masz uprawnien do ogladania tej strony!";
  11. return false;
  12. }


mniej wiecej tak to wyglada - sory jesli cos zle napisalem ale dawno robilem te sesje:/

Pozdrawiam
Go to the top of the page
+Quote Post
naj
post 27.10.2009, 19:03:53
Post #8





Grupa: Zarejestrowani
Postów: 21
Pomógł: 1
Dołączył: 23.10.2009

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


Czyli majac oddzielna baze, w ktorej zapisane zostalo ID sesji na każdej z podstron muszę porównać session_id() z tym co mam zapisanego w bazie. Jeśli jest takie w bazie, znaczy to, że użytkownik jest zalogowany i mogę pobrać jego id itp?
Go to the top of the page
+Quote Post
InosU31
post 28.10.2009, 20:51:44
Post #9





Grupa: Zarejestrowani
Postów: 221
Pomógł: 14
Dołączył: 11.03.2009
Skąd: Lubaczów

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


ja juz nie pamietam - bo gdzies zgubilem skrypt w ktorym robilem sesje - ale np. mozesz tak porownac id_sesji z tym ktore aktualnie masz. Bo gdy podasz dobry login i haslo i sie zalogujesz to zostaje zmienione id_sesji (jak uzyjesz session_regenerate_id()) i zapisujesz nowe id sesji w bazie w osobnej tabelce ktora jest tymczasowa - ale jak ja stworzyc musisz poszukac na google bo ja nie wiem - i do niej wpada tez id usera zalogowanego. dane w tej tabelce sa do zakonczenia polaczenia z baza wiec sie pozniej same kasuja - jakos tak to dziala.

W kazdym badz razie pozniej piszesz taki skrypt ktory sprawdza ci czy session_id() == id z bazy danych i dolanczasz to do kazdej podstrony np.:

  1.  
  2. $sql = "SELECT * FROM tabelka_userzy INNER JOIN tabelka_sessja WHERE id_usera = id_tab_sessji";
  3. itd...
  4. foreach ($sql as $record => $value)
  5. {
  6. if (session_id() == $record['id_tab_sesji'])
  7. {
  8. return true;
  9. }
  10. else
  11. {
  12. echo "nie mas zdostepu do tej strony";
  13. return false;
  14. }
  15.  


i pozniej do kazdej strony na popczatek dorzucasz :

  1. require_once "sprawdzanie_id_sesji.php";


i tak to mniejwiecej wyglada - przynajmiej ja tak bym to widzial;-)

Pozdrawiam
Go to the top of the page
+Quote Post
tua1
post 29.10.2009, 00:37:47
Post #10





Grupa: Zarejestrowani
Postów: 42
Pomógł: 0
Dołączył: 23.10.2009

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


dorzucę swoje pytanie do tematu, a czy stosując obiektowy php (którego notabene nie znam za bardzo, ale tak przyszło mi do głowy), można przy logowaniu tworzyć obiekt klasy np. User i w niej zapisać id sesji, przeglądarkę itd,
bez konieczności przy każdorazowym zmianie strony wysyłać zapytanie do bazy.

Jest to możliwe?
Jeśli tak to może jakiś prosty przykładzik.

Pozdrawiam
Go to the top of the page
+Quote Post
naj
post 29.10.2009, 12:42:04
Post #11





Grupa: Zarejestrowani
Postów: 21
Pomógł: 1
Dołączył: 23.10.2009

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


Tua1

NIe znam się na programowaniu obiektowym. Z drugiej strony przy sesjach jest już zaimplementowany mechanizm, który pozwala obyć się bez zapytań do bazy - rejestrowanie zmiennych związanych z sesją.

Jeśli w swoim skrypcie stronajeden.php używasz zmiennej $city
  1. $city="Puck";

i potrzebujesz jej na innych podstronach to możesz zarejestrować ją za pomocą funkcji



Dzięki temu na kolejnej podstronie stronadwa.php po wystartowaniu sesji będziesz miał dostęp do zmiennej $city. Wykonanie czegoś takiego w stronadwa.php:
  1. echo $city;

Powinno zwrócić wartość zmiennej $city ze skryptu w stronajeden.php, czyli "Puck". Mam nadzieję, że to wyjaśnia sprawę.


Dodam, że cała moja wiedza pochodzi z poniższej strony:
http://4programmers.net/PHP/Sesje_w_PHP

Go to the top of the page
+Quote Post
tua1
post 29.10.2009, 19:55:44
Post #12





Grupa: Zarejestrowani
Postów: 42
Pomógł: 0
Dołączył: 23.10.2009

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


dzięki za szczegółową odpowiedź.
Go to the top of the page
+Quote Post
InosU31
post 29.10.2009, 20:39:38
Post #13





Grupa: Zarejestrowani
Postów: 221
Pomógł: 14
Dołączył: 11.03.2009
Skąd: Lubaczów

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


z tymi sesjami to wogule jest skomplikowana sprawa - jak dla mnie. jest na pewno kilka mozliwosci sparwdzania tego id czy przez baze czy przez rejestrowanie sesji. Trzeba samemu poprubowac i sie odnalesc w tym - to chyba najlepsza nauka;-)

pozdrawiam
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: 27.04.2025 - 06:15