Witam mam problem z klasą z książki PHP5 zaawansowane programowanie. Napisze o co mi chodzi:
Przerobiłem ją trochę dla moich potrzeb i pewnie w tym cały sęk:
Nie działa wprowadzanie zmiennych sesji do bazy danych poprzez funkcje __set i wyciaganie tych zmiennych poprzez funkcję __get. Nie za bardzo rozumiem dlaczego to nie działa. Następnym problemem są prawa do funkcji :
Przy ustawieniu ich na private wywala błędy przy testowaniu :
_session_write_method
_session_open_method
_session_read_method
itd.


Będę bardzo wdzięczny za każdą podpowiedź a poniżej zamieszczam kod klasy i kod testujący.
  1. <?php
  2. //require_once("class.Database.phpm");
  3.  
  4. class user_session 
  5. {
  6. private $php_session_id;
  7. private $native_session_id;
  8. private $dbhandle;
  9. private $logged_in;
  10. private $user_id;
  11. private $session_timeout = 600; //10 minutowy max czas nieaktywności
  12. private $session_lifespan = 3600; //1 godzinny max czas ważności sesji
  13.  
  14. public function __construct()
  15. {
  16. ##połączenie z bazą danych
  17. //$this->dbhandle = new Database();
  18. $this->dbhandle = mysql_connect('localhost','root','blabla');
  19. $elo = mysql_select_db('plany',$this->dbhandle);
  20. array(&$this, '_session_open_method'),
  21. array(&$this, '_session_close_method'),
  22. array(&$this, '_session_read_method'),
  23. array(&$this, '_session_write_method'),
  24. array(&$this, '_session_destroy_method'),
  25. array(&$this, '_session_gc_method'));
  26.  
  27.  
  28. //sprawdzamy czy przesłane cookie jest ok i jesli nie to niszczymy sesję
  29. if ($_COOKIE["PHPSESSID"]) {
  30. $this->php_session_id = $_COOKIE["PHPSESSID"];
  31. $stmt = "select id from sesja_uzytkownika where identyfikator_sesji_ascii = '".$this->php_session_id."' and ((now() - utworzono) < '"
  32. .$this->session_lifespan."' ) and ((now() - ostatnia_reakcja) <= '"
  33. .$this->session_timeout."' or ostatnia_reakcja is null )";
  34. $result = mysql_query($stmt);
  35. if (mysql_num_rows($result) == 0) {
  36. #ustawia znacznik niepowodzenia na 1
  37. $failed = 1;
  38. #usuwa z bazy danych przeterminowane sesje
  39. $result = "DELETE FROM "sesja_uzytkownika" WHERE (identyfikator_sesji_ascii = '". $this->php_session_id . "') OR (now() - utworzono) > $maxlifetime)";
  40. //$delete = "delete from sesja_uzytkownika where (identyfikator_sesji_ascii = ".$this->php_session_id." or ((now() - utworzono) 
  41. //> ".$this->session_lifespan." ) or ((now() - ostatnia_reakcja) > ".$this->session_timeout." ))";
  42.  
  43. $result = mysql_query($result);
  44.  
  45. $delete = "delete from zmienna_sesji where identyfikator_sesji not in ( select id from sesja_uzytkownika )";
  46.  
  47. $result = mysql_query($delete);
  48.  
  49. #wymusza nadanie nowego idetyfiaktora sesji
  50. unset($_COOKIE["PHPSESSID"]);
  51. }
  52. }
  53. #ustawia czas życia cookie
  54. session_set_cookie_params($this->session_lifespan);
  55. #wywołauje metode session_start aby zainicjować sesję
  56. }
  57.  
  58. public function Impress() {
  59. if ($this->native_session_id) {
  60. try {
  61. $result = mysql_query("update sesja_uzytkownika set ostatnia_reakcja = now() where id = ".$this->native_session_id);
  62. }
  63. catch (Exception $e) {
  64. echo $e; //trzeba utworzyć obiekt klasy wyjątek
  65. }
  66. }
  67. }
  68. public function IsLoggedIn() {
  69. return ($this->logged_in);
  70. }
  71. public function GetUserId() {
  72. if ($this->logged_in == 1) {
  73. return ($this->user_id);
  74. } else {
  75. return (false);
  76. }
  77. }
  78. public function GetUserObject() {
  79. if ($this->logged_in == 1) {
  80. if (class_exists("user")) {
  81. $objUser = new user($this->user_id);
  82. return($objUser);
  83. } else {
  84. return(false);
  85. }
  86. }
  87. }
  88.  
  89. public function GetSessionIdentifier() {
  90. return($this->php_session_id);
  91. }
  92.  
  93. public function Login($str_username, $str_plain_password) {
  94.  $strMD5Password = $str_plain_password;
  95.  $stmt = "select id from uzytkownik where login = "".$str_username."" and haslo = "".$strMD5Password.""";
  96.  $result = mysql_query($stmt);
  97.  if (mysql_num_rows($result)>0) {
  98. $row = mysql_fetch_row($result);
  99. echo $row["ID"];
  100. $this->user_id = $row["id"];
  101. $this->logged_in = 1;
  102. $result = mysql_query("update sesja_uzytkownika set zalogowany = 1 , identyfikator_uzytkownika = " . $this->user_id . " where id = " . $this->native_session_id);
  103.  
  104. return(true);
  105.  } else {
  106.  
  107. return(false);
  108.  } 
  109. }
  110.  
  111.  public function LogOut() {
  112.  if ($this->logged_in == 1) {
  113.  try {
  114.  $result = mysql_query("update sesja_uzytkownika set zalogowany = 0, identyfikator_uzytkownika = 0 
    where id = "
     . $this->native_session_id);
  115.  }
  116. catch (Exception $e) {
  117. echo $e; //łapać wyjatek
  118. }
  119. $this->logged_in = 0;
  120. $this->user_id = 0;
  121. return(true);
  122.  } else {
  123. return(false);
  124.  }
  125. }
  126.  
  127. public function __get($nm) {
  128. try {
  129. $result = mysql_query("select wartosc_zmiennej from zmienna_sesji where identyfikator_sesji = " . $this->native_session_id . " and nazwa_zmiennej = '" . $nm . "'");
  130. }
  131. catch (Exception $e) {
  132. echo $e; //łapać wyjątek
  133. }
  134.  if (mysql_num_rows($result)>0) {
  135. $row = mysql_fetch_array($result);
  136. return(unserialize($row["wartosc_zmiennej"]));
  137.  } else {
  138. return(false);
  139.  }
  140. }
  141.  
  142.  
  143. public function __set($nm, $val) {
  144.  $strSer = serialize($val);
  145.  $stmt = "INSERT INTO zmienna_sesji(identyfikator_sesji, nazwa_zmiennej, wartosc_zmiennej) VALUES('" . $this->native_session_id . "', '$nm', '$strSer')";
  146.  try {
  147.  $result = mysql_query($stmt);
  148.  }
  149.  catch (Exception $e) {
  150.  echo $e; //łapać wyjatek
  151.  }
  152.  
  153. }
  154.  
  155.  
  156. public function _session_open_method($save_path, $session_name) {
  157. # Do nothing
  158. return(true);
  159. }
  160.  
  161. public function _session_close_method() {
  162. mysql_close($this->dbhandle);
  163. return(true);
  164. }
  165.  
  166. public function _session_read_method($id) {
  167.  # Służy do ustalenia, czy nasza sesja w ogóle istnieje
  168.  $strUserAgent = $GLOBALS["HTTP_USER_AGENT"];
  169.  $this->php_session_id = $id;
  170.  //$id = $this->php_session_id;
  171.  # Na razie ustawia znacznik niepowodzenie na 1
  172.  $failed = 1;
  173.  # Sprawdza czy sesja istnieje w bazie danych
  174.  $stmt = "SELECT id, zalogowany, identyfikator_uzytkownika FROM sesja_uzytkownika WHE
    RE identyfikator_sesji_ascii = '$id'"
    ;
  175.  try {
  176.  $result = mysql_query($stmt);
  177.  }
  178.  catch (Exception $e) {
  179.  echo $e; //łapac wyjątek
  180.  }
  181.  if (mysql_num_rows($result)>0) {
  182. $row = mysql_fetch_array($result);
  183. $this->native_session_id = $row["id"];
  184. if ($row["zalogowany"]==1) {
  185.  $this->logged_in = 1;
  186.  $this->user_id = $row["identyfikator_uzytkownika"];
  187. } else {
  188.  $this->logged_in = 0;
  189. };
  190.  } else {
  191. $this->logged_in = 0;
  192. # Konieczne jest stworzenie wpisu w bazie danych
  193. try {
  194. $result = mysql_query("INSERT INTO sesja_uzytkownika(identyfikator_sesji_ascii, zalogowany, identyfikator_uzytkownika, utworzono
    , user_agent) VALUES ('$id','0',0,now(),'$strUserAgent')"
    );
  195. }
  196. catch (Exception $e) {
  197. echo $e; //łapać wyjątek
  198. }
  199. # Teraz pobiera prawdziwy identyfikator
  200. try {
  201. $result = mysql_query("SELECT id from sesja_uzytkownika WHERE identyfikator_sesji_ascii = '$this->php_session_id'");
  202. }
  203. catch (Exception $e) {
  204. echo $e; //łapać wyjątek
  205. }
  206. $row = mysql_fetch_array($result);
  207. $this->native_session_id = $row["id"];
  208.  };
  209.  # Zwraca jedynie ciąg pusty
  210.  return("");
  211. }
  212.  
  213. public function _session_write_method($id, $sess_data) {
  214.  return(true);
  215. }
  216.  
  217. public function _session_destroy_method($id) {
  218. try {
  219. $result = mysql_query("DELETE FROM sesja_uzytkownika WHERE identyfikator_sesji_ascii = '$id'");
  220. }
  221. catch (Exception $e) {
  222. echo $e; //łapać wyjątek
  223. }
  224.  return($result);
  225. }
  226.  
  227.  
  228. public function _session_gc_method($maxlifetime) {
  229. return(true);
  230. }
  231.  
  232. }
  233. ?>




