Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Logowanie z sesja, cookie i baza
Forum PHP.pl > Forum > PHP
grzegorz-gg
Witam!
Mam problem z przerobieniem klasy do zarzadzanie sesjami która współpracuje z bazą PostgreSQL na współprace z baza MySQL.
Przykład class-y pochdzi z książki "PHP5 zaawansowane programowanie" zamieszcze poniżej skrypty z ksiażki i jeżeli to możliwe to prosze o pomoc w przeróbce.

  1. CREATE TABLE sesja uzytkownika (
  2. "id" SERIAL PRIMARY KEY NOT NULL,
  3. "identyfikator_sesji_ascii" character varying(32),
  4. "zalogowany" bool,
  5. "identyfikator_uzytkownika" int4,
  6. "ostatnie_dzialanie" timestamp,
  7. "utworzono" timestamp,
  8. "user_agent" character varying(256)
  9. );
  10.  
  11. CREATE TABLE "uzytkownik" (
  12. "id" SERIAL PRIMARY KEY NOT NULL,
  13. "nazwa_uzytkownika" character varying(32),
  14. "md5_haslo" character varying(32),
  15. "imie" character varying(64),
  16. "nazwisko" character varying(64)
  17. );
  18.  
  19. CREATE TABLE "zmienna_sesji" (
  20. "id" SERIAL PRIMARY KEY NOT NULL,
  21. "identyfikator_sesji" int4,
  22. "nazwa_zmiennej" character varying(64),
  23. "wartosc_zmiennej" text
  24. );
  25.  
  26. INSERT INTO "uzytkownik"(nazwa_uzytkownika, md5_haslo, imie, nazwisko)
  27. VALUES ('edek', '827ccb0eea8a706c4c34a16891f84e7b', 'Edek', 'Tomaszkiewicz');


