Witam. zrobiłem sobie taką klasę, która pomagać mi będzie w zarządzaniu sesją:
<?php
defined('ACCESS') or
die('Access to this file is forbidden.');
class Session {
// Dane
private $copy; // Kopia zapasowa sesji
// Zmienne logiczne
private static $instance = NULL; // Singleaton
private function __construct() {
// start sesji
// sprawdzenie czy użytkownik był już na stronie (czy ciasko z numerem IP istnieje)
// jeżeli nie zmienna sesji REMOTE_ADDR otrzyma wartość numeru IP komputera który korzysta ze strony
// jeżeli zmienna już istnieje i nie jest równa aktualnemu adresowi IP to możliwe jest iż sesja została przechwycona.
// w takim przypadku w celu bezpieczeństwa uruchomiona zostaje metoda destroy.
if(!isset($_SESSION['REMOTE_ADDR'])) { $_SESSION['REMOTE_ADDR'] = $_SERVER['REMOTE_ADDR'];
} elseif($_SESSION['REMOTE_ADDR'] !== $_SERVER['REMOTE_ADDR']) {
$this->destroy();
}
$this->send_session_data();
}
private function send_session_data() {
$this->copy = $_SESSION;
}
public function get_session_copy() {
return $this->copy;
}
/**
* Instancja (singleaton)
*
* Funkcja pobiera używaną instację klasy lub tworzy nową jeśli nie istnieje
*
* @access public
* @param void
* @return instance
*/
public static function instance
() { if(!self::$instance instanceof self)
self::$instance = new self;
return self::$instance;
}
/**
* Niszczenie sesji
*
* Funkcja ustawia pustą tablicę jako wartość sesji, a następnie całkowicie ją niszczy.
*
* @access public
* @param void
* @return instance
*/
public function destroy() {
// usunięcie wszystkich zmiennych z tablicy
// zniszczenie sesji
return;
}
}
?>
No, wszystko bardzo fajnie. Teraz tylko pojawia problem. używam funkcji:
<?php
public function defaultAction() {
$this->sendToView($_VGL, 'news');
load('sessions/class.sessions.php');
$session = Session::instance();
$this->drawSite();
$kopia = $session->get_session_copy();
$_SESSION['abc'] = time(); echo 'Zmienna która wcześniej miała postać: '.$kopia['abc']; echo ' obecnie ma wartość: '.$_SESSION['abc']; }
?>
I niby powinienem otrzymać jako kopię to co było wcześniej, a jako sesję to co jest teraz. Tak się jednak nie dzieje i obydwa czasy są takie same. Czym może być to spowodowane? Dodam tylko że kiedy przed zadeklarowaniem sesji daję echo czas jest prawidłowy. Wygląda na to że podczas każdego przypisania sesji tablica kopi się zmienia, jakby była referencją zmiennej (IMG:
http://forum.php.pl/style_emoticons/default/haha.gif) . Tylko pytanie, jakim cudem? macie pomyły?
Ten post edytował MWL 23.11.2008, 19:59:35