Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP]Problem z sesjami
Forum PHP.pl > Forum > Przedszkole
xsalok
Witam!

Próbuję włączyć sesje do mojego skryptu logowania i jako że jestem początkujący napotkałem na pewien problem. Otóż po udanym logowaniu i zapisaniu do zmiennej
  1. $_SESSION['login']
loginu wpisanego przez użytkownika, na stronie do której przekierowuje chcę zrobić proste potwierdzenie logowania z napisem 'Witaj $_SESSION['login'] !'. Jednak php zwraca mi informację :Undefined variable: _SESSION in C:\xampp\htdocs\php_new\zalogowany.php on line 4, tj że zmienna nie została zdefiniowana.

Części listigów plików:
1. funkcja odpowiedzialna za logowanie z klasy User
  1. function log_in(){
  2.  
  3. if ($this->db->connect()){
  4. $sql = "SELECT * FROM `users` WHERE `login` = '".mysql_real_escape_string($this->login)."' AND `password` = '".mysql_real_escape_string(md5($this->password))."' ";
  5. if(mysql_num_rows($this->db->select($sql))==1){
  6.  
  7.  
  8. $_SESSION['login']=$this->login;
  9. $_SESSION['zalogowany']=true;
  10. header("Location: zalogowany.php");
  11.  
  12. }
  13. else{
  14. echo'Niepoprawne dane logowania';
  15. }
  16.  
  17. }
  18. }


2. strona do wyświetlenia po zalogowaniu się
  1. <?php
  2.  
  3. echo'Logowanie zakończone sukcesem';
  4. echo ' Witaj ' .$_SESSION['login']. '!';
  5. echo '<button><a href="index.html">start</a></button>';
  6. ?>


Sesje otwieram w pliku z formularzem, który działa poprawnie. Wiem że używam kilku przestarzałych metod ale dopiero rozpoczynam swoją zabawę z PHP
goartur
Zapomniałeś zdefiniować session_start
miki22
Na każdej stronie, na której mają być wykorzystywane zmienne z $_SESSION, musisz wcześniej uruchomić sesję czyli dać: session_start();
Aby bezsensownie nie uruchamiać sesji na każdej stronie jeśli klient nie jest zalogowany a przegląda tę stronę możesz dać to w if-ie, który by sprawdzał, czy jest coockie 'PHPSESSID' a więc czy już była założona sesja:
  1. if (isset($_COOKIE['PHPSESSID']))
  2. {
  3. }
xsalok
miki22, a czy nie powinno w if'ie być (!isset($_COOKIE['PHPSESSID'])) questionmark.gif czyli jeżeli cookie, to zakładam sesje?
viking
Session_start() tworzy albo wznawia istniejącą sesję więc nie ma sensu zbytniego sprawdzanie konkretnego identyfikatora. Będziesz chciał zmienić id sesji, trzeba będzie wszędzie poprawiać kod. Poza tym jest: http://fi2.php.net/manual/en/session.confi...sion.auto-start
miki22
Chodzi mi o to że jak ktoś niezalogowany będzie przeglądał tę stronę to bezsensu serwer będzie zakładał sesję.
Zrobiłbym tak:
  1. if (isset($_COOKIE['PHPSESSID']))
  2. {
  3.  
  4. if ($_SESSION['zalogowany'] === true)
  5. {
  6. echo'Logowanie zakończone sukcesem';
  7. echo ' Witaj ' .$_SESSION['login']. '!';
  8. echo '<button><a href="index.html">start</a></button>';
  9. ..... // dalej jakieś inne operacje
  10. exit();
  11. }
  12. }
  13. echo 'Nie jesteś zalogowany';
  14. echo '<button><a href="logowanie.html">Zaloguj się</a></button>';
  15.  



Cytat(viking @ 23.01.2016, 14:02:14 ) *
Session_start() tworzy albo wznawia istniejącą sesję więc nie ma sensu zbytniego sprawdzanie konkretnego identyfikatora. Będziesz chciał zmienić id sesji, trzeba będzie wszędzie poprawiać kod.

Jest sens. Jeśli witryna ma 300 stron i na każdej mogą (ale nie muszą!) być wykorzystywane dane z $_SESSION to bezsensu inicjować zawsze sesje.
Na witrynę wchodzi 1000 userów z czego tylko 2 dokonuje logowania. Gdyby nie ifować session_start() biedny serwer by zakładał 1000 sesji i trzymał je (domyślnie 30min.) a tak załozy tylko 2.
Cytat(viking @ 23.01.2016, 14:02:14 ) *
Będziesz chciał zmienić id sesji, trzeba będzie wszędzie poprawiać kod.

Zmiana id sesji nie ma znaczenia - ten if pyta się tylko czy jest PHPSESSID a nie jakie ma id.


EDIT: Mała poprawka kodu php bo wcześniej napisałem bzdury haha.gif
viking
A PHPSESSID to chyba id sesji smile.gif
Nawet jeśli będzie sprawdzał dla miliona to praca zerowa dla serwera.
miki22
Cytat(viking @ 23.01.2016, 14:24:36 ) *
A PHPSESSID to chyba id sesji smile.gif

Tak, ale id sesji jest wartością a if pyta się o istnienie a nie wartość. A dokładnie 'PHPSESSID' jest kluczem tablicy $_COOKIE a id sesji jego wartością. A if pyta sie tylko o istnienie tego klucza a nie o jego wartość. Po zmianie id sesji nadal będzie ona pod kluczem 'PHPSESSID'
Cytat(viking @ 23.01.2016, 14:24:36 ) *
Nawet jeśli będzie sprawdzał dla miliona to praca zerowa dla serwera.

No może masz rację. Może to kwestia mojej obsesji oszczędzania za wszelką cenę serwera. Nie wiem po co ale tak to już jest z obsesjami biggrin.gif
viking
A po zmianie przez http://php.net/manual/pl/function.session-name.php albo http://php.net/manual/pl/session.configura...ni.session.name to już nie będzie PHPSESSID tylko np. 'dupa_blada'. Może być też teoretycznie przypadek że sesja nie będzie trzymana w cookie.
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.