Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> Mechanizm obsługi sesji, Klasa, PHP 5
zbig13
post 1.09.2005, 09:09:19
Post #1





Grupa: Zarejestrowani
Postów: 214
Pomógł: 0
Dołączył: 3.04.2004
Skąd: Legionowo

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


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!
Go to the top of the page
+Quote Post
Adam85
post 6.09.2005, 18:15:07
Post #2





Grupa: Zarejestrowani
Postów: 2
Pomógł: 0
Dołączył: 16.07.2004

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


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 :-)


--------------------
hmmm...
Go to the top of the page
+Quote Post
dr_bonzo
post 6.09.2005, 19:26:00
Post #3





Grupa: Przyjaciele php.pl
Postów: 5 724
Pomógł: 259
Dołączył: 13.04.2004
Skąd: N/A

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


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. ?>


--------------------
Nie lubię jednorożców.
Go to the top of the page
+Quote Post
zbig13
post 6.09.2005, 20:40:10
Post #4





Grupa: Zarejestrowani
Postów: 214
Pomógł: 0
Dołączył: 3.04.2004
Skąd: Legionowo

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


@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!
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: 25.04.2024 - 11:41