Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP]Klasa do obsługi sesji nie działa
Forum PHP.pl > Forum > Przedszkole
cisu
Witam,

mam problem z poniższą klasą. Objawia się on tym, że przy każdym odświeżeniu strony klasa tworzy nową sesję (nowy rekord w bazie, nowe id) zamiast korzystać z tego, co wygenerowała kilka sekund temu. Byłbym bardzo wdzięczny o pomoc. Jeśli chodzi o bazę danych to łączy się dobrze, nie ma z tym problemów. Sęk w tym, że nie wiem, gdzie problem jest.

Kod klasy:
  1. class usersession {
  2. private $php_session_id;
  3. private $native_session_id;
  4. private $logged_in;
  5. private $user_id;
  6. private $dbhandle;
  7. private $session_timeout = 1800;
  8. private $session_lifespan = 7200;
  9.  
  10. public function __construct($dbhandle) {
  11. array(&$this, "open"),
  12. array(&$this, "close"),
  13. array(&$this, "read"),
  14. array(&$this, "write"),
  15. array(&$this, "destroy"),
  16. array(&$this, "gc")
  17. );
  18. $this->dbhandle = $dbhandle;
  19. if (isset($_COOKIE['PHPSESSID'])) {
  20. $this->php_session_id = $_COOKIE['PHPSESSID'];
  21. $strUserAgent = $_SERVER['HTTP_USER_AGENT'];
  22. $stmt = "SELECT session_id FROM {prefix}sessions WHERE session_ascii_id = '" . $this->php_session_id . "' AND ((".time()." - session_create_time) < '" . $this->session_lifespan . "') AND session_user_agent='" . $strUserAgent . "' AND ((".time()." - session_last_action_time) <= '" . $this->session_timeout . "' OR session_last_action_time IS NULL)";
  23. $result = $dbhandle->_query($stmt);
  24. if ($dbhandle->_num_rows($result)==0) {
  25. $result = $dbhandle->_query("DELETE FROM {prefix}sessions WHERE (session_ascii_id = '". $this->php_session_id . "') OR (".time()." - session_create_time) > ". $this->session_lifespan . ")");
  26. $result = $dbhandle->_query("DELETE FROM {prefix}sessions_variables WHERE variable_session_id NOT IN (SELECT session_id FROM {prefix}sessions)");
  27. unset($_COOKIE['PHPSESSID']);
  28. }
  29. }
  30. session_set_cookie_params($this->session_lifespan);
  31. }
  32.  
  33. public function Impress() {
  34. if ($this->native_session_id) {
  35. $result = $dbhandle->_query("UPDATE {prefix}sessions SET session_last_action_time = ".time()." WHERE session_id = " . $this->native_session_id);
  36. }
  37. }
  38.  
  39. public function getSessionId() {
  40. return $this->php_session_id;
  41. }
  42.  
  43. public function open($savePath, $sessionName) {
  44. return true;
  45. }
  46.  
  47. public function close() {
  48. return true;
  49. }
  50.  
  51. public function read($id) {
  52. $strUserAgent = $_SERVER['HTTP_USER_AGENT'];
  53. $this->php_session_id = $id;
  54. $failed = 1;
  55. $result = $this->dbhandle->_query("SELECT session_id, session_login_status, session_user_id FROM {prefix}sessions WHERE session_ascii_id = '$id'");
  56. if ($this->dbhandle->_num_rows($result)>0) {
  57. $row = $this->dbhandle->_fetch_array($result);
  58. $this->native_session_id = $row['session_id'];
  59. if ($row['session_login_status']=='1') {
  60. $this->logged_in = true;
  61. $this->user_id = $row['session_user_id'];
  62. } else {
  63. $this->logged_in = false;
  64. }
  65. } else {
  66. $this->logged_in = false;
  67. $this->dbhandle->_query("INSERT INTO {prefix}sessions(session_ascii_id, session_login_status, session_user_id, session_create_time, session_user_agent) VALUES ('$id','f',0,".time().",'$strUserAgent')");
  68. $result = $this->dbhandle->_query("SELECT session_id FROM {prefix}sessions WHERE session_ascii_id = '$id'");
  69. $row = $this->dbhandle->_fetch_array($result);
  70. $this->native_session_id = $row['session_id'];
  71. }
  72. return("");
  73. }
  74.  
  75. public function write($id, $data) {
  76. }
  77.  
  78. public function destroy($id) {
  79. $result = $dbhandle->_query("DELETE FROM {prefix}sessions WHERE session_ascii_id = '$id'");
  80. return($result);
  81. }
  82.  
  83. public function gc($maxlifetime) {
  84. $result = $dbhandle->_query("DELETE FROM {prefix}sessions WHERE ".time()." - session_create_time) > ". $maxlifetime);
  85. $result = $dbhandle->_query("DELETE FROM {prefix}sessions_variables WHERE variable_session_id NOT IN (SELECT session_id FROM {prefix}sessions)");
  86. return true;
  87. }
  88.  
  89. public function __get($nm) {
  90. $result = $this->dbhandle->_query("SELECT variable_content FROM {prefix}sessions_variables WHERE variable_session_id = " . $this->native_session_id . " AND variable_name = '" . $nm . "'");
  91. if ($this->dbhandle->_num_rows($result)>0) {
  92. $row = $this->dbhandle->_fetch_array($result);
  93. return(unserialize($row['variable_content']));
  94. } else {
  95. return(false);
  96. };
  97. }
  98.  
  99. public function __set($nm, $val) {
  100. $strSer = serialize($val);
  101. $this->dbhandle->_query("DELETE FROM {prefix}sessions_variables WHERE variable_session_id='".$this->native_session_id."' AND variable_name='".$nm."'");
  102. $stmt = "INSERT INTO {prefix}sessions_variables(variable_session_id, variable_name, variable_content) VALUES(" . $this->native_session_id . ", '$nm', '$strSer')";
  103. $result = $this->dbhandle->_query($stmt);
  104. return($result);
  105. }
  106.  
  107. public function Login($strUsername, $strPlainPassword) {
  108. $strMD5Password = md5($strPlainPassword);
  109. $stmt = "SELECT user_id FROM {prefix}users WHERE user_name='" . $strUsername . "' AND user_password='" . $strMD5Password . "'";
  110. $result = $this->dbhandle->_query($stmt);
  111. if ($this->dbhandle->_num_rows($result)>0) {
  112. $row = $this->dbhandle->_fetch_array($result);
  113. $this->user_id = $row['user_id'];
  114. $this->logged_in = true;
  115. $result = $dbhandle->_query("UPDATE {prefix}sessions SET session_login_status = true, session_user_id = " . $this->user_id . " WHERE user_id = " . $this->native_session_id);
  116. return(true);
  117. } else {
  118. return(false);
  119. };
  120. }
  121.  
  122. public function LogOut() {
  123. if ($this->logged_in == true) {
  124. $result = $this->dbhandle->_query("UPDATE {prefix}sessions SET session_login_status = false, session_user_id = 0 WHERE user_id = " . $this->native_session_id);
  125. $this->logged_in = false;
  126. $this->user_id = 0;
  127. return(true);
  128. } else {
  129. return(false);
  130. };
  131. }
  132.  
  133. public function IsLoggedIn() {
  134. return($this->logged_in);
  135. }
  136. }