plik usersession.phpm
  1. <?php
  2. class UserSession {
  3. private $php_session_id;
  4. private $native_session_id;
  5. private $dbhandle;
  6. private $logged_in;
  7. private $user_id;
  8. private $session_timeout = 600; # 10 minutowy maksymalny czas nieaktywności sesji
  9. private $session_lifespan = 3600; # 1 godzinny maksymalny czas trwania sesji.
  10.  
  11. public function __construct() {
  12. # Łączy z bazą danych
  13. $this->dbhandle = pg_connect("host=db dbname=prophp5 user=edek") or die ("Błąd PostgreSQL: --> " . pg_last_error($this->dbhandle));
  14. # Inicjalizuje mechanizm obsługi sesji
  15. array(&$this, '_session_open_method'), 
  16. array(&$this, '_session_close_method'), 
  17. array(&$this, '_session_read_method'), 
  18. array(&$this, '_session_write_method'), 
  19. array(&$this, '_session_destroy_method'), 
  20. array(&$this, '_session_gc_method')
  21. );
  22. # Sprawdza przesłane cookie o ile je przesłano; jeżeli wygląda podejrzanie zosta
    ja z miejsca anulowane  
  23. $strUserAgent = $GLOBALS["HTTP_USER_AGENT"];
  24. if ($_COOKIE["PHPSESSID"]) {
  25.  # Kontrola bezpieczeństwa i ważności
  26.  $this->php_session_id = $_COOKIE["PHPSESSID"];
  27.  $stmt = "SELECT id FROM "sesja_uzytkownika" WHERE identyfikator_sesji_ascii = '" . $this->php_session_id . "' AND ((now() - utworzono) < ' " . $this->session_lifespan . " seconds') AND user_agent='" . $strUserAgent . "' AND ((now() - ostatnia_reakcja) <= '".$this->session_timeout." seconds' OR ostatnia_reakcja IS NULL)";
  28.  $result = pg_query($stmt);
  29.  if (pg_num_rows($result)==0) {
  30.  # Ustawia znacznik niepowodzenia
  31. $failed = 1;
  32.  # Usuwa z bazy danych - w tym samym czasie usuwane są przeterminowane sesje
  33.  $result = pg_query("DELETE FROM "sesja_uzytkownika" WHERE (identyfikator_sesji_ascii = '". $this->php_session_id . "') OR (now() - utworzono) > $maxlifetime)");
  34.  # Usuwa nieprzydatne zmienne sesji
  35.  $result = pg_query("DELETE FROM "zmienna_sesji" WHERE identyfikator_sesji NOT IN (SELECT id FROM "sesja_użytkownika")");
  36.  # Pozbywa się identyfikatora, wymuszając na php nadanie nowego
  37.  unset($_COOKIE["PHPSESSID"]);
  38.  };
  39. };
  40. # Ustawia czas życia cookie
  41. session_set_cookie_params($this->session_lifespan);
  42. # Wywołuje metodę session_start by zainicjować sesję
  43. }
  44.  
  45. public function Impress() {
  46. if ($this->native_session_id) {
  47. $result = pg_query("UPDATE "sesja_uzytkownika" SET ostatnia_reakcja = now() WHERE id = " . $this->native_session_id);
  48. };
  49. }
  50.  
  51. public function IsLoggedIn() {
  52. return($this->logged_in);
  53. }
  54.  
  55. public function GetUserID() {
  56. if ($this->logged_in) {
  57. return($this->user_id);
  58. } else {
  59. return(false);
  60. };
  61. }
  62.  
  63. public function GetUserObject() {
  64. if ($this->logged_in) {
  65. if (class_exists("user")) {
  66. $objUser = new User($this->user_id);
  67. return($objUser);
  68. } else {
  69. return(false);
  70. };
  71. };
  72. }
  73.  
  74. public function GetSessionIdentifier() {
  75. return($this->php_session_id);
  76. }
  77.  
  78. public function Login($strUsername, $strPlainPassword) {
  79.  $strMD5Password = md5($strPlainPassword);
  80.  $stmt = "SELECT id FROM "uzytkownik" WHERE nazwa_uzytkownika = '$strUsername' AND md5_haslo = '$strMD5Password'";
  81.  $result = pg_query($stmt);
  82.  if (pg_num_rows($result)>0) {
  83. $row = pg_fetch_array($result);
  84. $this->user_id = $row["id"];
  85. $this->logged_in = true;
  86. $result = pg_query("UPDATE "sesja_uzytkownika" SET zalogowany = true, identyfikator_uzytkownika = " . $this->user_id . " WHERE id = " . $this->native_session_id);
  87. return(true);
  88.  } else {
  89. return(false);
  90.  };
  91. }
  92.  
  93. public function LogOut() {
  94.  if ($this->logged_in == true) {
  95. $result = pg_query("UPDATE "sesja_uzytkownika" SET zalogowany = false, identyfikator_uzytkownika = 0 WHERE id = " . $this->native_session_id);
  96. $this->logged_in = false;
  97. $this->user_id = 0;
  98. return(true);
  99.  } else {
  100. return(false);
  101.  };
  102. }
  103.  
  104. public function __get($nm) {
  105.  $result = pg_query("SELECT wartosc_zmiennej FROM zmienna_sesji WHERE identyfikator_sesji = " . $this->native_session_id . " AND nazwa_zmiennej = '" . $nm . "'");
  106.  if (pg_num_rows($result)>0) {
  107. $row = pg_fetch_array($result);
  108. return(unserialize($row["wartosc_zmiennej"]));
  109.  } else {
  110. return(false);
  111.  };
  112. }
  113.  
  114.  
  115. public function __set($nm, $val) {
  116.  $strSer = serialize($val);
  117.  $stmt = "INSERT INTO zmienna_sesji(identyfikator_sesji, nazwa_zmiennej, wartosc_zmiennej) VALUES(" . $this->native_session_id . ", '$nm', '$strSer')";
  118.  $result = pg_query($stmt);
  119. }
  120.  
  121.  
  122. private function _session_open_method($save_path, $session_name) {
  123. # Do nothing
  124. return(true);
  125. }
  126.  
  127. private function _session_close_method() {
  128. pg_close($this->dbhandle);
  129. return(true);
  130. }
  131.  
  132. private function _session_read_method($id) {
  133.  # Służy do ustalenia, czy nasza sesja w ogóle istnieje
  134.  $strUserAgent = $GLOBALS["HTTP_USER_AGENT"];
  135.  $this->php_session_id = $id;
  136.  # Na razie ustawia znacznik niepowodzenie na 1
  137.  $failed = 1;
  138.  # Sprawdza czy sesja istnieje w bazie danych
  139.  $result = pg_query("SELECT id, zalogowany, identyfikator_uzytkownika FROM "sesja_uzytkownika" WHERE identyfikator_sesji_ascii = '$id'");
  140.  if (pg_num_rows($result)>0) {
  141. $row = pg_fetch_array($result);
  142. $this->native_session_id = $row["id"];
  143. if ($row["zalogowany"]=="t") {
  144.  $this->logged_in = true;
  145.  $this->user_id = $row["identyfikator_uzytkownika"];
  146. } else {
  147.  $this->logged_in = false;
  148. };
  149.  } else {
  150. $this->logged_in = false;
  151. # Konieczne jest stworzenie wpisu w bazie danych
  152. $result = pg_query("INSERT INTO sesja_uzytkownika(identyfikator_sesji_ascii, zalogowany, identyfikator_uzytkownika, utworzono
    , user_agent) VALUES ('$id','f',0,now(),'$strUserAgent')"
    );
  153. # Teraz pobiera prawdziwy identyfikator
  154. $result = pg_query("SELECT id from "sesja_uzytkownika" WHERE identyfikator_sesji_ascii = '$id'");
  155. $row = pg_fetch_array($result);
  156. $this->native_session_id = $row["id"];
  157.  };
  158.  # Zwraca jedynie ciąg pusty
  159.  return("");
  160. }
  161.  
  162. private function _session_write_method($id, $sess_data) {
  163.  return(true);
  164. }
  165.  
  166. private function _session_destroy_method($id) {
  167.  $result = pg_query("DELETE FROM "sesja_uzytkownika" WHERE identyfikator_sesji_ascii = '$id'");
  168.  return($result);
  169. }
  170.  
  171.  
  172. private function _session_gc_method($maxlifetime) {
  173. return(true);
  174. }
  175.  
  176.  
  177. }
  178. ?>


