Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP]Sesje czy Cookies?
Forum PHP.pl > Forum > Przedszkole
Matimor
Witajcie
Czy sesje działają na IP komputera, na którym była stawiona dana zmienna $_SESSION na ileś tam, zauważyłem ostatnio, że po jakimś czasie bodajże kilkadziesiąt minut, zmienna resetuje mi się z powrotem na Default. Jest to dla mnie bardzo ważne iż oglądający bez tego raczej nie będzie mógł swobodnie oglądać strony. Czy lepsze będzie wykorzystanie Cookies? Jeżeli tak to jak zapisać zmienna i odczytywać ją przy każdym wejściu na stronę.
Naster
http://php.net/manual/en/function.setcookie.php

i

Tam masz wszelkie przykłady też winksmiley.jpg
Pawel_W
Cytat(Matimor @ 6.01.2010, 20:30:20 ) *
Witajcie
Czy sesje działają na IP komputera, na którym była stawiona dana zmienna $_SESSION na ileś tam, zauważyłem ostatnio, że po jakimś czasie bodajże kilkadziesiąt minut, zmienna resetuje mi się z powrotem na Default. Jest to dla mnie bardzo ważne iż oglądający bez tego raczej nie będzie mógł swobodnie oglądać strony. Czy lepsze będzie wykorzystanie Cookies? Jeżeli tak to jak zapisać zmienna i odczytywać ją przy każdym wejściu na stronę.


sesje nie są na ip tylko na przeglądarkę winksmiley.jpg

działają podobnie jak ciastka, z tym wyjątkiem, że do ciastek możesz się dobrać z poziomu javascript, a do sesji nie, no i sesje wygasają po zamknięciu przeglądarki winksmiley.jpg

jak chcesz operować na sesjach to na początku dokumentu musisz dodać session_start

najlepiej wrzuć do googla php sesje i przeczytaj jakiś tutorial winksmiley.jpg
darko
Cytat(Pawel_W @ 6.01.2010, 20:50:28 ) *
no i sesje wygasają po zamknięciu przeglądarki winksmiley.jpg

Bzdura, sorry winksmiley.jpg
Matimor
To chyba lepiej to na ciacha zrobić, bo po zamknięciu przeglądarki to może zacząć denerwować powoli odwiedzających.
thek
Matimor... Sesję można ustawić na dowolny czas. Choćby i na rok. Tylko ustawienie tam jako czas życia 0 sprawia, że są one do czasu zamknięcia przeglądarki. każda odpowiednio duża określa do kiedy (bo jest to w zasadzie niemal nic innego niż znacznik czasu). Poczytaj o sesjach dokładnie to ci się wyjaśni. A jeszcze lepiej przejrzyj się skryptom php związanym z autoryzacją użytkowników w różnych frameworkach. Wtedy będziesz miał odpowiedni materiał do przemyśleń.
Pawel_W
Cytat(darko @ 6.01.2010, 20:56:16 ) *
Bzdura, sorry winksmiley.jpg

dzięki za poprawienie, o ty mnie wiedziałem wstydnis.gif
Brick
Ja bym nie odsyłał kolegi do studiowania jakiś skryptów, bo nie doświadczonej osobie ciężko będzie czasem w nich się połapać. Zwłaszcza że często są mocno rozbudowane, korzystają z różnych oddzielnych funkcji itd.

Może przyda się krótkie objaśnienie:
Uruchomienie sesji w PHP powoduje zapisanie pliku cookie z identyfikatorem sesji PHPSESSID.
Istotne są tutaj dwa parametry:
1. czas życia sesji
2. czas ważności cookie

Wbrew pozorom nie oznaczają tego samego.

1. Czas życia sesji domyślnie jest ustawiony w PHP na 1440 sekund (czyli 24 minuty). Po 24 minutach bezczynności użytkownika ważność sesji wygasa, co w praktyce ma przełożenie na wylogowanie. NIE oznacza to, że sesja jest ważna 24 minuty od zapisania cookie czyli od zalogowania się, bez względu na poczynania użytkownika! Po każdym uruchomieniu session_start() czyli w praktyce kliknięciu czegokolwiek na stronie, czas liczy się od nowa.

2. Czas ważności cookie domyślnie jest ustawiony na zero. Gdy jest równy zero zamknięcie przeglądarki powoduje skasowanie pliku cookie, co w praktyce ma przełożenie na wylogowanie. Dopóki użytkownik jest na stronie - cookie jest ważne cały czas, bez limitu. Jeżeli ustawimy czas ważności cookie na np. 3 godziny to po zamknięciu przeglądarki i ponownym otwarciu strony będzie on dalej zalogowany. Ale na drugi dzień już nie.
Ten parametr warto ustawiać np na miesiąc jeżeli użytkownik zaznaczy opcję "zapamiętaj mnie" podczas logowania.
Uwaga!
Zamknięcie przeglądarki kasuje cookie, ale nie robi tego zamknięcie panelu w przeglądarce.

