Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Obsluga sesji oraz uzytkownika
Forum PHP.pl > Forum > Gotowe rozwiązania > Algorytmy, klasy, funkcje
camikazee
Witam!

Napisalem sobie prosta klase obslugi sesji oraz uzytkownika. Co prawda zawieraja podstawowe metody. Jeszcze beda dopisywane. Chcialbym najpierw jednak by bardziej doswiedczeni koledzy wypowiedzieli sie czy sa jakies bledy. Np gnerowanie zbyt duzej ilosci zapytan do bazy itp.



klasa sesji

  1. <?php
  2.  /**
  3.  * @version $v1.0 - Session class $
  4.  * @copyright Copyright (C) 2007 by camikazee. All rights reserved.
  5.  */
  6.  
  7.  class Session
  8.  {
  9.  var $_sessionId = NULL;
  10.  var $_sessionLife = 3600;
  11.  var $_sessionFreeze = 180;
  12.  var $_userId;
  13.  var $_IsLoggedIn = false;
  14.  var $_dbHandle;
  15.  var $_userBrowser;
  16.  var $_userIP;
  17.  
  18.  
  19.  /**
  20. * Konstruktor klasy Session
  21. * @param $dbHandle
  22. * @return Session
  23. */
  24.  
  25.  function Session($dbHandle) {
  26. $this->_dbHandle = $dbHandle;
  27.  
  28. // Pobieram dane o uzytkowniku
  29. $this->_userBrowser = $GLOBALS['HTTP_USER_AGENT'];
  30. $this->_userIP = $_SERVER['REMOTE_ADDR'];
  31.  
  32. // Inicjuje sesje
  33. array(&$this, '_session_open'),
  34. array(&$this, '_session_close'),
  35. array(&$this, '_session_read'),
  36. array(&$this, '_session_write'),
  37. array(&$this, '_session_destroy'),
  38. array(&$this, '_session_gc')
  39. );
  40.  
  41.  $this->_sessionId = session_id();
  42.  
  43.  
  44.  // Sprawdzam czy istnieje ciasteczko i czy jego wartosc ma 32 znaki
  45.  if ( isset($_COOKIE['PHPSESSID']) && strlen($_COOKIE['PHPSESSID']) == 32 ) {
  46.  
  47.  // Sprawdzam poprawnosc sesji
  48.  $sql = "SELECT session_id, session_user FROM ".TABLE_SESSION."
  49.  WHERE session_id = '".$this->_sessionId."'
  50.  AND UNIX_TIMESTAMP(NOW() - session_lastmove) < '".$this->_sessionLife."'
  51.  AND UNIX_TIMESTAMP(NOW()) <= (session_start + ".$this->_sessionLife.")
  52.  AND session_browser = '".$this->_userBrowser."'";
  53.  $dbResult = $this->_dbHandle->query($sql);
  54.  
  55.  // Znalazlem podejrzana sesje, usuwam ja i nadaje nowy identyfikator sesji
  56.  if ( $this->_dbHandle->numRows() == 0) {
  57.  $this->_session_destroy($this->_sessionId);
  58.  $this->_sessionId = session_id();
  59.  session_set_cookie_params($this->_sessionLife);
  60.  $this->createNewSession();
  61.  }
  62.  
  63.  // Sesja poprawna, przepisuje jej identyfikator oraz aktualizuje aktywnosc
  64.  else {
  65.  $this->_sessionId = $_COOKIE['PHPSESSID'];
  66.  $arrRow = $this->_dbHandle->fetchRows();
  67.  if ( $arrRow['session_user'] != 0 ) {
  68.  $this->_IsLoggedIn = true;
  69.  $this->_userId = $arrRow['session_user'];
  70.  }
  71.  $this->Impress();
  72.  }
  73.  }
  74.  
  75.  // Nie ma ciastka, tworze nowa sesje
  76.  else {
  77.  $this->createNewSession(); 
  78.  session_set_cookie_params($this->_sessionLife);
  79.  }  
  80.  }
  81.  
  82.  
  83.  /**
  84. * Update wpisu do bazy jezeli odnotowano ruch
  85. */
  86.  
  87.  function Impress() {
  88.  $this->_dbHandle->query("UPDATE ".TABLE_SESSION." SET session_lastmove = UNIX_TIMESTAMP(NOW())
  89. WHERE session_id = '{$this->_sessionId}'");
  90.  }
  91.  
  92.  
  93.  
  94.  /**
  95. * Metody sesyjne
  96. */
  97.  
  98.  function _session_open($save_path, $session_name) {
  99.  return (true);
  100.  }
  101.  
  102.  
  103.  function _session_close() {
  104.  $this->_session_gc($this->_sessionLife);
  105.  return (true);
  106.  }
  107.  
  108.  
  109. function _session_read($sessionId) {
  110. $this->_dbHandle->query("SELECT * FROM ".TABLE_SESSION_DATA."
  111.  WHERE sessionid = '$sessionId'");
  112. if ( $this->_dbHandle->numRows() > 0 ) {
  113. $arrRow = $this->_dbHandle->fetchRows();
  114. return (unserialize($arrRow['value']));
  115. }
  116. else {
  117. return '';
  118. }
  119.  }
  120.  
  121.  
  122.  function _session_write($sessionId, $data) {
  123.  $serData = serialize($data);
  124.  $this->_dbHandle->query("SELECT sessionid FROM ".TABLE_SESSION_DATA."
  125. WHERE sessionid = '$sessionId'");
  126.  if ( $this->_dbHandle->numRows() > 0 ) {
  127.  $this->_dbHandle->query("UPDATE ".TABLE_SESSION_DATA." SET value = '$serData'
  128.  WHERE sessionid = '$sessionId'");
  129.  }
  130.  else {
  131.  $this->_dbHandle->query("INSERT INTO ".TABLE_SESSION_DATA." (sessionid, value)
  132. VALUES('$sessionId', '$serData')");
  133.  }
  134. return (true);
  135.  }
  136.  
  137.  
  138.  function _session_destroy($id) {
  139.  $sql = "DELETE FROM ".TABLE_SESSION.
  140.  WHERE session_id = '$id'";
  141.  $dbResult = $this->_dbHandle->query($sql);
  142.  return (true);
  143.  }
  144.  
  145.  
  146.  function _session_gc($maxlifetime) {
  147.  $this->_dbHandle->query("DELETE FROM ".TABLE_SESSION."
  148. WHERE (UNIX_TIMESTAMP(NOW()) > session_start + ".$this->_sessionLife.")");
  149. $this->_dbHandle->query("DELETE FROM ".TABLE_SESSION_DATA."
  150. WHERE sessionid NOT IN(SELECT session_id FROM ".TABLE_SESSION.")"); 
  151.  return (true);
  152.  }  
  153.  
  154.  
  155. /**
  156.  * Tworze nowa sesje
  157.  */
  158. function createNewSession () {
  159. $sql = "INSERT INTO ".TABLE_SESSION."
  160. (session_id, session_user, session_ip, session_browser, session_start, sessi
    on_lastmove)
  161. VALUES('{$this->_sessionId}', '0', '{$this->_userIP}', '{$this->_userBrowser}', UNIX_TIMESTAMP(NOW()), UNIX_TIMESTAMP(NOW()))";
  162. $this->_dbHandle->query($sql);
  163. }
  164.  
  165.  
  166.  
  167.  /**
  168. * Pobieram identyfikatora sesji
  169. */
  170.  
  171.  function getSessionId() {
  172.  return $this->_sessionId;
  173.  }
  174.  
  175.  
  176.  
  177.  /**
  178. * Pobieram identyfikator zalogowanego uzytkownika
  179. */
  180.  
  181.  function getUserId() {
  182.  return $this->_userId;
  183.  }
  184.  
  185.  }
  186. ?>



z gory dziekuje za odpowiedzi smile.gif
sf
Pierwszy problem to PHP4, który tylko jest rozwijany do końca roku i potem papa.

Drugi problem to wg mnie bezsensowność używania sesji przy użyciu bazy danych. Przy większym serwisie zajedziesz bazę.

Trzeci problem to pisanie czystego SQL. Powinno się używać jakieś otoczki np. Propel.

Czwarty problem, jeśli _dbHandle to nie jest PDO to hm, nie ta epoka.
Kszyhoo
wiem że to pierwszy mój post tutaj, wiec postaram się napisać coś na temat i w miare rozsadnego laugh.gif
ja również nie używałbym w takim stopniu bazy do obsługi sesji - raczej tylko 2 razy - pobrać dane na początku - potem na końcu wpisać nowe.
podstawowe info, które nie musi być pobierane z bazy trzymałbym w Ciasteczku, np. z wykorzystaniem md5($tresc.$bezpieczne) - gdzie $tresc to to co chcesz zakodować, a $bezpiecznie to jakikolwiek tekst, który uniemożliwi wrzucenie danych do Ciacha przez jakiegos uszusta.
co do wersji PHP - można zostać przy czwórce, ale trzeba mieć pewność że wszystkie użyte funkcje zostały w piątce, albo że na serwerze masz wciaz wersje 4
tak poza tym - zmartwię Cię trochę - w PHP5 masz od razu wprowadzone funkcje obsługi sesji - i łatwo Ci będzie je dostosować do własnych potrzeb.

pozdrawiam
Kszyhoo
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.