Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [klasa] Mechanizm obsługi sesji
Forum PHP.pl > Forum > PHP
zbig13
Witam!
Zwracam się z pytaniem szczególnie do bardziej zaawansowanych w OOP forumowiczów. Wczoraj napisałem (a przynajmniej starałem się napisać tongue.gif) prosty mechanizm obsługi sesji oparty o bazy danych MySQL. Z programowaniem obiektowym zetknąłem się dopiero nie dawno, przeglądając jakieś posty na forum. Staram się tego nauczyć choć mam jeszcze wiele pytań i wątpliwości. Wracając do mechanizmu: problem polega na tym, że nie mogę odwołać się do funckji w klasie z poziomu innej funkcji (w tej samej klasie). Wyskakuje błąd: Call to undefined function destroy(). Wiem co oznacza, ale nie wiem dlaczego tak się dzieje. 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.  
  20. /* Zmienne opisujące daną sesję */
  21.  
  22. // Identyfikator sesji.
  23. private $id;
  24.  
  25. // Nazwa sesji.
  26. private $name;
  27.  
  28. // Wartość sesji.
  29. private $value;
  30.  
  31. // Czas działania.
  32. private $timeout;
  33.  
  34.  
  35. /* Funkcja konstrukcjuna, odpowiedzialna
  36. za połączenie z serwerem MySQL. */
  37.  
  38. public function __construct () {
  39. $this->handle = mysql_connect ($this->host, $this->user, $this->pswd) or die ("Nie udało się połączyć z bazą danych. ".mysql_error());
  40. mysql_select_db ($this->db) or die ("Nie udało się wybrać bazy danych. ".mysql_error());
  41. }
  42.  
  43. /* Funkcja pozwalająca utworzyć nową sesję. */
  44.  
  45. public function create ($name, $value, $timeout) {
  46. $time = time() + $timeout;
  47. $create_query = "INSERT INTO sessions (name, value, timeout) VALUES ('$name', '$value', '$time')";
  48. $create = mysql_query ($create_query);
  49. if ($create) {
  50. return TRUE;
  51. } else {
  52. return FALSE;
  53. }
  54. }
  55.  
  56. /* Funkcja pozwalająca odczytać już 
  57.    istniejącą sesję. */
  58.  
  59.  public function read ($name) {
  60.  $sel_query = "SELECT * FROM sessions WHERE name='$name'";
  61.  $sel = mysql_query($sel_query);
  62.  if ($sel) {
  63.  $row = mysql_fetch_array ($sel, MYSQL_ASSOC);
  64.  if ($row) {
  65.  $this->id = $row['id'];
  66.  $this->name = $row['name'];
  67.  $this->value = $row['value'];
  68.  $this->timeout = $row['timeout'];
  69.  if (time() > $this->timeout) {
  70.  destroy ($this->name);
  71.  } else {
  72.  return $this->value;
  73. }
  74.  } else {
  75.  return FALSE;
  76.  }
  77.  } else {
  78.  return FALSE;
  79.  }
  80.  }
  81.  
  82.  /* Funkcja niszcząca sesję. */
  83.  
  84. public function destroy ($name) {
  85. if (read ($name) != FALSE) {
  86. $del_query = "DELETE FROM sessions WHERE id=".$this->id." AND name='".$this->name."'";
  87. $del = mysql_query ($del_query);
  88. return TRUE;
  89. } else {
  90. return FALSE;
  91. }
  92. } else {
  93. return FALSE;
  94. }
  95. }
  96.  
  97. }
  98.  
  99. ?>

Chodzi konkretnie o linijki 72 i 87. Prosiłbym też o podpowiedź co robię źle, co powinienem zmienić w mojej klasie, tak aby była jak najbardziej dopracowana. Proszę o pomoc! smile.gif
crash
No przecież nie wskazałeś skąd wywołujesz tongue.gif
  1. <?php
  2. $this->destroy( $this->name );
  3. ?>
zbig13
Ehhh, racja smile.gif Dzięki. Ale głupi błąd zrobiłem. Już to poprawiłem, ale teraz dla odmiany pojawia się takie coś:

FATAL: erealloc(): Unable to allocate 10 bytes

W czym tkwi problem?
crash
Coś zchrzaniłeś i skrypt chce zaalokować za dużo pamięci, albo masz ustawione bardzo niskie limity w konfiguracji..
zbig13
Nie wiem dlaczego. Zmieniłem tylko te dwa wiersze, ze złymi odwołaniami do funkcji:

wiersz 73
  1. <?php
  2. $this->destroy ($this->name);
  3. ?>

wiersz 88
  1. <?php
  2. if ($this->read ($name) != FALSE) {
  3. ?>


A co do tej konfiguracji, to gdzie w php.ini określa sie limit pamięci?
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.