kod testujacy klasę

  1. <?php
  2. require_once("user_session.phpm");
  3.  
  4. $objSession = new user_session();
  5. $objSession->Impress();
  6.  
  7.  
  8. ?>
  9. Strona testowa klasy UserSession
  10. <HR>
  11. <B>Bieżący identyfikator sesji: </B> <?=$objSession->GetSessionIdentifier();?><BR>
  12. <B>Użytkownik zalogowany? </B> <?=(($objSession->IsLoggedIn() == 1) ? "Tak" : "Nie")?><BR>
  13. <BR><BR>
  14. Próba logowania ...
  15. <?php $objSession->Login("edek","12345"); ?>
  16. <BR><BR>
  17. <B>Użytkownik zalogowany? </B> <?=(($objSession->IsLoggedIn() == 1) ? "Tak" : "Nie")?><BR>
  18. <B>Identyfikator zalogowanego użytkownika: </B> <?=$objSession->GetUserId();?><BR>
  19.  
  20. <BR><BR>
  21. Wylogowywanie...
  22. <?php $objSession->LogOut(); ?>
  23.  
  24. <BR><BR>
  25. <B>Użytkownik zalogowany? </B> <?=(($objSession->IsLoggedIn() == 1) ? "Tak" : "Nie")?><BR>
  26. <BR><BR>





Na koniec dodam jeszcze jeden problem to nie usuwa przestarzałych sesji z bazy.