Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Mechanizm obsługi sesji
Forum PHP.pl > Forum > Gotowe rozwiązania > Algorytmy, klasy, funkcje
zbig13
Witam!
Kilka tygodni temu po raz pierwszy zetknąłem się z OOP, przeglądając posty na forum. Zaciekawiło mnie to, dlatego zacząłem czytać trochę artykułów o programowaniu obiektowym, kupiłem nawet książkę, gdzie są opisane tego podstawy. W końcu udało mi się napisać jakąś klasę (do tej pory uczyłem się teoretycznie tongue.gif). Jest to mechanizm obsługi sesji oparty o bazy danych MySQL. Przedstawiam go poniżej. Chciałbym prosić nie tylko o ocenę, ale też o uwagi na temat co robię źle, co powinenem zmienić, co jest niezgodne z zasadami programowania obiektowego itp. Dzięki temu może nauczę się tworzyć lepsze i bardziej wydajne klasy. Oto kod:

  1. <?php
  2.  
  3. class Sessions {
  4.  
  5. /* Sekcja zmiennych, odpowiadających za połączenie z bazą danych */
  6.  
  7. // Nazwa użytkownika.
  8. private $user = "xxx";
  9.  
  10. // Hasło.
  11. private $pswd = "xxx";
  12.  
  13. // Host (nazwa serwera).
  14. private $host = "localhost";
  15.  
  16. // Nazwa bazy danych.
  17. private $db = "sesje";
  18.  
  19. // Połączenie z bazą danych.
  20. private $connect;
  21.  
  22. /* Zmienne opisujące daną sesję */
  23.  
  24. // Nazwa sesji.
  25. private $name;
  26.  
  27. // Wartość sesji.
  28. private $value;
  29.  
  30. // Czas działania.
  31. private $timeout;
  32.  
  33. // Adrs domeny, w której ma działać sesja.
  34. private $domain;
  35.  
  36.  
  37. /* Funkcja konstrukcjuna, odpowiedzialna
  38. za połączenie z serwerem MySQL. */
  39.  
  40. public function __construct () {
  41. $this->connect = mysql_connect ($this->host, $this->user, $this->pswd) or die ("Nie udało się połączyć z bazą danych. ".mysql_error());
  42. mysql_select_db ($this->db) or die ("Nie udało się wybrać bazy danych. ".mysql_error());
  43. }
  44.  
  45. /* Funkcja inicjująca sesję. */
  46.  
  47. private function init ($name, $value, $timeout, $domain='/') {
  48. $this->name = $name;
  49. $this->value = $value;
  50. $this->timeout = $timeout;
  51. $this->domain = $domain;
  52. return TRUE;
  53. }
  54.  
  55.  
  56. /* Funkcja sprawdzająca istnienie
  57. danej sesji. */
  58.  
  59. private function check ($name) {
  60. $check_query = "SELECT * FROM sessions WHERE name='$name'";
  61. $check = mysql_query ($check_query);
  62. $row = mysql_fetch_array ($check, MYSQL_ASSOC);
  63. if ($row) {
  64. $this->init ($row['name'], $row['value'], $row['timeout'], $row['domain']);
  65.  
  66. // Sprawdzenie, czy dana sesja nie powinna już wygasnąć.
  67. if (time() > $this->timeout) {
  68. $this->destroy ($this->name);
  69. }
  70.  
  71. // Sprawdzenie, czy aktualna ścieżka jest zgodna ze ścieżką działania sesji.
  72. if (strstr(dirname($_SERVER['PHP_SELF']), $this->domain)) {
  73. return TRUE;
  74. } else {
  75. return FALSE;
  76. }
  77.  
  78. } else {
  79. return FALSE;
  80. }
  81. }
  82.  
  83.  
  84. /* Funkcja pozwalająca utworzyć nową sesję. */
  85.  
  86. public function create ($name, $value, $timeout, $domain) {
  87. if (!$this->check ($name)) {
  88. $time = time() + $timeout;
  89. $this->init ($name, $value, $time, $domain);
  90. $create_query = "INSERT INTO sessions (name, value, timeout, domain) VALUES ('$this->name', '$this->value', '$this->timeout', '$this->domain')";
  91. $create = mysql_query ($create_query);
  92. if ($create) {
  93. return TRUE;
  94. } else {
  95. return FALSE;
  96. }
  97. }
  98. }
  99.  
  100. /* Funkcja pozwalająca odczytać już 
  101.    istniejącą sesję. */
  102.  
  103.  public function read ($name) {
  104.  if (!$this->check ($name)) {
  105.  return FALSE;
  106.  } else {
  107.  $sel_query = "SELECT * FROM sessions WHERE name='$name'";
  108.  $sel = mysql_query($sel_query);
  109.  $row = mysql_fetch_array ($sel, MYSQL_ASSOC);
  110. $this->init ($row['name'], $row['value'], $row['timeout'], $row['domain']);
  111. return $this->value;
  112.  }
  113.  }
  114.  
  115.  /* Funkcja niszcząca sesję. */
  116.  
  117. public function destroy ($name) {
  118. $del_query = "DELETE FROM sessions WHERE name='$name'";
  119. $del = mysql_query ($del_query);
  120. return TRUE;
  121. } else {
  122. return FALSE;
  123. }
  124. }
  125.  
  126.  
  127. /* Destruktor, zamyka połączenie
  128. z bazą danych */
  129.  
  130. public function __destruct () {
  131. mysql_close($this->connect);
  132. }
  133.  
  134. }
  135.  
  136. ?>


Przykład użycia:

  1. <?php
  2.  
  3. require_once ('sessions.php');
  4. $session = new Sessions;
  5.  
  6. $session->create ("user", "zbig", 180, "/admin/"); // Tworzy sesję "user" o wartości "zbig", działającą w obrębie katalogu /admin/ przez 3 minuty.
  7. $session->read ("user"); // Odczytuje sesję i zwraca jej wartość (w tym przypadku "zbig").
  8. $session->destroy ("user"); // Niszczy aktualną sesję, zwraca TRUE jeśli usunięcie się powiedzie lub FALSE, je
    śli nie.
  9.  
  10. ?>


Z góry dziękuje i pozdrawiam!
Adam85
Samej klasie do obsługi sesji przydało by się jeszcze trochę. Choćby sesje dla botów wyszukiwarek, czy weryfikacja użytkownika np. po nr. IP.
Co do wsadzania funkcji sql, to lepiej od samego początku korzystać z jakiejś nakładki, później unikniesz przepisywania :-)
dr_bonzo
OOP:
Parametry polaczenia przekazuj przez argumenty konstruktora, a nie wpisuj na sztywno w kod klasy:
np.
  1. <?php
  2. $session = new Sessions( 'username', 'password', 'server', 'unixSocket', 'database' );
  3. ?>


Nie zawsze sprawdzasz poprawnosc wynikow funkcji, np:
  1. <?php
  2. private function check ($name) {
  3. $check_query = "SELECT * FROM sessions WHERE name='$name'";
  4. $check = mysql_query ($check_query); // <<<<<<< a gdzie sprawdzenie czy nie === FALSE?questionmark.gif
  5. $row = mysql_fetch_array ($check, MYSQL_ASSOC);
  6. ?>
zbig13
@dr_bonzo Faktycznie, dzięki smile.gif Jak pisałem to mój pierwszy skrypt w OOP, więc przydadzą mi się uwagi na temat poprawności smile.gif jeszcze raz dzięki, zaraz to poprawiam!
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-2024 Invision Power Services, Inc.