Chodzi prawdopodobnie o metodę read, ale nie za bardzo odnajduję tam błąd.
Lorum3
Może pokaż jak używasz tej klasy?

Wyświetl sobie liczbę zwróconych rekordów w metodzie read, przed warunkiem i sprawdź czy jest okej.
cisu
  1. $session_data = new usersession($mysqlDB);

Tamta zmienna rekordy z bazy pobiera, ta funkcja ma zwracać ciąg pusty (jest błąd, poprawiłem ale dalej nie działa).
Na razie inaczej jej nie używam, tylko deklaruję jeden obiekt klasy (bo tyle mi trzeba) i przy każdym odświeżeniu dodają się rekordy w bazie i generuje nowe ID, a nie powinno.

Cytat(Lorum3 @ 8.05.2012, 21:49:17 ) *
Może pokaż jak używasz tej klasy?

Wyświetl sobie liczbę zwróconych rekordów w metodzie read, przed warunkiem i sprawdź czy jest okej.

Ciągle pokazuje 0, w sumie nie trudno mi się było domyślić, bo jak $this->dbhandle->_num_rows($result)>0 by było większe od zera to by nie tworzyło rekordów w bazie, a tworzy.
Lorum3
Cytat(cisu @ 8.05.2012, 22:00:48 ) *
Ciągle pokazuje 0, w sumie nie trudno mi się było domyślić, bo jak $this->dbhandle->_num_rows($result)>0 by było większe od zera to by nie tworzyło rekordów w bazie, a tworzy.


No i gdzie chcesz dalej szukać problemu? Wynika z tego, że źle konstruujesz zapytanie, bądź źle jest dodajesz.
cisu
Szukałem błędu dzisiaj ze 3 godziny aż znalazłem. Nie było go w metodzie read, tylko w samym konstruktorze. Na dobrą sprawę wystarczyła drobna zmiana zapytania i wszystko działa jak należy. Do zamknięcia.
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.