Witaj, Gościu O nas | Kontakt | Mapa
Wortal Forum PHPEdia.pl Planeta Kubek IRC Przetestuj się!

Session Handler - część I

Implementacje

Przygotowanie bazy

Pierwszym krokiem, jaki powinniśmy uczynić przed kodowaniem to przygotowanie bazy i tabeli, w której będziemy przechowywać nasze dane sesyjne. Odpalmy więc naszego klienta MySQL i postępujmy zgodnie z poniższymi wskazówkami. Jeśli zamierzamy poświęcić nową bazę danych dla tabeli, w której będą przechowywane dane sesyjne wykonujemy:

mysql> CREATE DATABASE sessions;

Ustawiamy odpowiednie prawa dla użytkownika który z tej bazy będzie korzystał:

Wybieramy stworzoną przez nas bazę, komendą:

Tworzymy tabelę, w której będą przechowywane nasze dane sesyjne:

Klasa

<?php
 class Session
 {
  /**
  * Dane konfiguracyjne bazy danych
  * @var array $db_config Ustawiane przez konstruktor @see session();
  * @access public
  */
  var $db_config;
  
  /**
  * Tabela z danymi sesyjnymi
  * @var array $session_table Ustawiana przez konstruktor @see session();
  * @access public
  */
  var $session_table; 
  
  /**
  * Maksymalny czas istnienia nieaktywnej sesji
  * @var array $session_table Ustawiana przez konstruktor @see session();
  * @access public
  */
  var $session_lifetime;
  
  /**
  * Konstruktor
  * Ustalanie parametrów i przygotowywanie środowiska pod funkcjonowanie klasy
  * @param string $db_config Dane konfiguracyjne bazy
  * @param string $session_table Tabela z danymi sesyjnymi 
  * @param string $session_lifetime Maksymalny czas istnienia nieaktywnej sesji @default 0 
  * @return void 
  * @access public 
  */ 
  function session($db_config = '', $session_table, $session_lifetime = 0) 
  {
  if(!empty($db_config)){
  // Ustalanie danych konfiguracyjnych bazy
  $this->db_config['host'] = $db_config['host'];
  $this->db_config['user'] = $db_config['user'];
  $this->db_config['password'] = $db_config['password'];
  $this->db_config['datebase'] = $db_config['datebase'];
  $this->db_config['persistent'] = $db_config['persistent'];
  } 
  
  // Ustawianie tabeli
 $this->session_table = $session_table;
 $this->session_lifetime = $session_lifetime; 
  }
  
  /**
  * Nawiązywanie połączenia bazodanowego
  * @return bool 
  * @access public 
  */ 
  function connection() 
  {
  // Typ połączenia
  $connect_type = $this->db_config['persistent'] ? 'mysql_pconnect' : 'mysql_connect';
  
  $connect = @$connect_type($this->db_config['host'], $this->db_config['user'], $this->db_config['pass']);
  $db_select = @mysql_select_db ($this->db_config['datebase']);
       
  if ($connect && $db_select) {
  return true;
  } else {
  return false;
  } 
  }
  
  /**
  * Inicjalizacja sesji 
  * @param string $sesion_savepath Lokalizacja zapisu sesji
  * @param string $session_name Nazwa sesji 
  * @return bool 
  * @access private 
  */ 
  function _open($session_savepath, $session_name) 
  {
  if($this->db_config != null) {
  // Nawiązywanie połączenia
  $this->connection();
  }
  return true; 
  }
       
  /**
  * Zakończenie sesji
  * @return bool 
  * @access private 
  */ 
  function _close()
  {
  $this->_gc($this->session_lifetime);
  
  return true;
  } 
       
  /**
  * Odczytywanie danych sesyjnych
  * @param string $session_id Identyfikator sesji
  * @return mixed
  * @access private 
  */ 
  function _read($session_id) 
  {
  $sql_query = "SELECT session_value 
  FROM " . $this->session_table . " 
  WHERE session_id = '" . $session_id . "'";
  $result = @mysql_query($sql_query);
  if ($result && @mysql_num_rows($result) > 0) {
  $row = mysql_fetch_array($result);
  $session_value = $row['session_value'];
  
  return $session_value;
  } else { 
  return false;
  } 
  }
       
  /**
  * Zapisywanie danych sesyjnych
  * @param string $session_id Identyfikator sesji
  * @param string $session_value Wartości sesyjne
  * @return bool
  * @access private 
  */ 
  function _write($session_id, $session_value) 
  {
  $session_start = time();
  $session_time = time();
  
  $sql_query = "INSERT INTO " . $this->session_table . " (session_id, session_start, session_time, session_value) 
  VALUES ('" . $session_id . "', " . $session_start . ", " . $session_time . ", '" . $session_value . "')";
  $result = @mysql_query($sql_query);
  
  if ($result) {
  return true;
  } else {
  $sql_query = "UPDATE " . $this->session_table . " 
  SET session_time = " . $session_time . ", session_value = '" . $session_value . "' 
  WHERE session_id = '" . $session_id . "'";
  $result = @mysql_query($sql_query); 
  if ($result) {
  return true;
  } else {
  return false;
  } 
  }
  } 
       
  /**
  * Usuwanie danych sesyjnych
  * @param string $session_id Identyfikator sesji
  * @return bool
  * @access private 
  */ 
  function _destroy($session_id) 
  {
  $sql_query = "DELETE FROM " . $this->session_table . " 
  WHERE session_id = '" . $session_id . "'"; 
  $result = @mysql_query($sql_query);
  if ($result) {
  return true;
  } else {
  return false;
  } 
  } 
       
  /**
  * "Garbage collection" - Usuwanie niepotrzebnych danych sesyjnych
  * @param in $session_lifetime Identyfikator sesji
  * @return bool
  * @access private 
  */ 
  function _gc($session_lifetime) 
  {
  $sql_query = "DELETE FROM " . $this->session_table . " 
  WHERE session_time < " . time() - $session_lifetime . "";
  $result = @mysql_query($sql_query);
  if ($result) {
  return true;
  } else {
  return false;
  } 
  } 
 }
 ?>