oraz plik testujacy działanie class-y
przeprowadza on logowanie uzytkownika edek oraz jego wylogowanie
usersessiontest.php

  1. <?php
  2. require_once("usersession.phpm");
  3.  
  4. $objSession = new UserSession();
  5. $objSession->Impress();
  6. ?>
  7. Strona testowa klasy UserSession
  8. <HR>
  9. <B>Bieżący identyfikator sesji: </B> <?=$objSession->GetSessionIdentifier();?><BR>
  10. <B>Użytkownik zalogowany? </B> <?=(($objSession->IsLoggedIn() == true) ? "Tak" : "Nie")?><BR>
  11. <BR><BR>
  12. Próba logowania ...
  13. <?php $objSession->Login("edek","12345"); ?>
  14. <BR><BR>
  15. <B>Użytkownik zalogowany? </B> <?=(($objSession->IsLoggedIn() == true) ? "Tak" : "Nie")?><BR>
  16. <B>Identyfikator zalogowanego użytkownika: </B> <?=$objSession->GetUserID();?><BR>
  17.  
  18. <BR><BR>
  19. Wylogowywanie...
  20. <?php $objSession->Logout(); ?>
  21. <BR><BR>
  22. <B>Użytkownik zalogowany? </B> <?=(($objSession->IsLoggedIn() == true) ? "Tak" : "Nie")?><BR>
  23. <BR><BR>