Oba parametry możemy zmienić za pomocą funkcji ini_set(). Odpowiednio:
Kod
1. ini_set('session.gc_maxlifetime', 3600); //czas trwania sesji ustawiamy na 1 godzinę
2. ini_set('session.cookie_lifetime',3600); //ważność cookie ustawiamy na 1 godzinę


Niestety, są serwery na których funkcja ini_set nie działa (została wyłączona przez administratora). W takim wypadku nic nie można poradzić na krótki czas życia sesji

Czym skutkuje krótki czas życia sesji?
Zależy od tego co robić może użytkownik. Np. mamy na stronie forum. Użytkownik zalogował się, zaczyna pisać bardzo długi post. Po 20 minutach odchodzi od komputera i wraca za godzinę. Kończy post i klika "zapisz". Wtedy pojawia się komunikat "nie jesteś zalogowany". Użytkownik rozbija monitor lub dzwoni do nas (wykonawcy) z epitetami.
Trzeba zatem przewidzieć taką sytuację i odpowiednio napisac skrypty żeby wyłapały taki tekst i go przywróciły. Tak jest, o ile się nie mylę, na tym forum.

Podsumowując:
Sesje są zalecane jako bezpieczniejsze, ale jeżeli chcesz mieć uniwersalny kod działający płynnie na każdym serwerze, z możliwością regulowania czasu zalogowania, to lepiej jest skorzystać z cookie.

Korzystanie z obydwu rozwiązań najlepiej zgłębić na php.net. W skrócie:
Wartości zmiennych odczytujemy z:
1. $_SESSION['zmienna'];
2. $_COOKIE['zmienna'];

a zapisujemy:
1. $_SESSION['zmienna'] = "moja wartosc";
2. setcookie("zmienna","moja wartosc",0); //czas ważności cookie to zero
Matimor
Dobra zacząłem robić to na Cookies, jakoś mi na razie idzie, zrobiłem w pliku cookies.js funkcje, które ułatwiają mi posługiwanie się Cookie, teraz mam taki problem, gdy dołącze ten plik do index.php (<script language... src...></script>) to wywala mi błąd Call To undefined function[...], sprawdzałem wszystko czy jest ok (plik .js na swoim miejscu, index po zmianie wgrany) dodam, że nie działa mi żaden sposób obejścia tego shitu, jak robie tak:
  1. <a href="java script: setCookie(...);">Ustaw Cookie</a>

To nie pokazuje mi błędu nawet jak pliku nie dołącze, jak dołącze plik i zrobie tak:
  1. if(getCookie(...) != "jakistamklucz")
  2. {
  3. setCookie(...);
  4. }

To wywala mi błąd, nie ważne czy plik jest czy go nie ma, pisze Call to undefineg function getCookie, a w <a> nie pokazuje mi nic. Gdy dodam @ przed getCookie to mi strony w ogóle nie uruchamia.
Brick
Ale czemu używasz tu javascriptu?
To wszystko w php się robi. Oczywiście można w javascript zapisać cookie tylko po co?

Logowanie - schemat logiczny:

Kod
jeżeli wysłano formularz
{
   - wyczyść wysłane dane ze śmieci i prób "hackerskich"
   - sprawdź czy podany login i hasło są poprawne
   - komunikaty o błędach zapisz do zmiennej np $error
}

jeżeli nie wysłano formularza LUB wysłano formularz ale są błędy
{
   - jeżeli są błędy to je pokaż ($error)
   - pokaż formularz
}

jeżeli wysłano formularz I nie ma błędów
{
   - zapisz plik cookie
    proponuję zapisanie dwóch plików cookie:
    1. Unikalny ID użytkownika z bazy - setcookie("user_id",$id,0);
    2. Zaszyfrowane hasło - setcookie("pass",md5($haslo),0);
   - pokaż komunikat o zalogowaniu
}

Następnie tworzysz skrypt który sprawdza czy użytkownik jest zalogowany. Ten skrypt musi byc uruchamiany na początku, wszędzie tam gdzie dostęp ma tylko zalogowany. Skrypt zarówno sprawdza czy jest plik cookie jak i czy są w nim poprawne wartości. Pamiętaj że cookie jest na dysku usera, i każdy może próbowac przy nim manipulować.
Kod
if ($_COOKIE['user_id'])
{
    - sprawdz czy użytkownik o podanym ID istnieje w bazie
    - oraz sprawdz czy hasło z cookie zgadza się z tym z bazy
    mysql_query("select count(*) from users where id=".$_COOKIE['user_id'].' and md5(haslo)=".$_COOKIE['pass'].");
}
Jak zapytanie zwraca zero to znaczy że cookie nie pasuje i trzeba gościowi zabronić dostepu i wylogować.

Oczywiście to najprostsza wersja. Chodzi o zasadę.
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.