Wykorzystanie

Poniżej przedstawiam przykładowe wykorzystanie klasy:

/**#@+
  * Dane konfiguracyjne bazy
  */
 $db_config['host'] = "localhosta";
 $db_config['user']= "session";
 $db_config['password'] = "session";
 $db_config['datebase'] = "sessions";
 $db_config['persistent'] = true;
       
 /**
  * Nazwa tabeli, w której przechowywane są dane sesyjne
  */
 $session_table = "sessions";
       
 /**
  * Czas trwania sesji po upływie którego nieaktywne sesje zostają
  * usunięte
  */
 $session_lifetime = 300;
       
 // Tworzenie obiektu zarządzania sesją
 $session = new Session($db_config, $session_table, $session_lifetime);
       
 // Zastępowanie domyślnych funkcji metodami sesji
 session_set_save_handler (array(&$session, '_open'),
  array(&$session, '_close'),
  array(&$session, '_read'),
  array(&$session, '_write'),
  array(&$session, '_destroy'),
  array(&$session, '_gc'));
       
 session_start();

Teraz możemy już zapisywać normalnie nasze dane sesyjne i gromadzić je w bazie danych.

Informacje na podobny temat:
Wasze opinie
Wszystkie opinie użytkowników: (3)
Gdzie są wartości dla session_value?
Sobota 26 Wrzesień 2009 7:15:32 pm - maly_pirat <army-clan_at_wp.pl>

Cześć.

A co miałbym przetrzymywać w session_value - teraz widzę tylko, że pobieramy informacje o tym, przepisujemy do zmiennych, ale co dokładnie, jaką zawartość przepisujemy?

piękne
Wtorek 02 Październik 2007 8:24:20 pm - itar

Całkiem porządna instrukcja, szkoda, że autor wsadził tam bugi ... takie chyba dla inteligentnych, by sobie poprawili

Irek

Fajne :)
Niedziela 14 Maj 2006 5:42:11 pm - kackoz <kackoz_at_o2.pl>

Bardzo fajny artykuł. Chciałbym zrobić skrypt logowania za pomocą jego, ale jestem początkującym programistą PHP. Pomożecie?

Mentax.pl    NQ.pl- serwery z dodatkiem świętego spokoju...   
O nas | Kontakt | Mapa serwisu
Copyright (c) 2003-2022 php.pl    Wszystkie prawa zastrzeżone    Powered by eZ publish Content Management System eZ publish Content Management System