nospor
a na czym konkretnie polega Twoj problem? Z tego co tu widze to musisz funkcje z rodziny pg_... pozamieniac na ich odpowiedniki do mysql, czyli mysql_..... Ot i cala filozofia. W celu sprawdzenia czy istnieje odpowiednik danej funkcji, polecam jak zwykle manuala.
grzegorz-gg
Mam problem z tym fragmentem kodu

  1. <?php
  2. public function __construct() {
  3. # Łączy z bazą danych
  4. $this->dbhandle = pg_connect("host=db dbname=prophp5 user=edek") or die ("Błąd PostgreSQL: --> " . pg_last_error($this->dbhandle));
  5. ...
  6. ?>


tu w połączeniu jest odrazu podawana nazwa bazy danych a do MySQL nie znam takiej funkcji
najpierw trzeba by sie połączyć z bazą a dopiero potem przy pomocy funkcji mysql_select_db() wybrać bazę danych.
nospor
Jak juz mowilem: polecam manuala. On zna wszystkie funkcje i zazwyczaj jest chetny do dzielenia sie tymi informacjami:
http://pl.php.net/manual/pl/function.mysql-select-db.php

edit:
@NuLL a przegapilem ten tekst smile.gif a duzo masz tych pralek? Mi sie moja psuje
NuLL
Cytat
najpierw trzeba by sie połączyć z bazą a dopiero potem przy pomocy funkcji mysql_select_db() wybrać bazę danych.

Gratulujemy - wygrales pralke smile.gif
Prph
Cytat(grzegorz-gg @ 29.05.2006, 20:42 ) *
Witam!
Mam problem z przerobieniem klasy do zarzadzanie sesjami która współpracuje z bazą PostgreSQL na współprace z baza MySQL.
Przykład class-y pochdzi z książki "PHP5 zaawansowane programowanie" zamieszcze poniżej skrypty z ksiażki i jeżeli to możliwe to prosze o pomoc w przeróbce.


Witam,

Mam ta ksiazke. Klasa moze calkiem ciekawa, ale m.in. czytajac ten rozdzial watpilem, czy autorzy to naprawde profesjonalisci. Proponuje, nie zrzynac zywcem klasy, ale co najwyzej napisac swoja, oparta o to cos.

Ja tak zrobilem (nie uzywam jej ;P). Nizej kod:

  1. <?php
  2.  
  3. class NotLoggedInSessionException extends Exception
  4. {
  5. }
  6.  
  7. class Session
  8. {
  9. private $_oDatabase;
  10.  
  11. private static $_oInstance;
  12.  
  13. private $_sPHPSessionId;
  14. private $_iNativeSessionId;
  15. private $_iSessionLifespan = 3600;
  16. private $_iSessionTimeout = 600;
  17.  
  18. private $_iUserId;
  19. private $_bIsLoggedIn;
  20.  
  21. private function __construct()
  22. {
  23. $this->_oDatabase = Database::getInstance();
  24. $this->_bHasSessionStarted = false;
  25. $this->_bIsLoggedIn = false;
  26.  
  27. if(Registry::doesEntryExist('session', 'session-lifespan'))
  28. $this->_iSessionLifespan = Registry::getEntry('session', 'session-lifespan');
  29.  
  30. if(Registry::doesEntryExist('session', 'session-timeout'))
  31. $this->_iSessionTimeout = Registry::getEntry('session', 'session-timeout');
  32.  
  33. if(Registry::doesEntryExist('session', 'session-name'))
  34. session_name(Registry::getEntry('session', 'session-name'));
  35.  
  36. (
  37. array(&$this, '_sessionOpen'),
  38. array(&$this, '_sessionClose'),
  39. array(&$this, '_sessionRead'),
  40. array(&$this, '_sessionWrite'),
  41. array(&$this, '_sessionDestroy'),
  42. array(&$this, '_sessionGC')
  43. );
  44. }
  45.  
  46. public function start()
  47. {
  48. if(!$this->_hasSessionStarted())
  49. {
  50. try
  51. {
  52. $this->_sessionGC();
  53. $this->_checkForActiveSession();
  54. }
  55. catch (Exception $oException)
  56. {
  57. throw $oException;
  58. }
  59.  
  60. session_set_cookie_params($this->_iSessionLifespan);
  61. }
  62. }
  63.  
  64. public static function getInstance()
  65. {
  66. if(!isset(self::$_oInstance))
  67. {
  68. $sClassName = __CLASS__;
  69. self::$_oInstance = new $sClassName;
  70. }
  71.  
  72. return self::$_oInstance;
  73. }
  74.  
  75. public function _sessionOpen($sSavePath, $sSessionName)
  76. {
  77. return true;
  78. }
  79.  
  80. public function _sessionRead($sPHPSessionId)
  81. {
  82. try
  83. {
  84. if(!$this->_hasSessionStarted())
  85. $this->_createNewSession($sPHPSessionId);
  86. else
  87. {
  88. $sQuery = 'SELECT id, logged_in, user_id, vars
  89.  FROM session
  90.  WHERE phpsessid = "'.$sPHPSessionId.'"';
  91.  
  92. $this->_oDatabase->query($sQuery);
  93.  
  94. $aRow = $this->_oDatabase->fetch();
  95.  
  96. $this->_iNativeSessionId = $aRow['id'];
  97. $this->_bLoggedIn = $aRow['logged_in'];
  98. $this->_iUserId = $aRow['user_id'];
  99. }
  100. }
  101. catch (Exception $oException)
  102. {
  103. throw $oException;
  104. }
  105.  
  106. if(!empty($aRow['vars']))
  107. return $aRow['vars'];
  108. else
  109. return '';
  110. }
  111.  
  112. public function _sessionWrite($sPHPSessionId, $sData)
  113. {
  114. $aToUpdate[] = array('vars', $sData);
  115.  
  116. try
  117. {
  118. $this->_oDatabase->update('session', $aToUpdate, 'phpsessid = "'.$this->_sPHPSessionId.'"');
  119. }
  120. catch (Exception $oException)
  121. {
  122. return false;
  123. }
  124.  
  125. return true;
  126. }
  127.  
  128. public function _sessionDestroy($sPHPSessionId)
  129. { return true;
  130. $sQuery = 'DELETE FROM session
  131.  WHERE phpsessid = "'.$sPHPSessionId.'"';
  132.  
  133. try
  134. {
  135. $this->_oDatabase->query($sQuery);
  136. }
  137. catch (Exception $oException)
  138. {
  139.  throw $oException;
  140. }
  141.  
  142. $this->_bIsLoggedIn = false;
  143.  
  144. return true;
  145. }
  146.  
  147. public function _sessionGC($iMaxLifeTime = null)
  148. {
  149. $sQuery = 'DELETE FROM session
  150.  WHERE
  151.  ((now() - start) > '.$this->_iSessionLifespan.') OR
  152.  ((now() - last_activity) > '.$this->_iSessionTimeout.')';
  153.  
  154. try
  155. {
  156. $this->_oDatabase->query($sQuery);
  157. }
  158. catch (Exception $oException)
  159. {
  160.  throw $oException;
  161. }
  162.  
  163. return true;
  164. }
  165.  
  166. public function _sessionClose()
  167. {
  168. return true;
  169. }
  170.  
  171. private function _updateSession()
  172. {
  173. if(isset($this->_iNativeSessionId))
  174. {
  175. $aToUpdate[] = array('last_activity', 'now()', false);
  176.  
  177. try
  178. {
  179. $this->_oDatabase->update('session', $aToUpdate, 'id = "'.$this->_iNativeSessionId.'"');
  180. }
  181. catch (Exception $oException)
  182. {
  183. throw $oException;
  184. }
  185. }
  186. }
  187.  
  188. private function _hasSessionStarted()
  189. {
  190. if(isset($this->_iNativeSessionId))
  191. return true;
  192. else
  193. return false;
  194. }
  195.  
  196. private function _createNewSession($sPHPSessionId)
  197. {
  198. $sUserAgent = $_SERVER['HTTP_USER_AGENT'];
  199.  
  200. $aToInsert[] = array('phpsessid', $sPHPSessionId);
  201. $aToInsert[] = array('start', 'now()', false);
  202. $aToInsert[] = array('user_agent', $sUserAgent);
  203.  
  204. try
  205. {
  206. $this->_oDatabase->insert('session', $aToInsert);
  207.  
  208. $this->_iNativeSessionId = $this->_oDatabase->getInsertId();
  209.  
  210. $this->_sPHPSessionId = $sPHPSessionId;
  211. $this->_iUserId = 0;
  212. }
  213. catch (Exception $oException)
  214. {
  215.  throw $oException;
  216. }
  217. }
  218.  
  219. private function _checkForActiveSession()
  220. {
  221. $sUserAgent = $_SERVER['HTTP_USER_AGENT'];
  222.  
  223. $sSessionName = session_name();
  224.  
  225. if(!empty($_COOKIE[$sSessionName]))
  226. {
  227. $this->_sPHPSessionId = $_COOKIE[$sSessionName];
  228.  
  229. $sQuery = 'SELECT id
  230.  FROM session
  231.  WHERE
  232.  phpsessid = "'.$this->_sPHPSessionId.'" AND
  233.  (
  234.  (now() - start) < '.$this->_iSessionLifespan.' AND
  235.  user_agent = "'.$sUserAgent.'" AND
  236.  (now() - last_activity) <= '.$this->_iSessionTimeout.'
  237.  ) OR
  238.  last_activity IS NULL';
  239.  
  240. try
  241. {
  242. $this->_oDatabase->query($sQuery);
  243.  
  244. if($this->_oDatabase->numRows() === 0)
  245. {
  246. unset($_COOKIE[$sSessionName]);
  247. }
  248. else
  249. {
  250. $aRow = $this->_oDatabase->fetch();
  251. $this->_iNativeSessionId = $aRow['id'];
  252. $this->_updateSession();
  253. }
  254. }
  255. catch (Exception $oException)
  256. {
  257. throw $oException;
  258. }
  259. }
  260. }
  261.  
  262. public function isLoggedIn()
  263. {
  264. return $this->_bIsLoggedIn;
  265. }
  266.  
  267. public function getUserId()
  268. {
  269. if($this->isLoggedIn())
  270. return $this->_iUserId;
  271. }
  272.  
  273. public function getUserObject()
  274. {
  275. if($this->isLoggedIn())
  276. {
  277. try
  278. {
  279.  $oUser = new User($this->getUserId());
  280.  return $oUser;
  281. }
  282. catch (Exception $oException)
  283. {
  284. throw $oException;
  285. }
  286. }
  287. else
  288. throw new NotLoggedInSessionException('Can not return object, user have not logged in yet');
  289. }
  290.  
  291. public function login($sLogin, $sPlainPassword)
  292. {
  293. $sPassword = md5($sPlainPassword);
  294.  
  295. $sQuery = 'SELECT id FROM users
  296.  WHERE
  297.  login = "'.$sLogin.'" AND
  298.  password = "'.$sPassword.'"';
  299.  
  300. try
  301. {
  302. $this->_oDatabase->query($sQuery);
  303. if($this->_oDatabase->numRows() == 1)
  304. {
  305. $aUser = $this->_oDatabase->fetch();
  306. $this->_iUserId = $aUser['id'];
  307.  
  308. $aToUodate[] = array('logged_in', 'true');
  309. $aToUodate[] = array('user_id', $this->_iUserId);
  310.  
  311. $this->_oDatabase->update('session', $aToUodate, 'id = "'.$this->_iNativeSessionId.'"');
  312.  
  313. $this->_bIsLoggedIn = true;
  314.  
  315. return true;
  316. }
  317. }
  318. catch (Exception $oException)
  319. {
  320.  throw $oException;
  321. }
  322. }
  323.  
  324. public static function logout()
  325. {
  326. if($this->isLoggedIn())
  327. {
  328. $aToUodate[] = array('logged_in', false);
  329. $aToUodate[] = array('user_id', 0);
  330.  
  331. try
  332. {
  333. $this->_oDatabase->update('session', $aToUodate, 'id = "'.$this->_iNativeSessionId.'"');
  334.  
  335. $this->_bIsLoggedIn = false;
  336. return true;
  337. }
  338. catch (Exception $oException)
  339. {
  340.  throw $oException;
  341. }
  342. }
  343. }
  344. }
  345. ?>


Nie chce mi sie juz jej komentowac, jej bedow tez (bedy przede wszystkim w wyjatkach.)
Uzylem wlasnego silnika bazy. Nizej kod:
Proszę nie umieszczac takich ilosci kodu!!! Usuwam /~nospor/
grzegorz-gg
to ze jest manuala to ja wiem ale nie spotkalem się z taką funkcia do MySQL która laczy sie z bazą i wybiera jednoczenie nazwe bazy.
nospor
Cytat
to ze jest manuala to ja wiem ale nie spotkalem się z taką funkcia do MySQL która laczy sie z bazą i wybiera jednoczenie nazwe bazy.
No i wlasnie dlatego nalezy zrobic to co zaproponowales w poprzednim poscie za co zreszta wygrales pralke winksmiley.jpg
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.