Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Problemy z kopią sesji...
Forum PHP.pl > Forum > PHP
MWL
Witam. zrobiłem sobie taką klasę, która pomagać mi będzie w zarządzaniu sesją:
  1. <?php
  2. defined('ACCESS') or die('Access to this file is forbidden.');
  3.  
  4. class Session {
  5.  
  6. // Dane
  7. private $copy; // Kopia zapasowa sesji
  8.  
  9. // Zmienne logiczne
  10. private static $instance = NULL; // Singleaton
  11.  
  12. private function __construct() {
  13.  // start sesji
  14.  // sprawdzenie czy użytkownik był już na stronie (czy ciasko z numerem IP istnieje)
  15.  // jeżeli nie zmienna sesji REMOTE_ADDR otrzyma wartość numeru IP komputera który korzysta ze strony
  16.  // jeżeli zmienna już istnieje i nie jest równa aktualnemu adresowi IP to możliwe jest iż sesja została przechwycona.
  17.  // w takim przypadku w celu bezpieczeństwa uruchomiona zostaje metoda destroy.
  18.  if(!isset($_SESSION['REMOTE_ADDR'])) {
  19.   $_SESSION['REMOTE_ADDR'] = $_SERVER['REMOTE_ADDR'];
  20.  } elseif($_SESSION['REMOTE_ADDR'] !== $_SERVER['REMOTE_ADDR']) {
  21.   $this->destroy();
  22.  }
  23.  $this->send_session_data();
  24. }
  25.  
  26. private function send_session_data() {
  27.  $this->copy = $_SESSION;
  28. }
  29.  
  30. public function get_session_copy() {
  31.  return $this->copy;
  32. }
  33.  
  34. /**
  35.   * Instancja (singleaton)
  36.   *
  37.   * Funkcja pobiera używaną instację klasy lub tworzy nową jeśli nie istnieje
  38.   *
  39.   * @access public
  40.   * @param void
  41.   * @return instance
  42.   */
  43.  
  44. public static function instance() {
  45.  if(!self::$instance instanceof self)
  46.  self::$instance = new self;
  47.  return self::$instance;
  48. }
  49.  
  50. /**
  51.   * Niszczenie sesji
  52.   *
  53.   * Funkcja ustawia pustą tablicę jako wartość sesji, a następnie całkowicie ją niszczy.
  54.   *
  55.   * @access public
  56.   * @param void
  57.   * @return instance
  58.   */
  59.  
  60. public function destroy() {
  61.  // usunięcie wszystkich zmiennych z tablicy
  62.  $_SESSION = array();
  63.  // zniszczenie sesji
  64.  return;
  65. }
  66.  
  67. }
  68.  
  69. ?>


No, wszystko bardzo fajnie. Teraz tylko pojawia problem. używam funkcji:
  1. <?php
  2. public function defaultAction() {
  3.  $_VGL = array(array('name'=>'Test'), array('name'=>'Test'), array('name'=>'Test'));
  4.  $this->sendToView($_VGL, 'news');
  5.  load('sessions/class.sessions.php');
  6.  $session = Session::instance();
  7.  $this->drawSite();
  8.  $kopia = $session->get_session_copy();
  9.  $_SESSION['abc'] = time();
  10.  echo 'Zmienna która wcześniej miała postać: '.$kopia['abc'];
  11.  echo ' obecnie ma wartość: '.$_SESSION['abc'];
  12. }
  13. ?>

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 haha.gif. Tylko pytanie, jakim cudem? macie pomyły?
Darti
bo to jest referencja, może użyj clone
MWL
No i jest tak jak myślałem, Fatal error: __clone method called on non-object. Nie mogę skopiować sesji w ten sposób.
inne pomysły?
erix
A jak używasz clone" title="Zobacz w manualu PHP" target="_manual? Masz użyć na klasie, a nie na tablicy sesyjnej. tongue.gif
MWL
Hej, ale gdzie ty tu widzisz jakikolwiek związek z Klasą? Nie rozumiem twojego pomysłu...
Mize
Klonujesz obiekt, a nie tablice.
Ale tutaj na nic się to nie zda bo Twoja klasa zarządza sesją ogólnie, a nie reprezentuje jedna, konkretną sesje.

Pozdrawiam.
MWL
Jakieś pomysły rozwiązania mojego problemu?
Albo inaczej, to jest rozwiązywalne?
Darti
Cytat(MWL @ 24.11.2008, 19:00:52 ) *
Hej, ale gdzie ty tu widzisz jakikolwiek związek z Klasą? Nie rozumiem twojego pomysłu...


A ja nie rozumiem Twojego... co ma wspólnego sesja z cookie'sami jeśli klient wyłączy ciastka? I dlaczego porównujesz typy zmiennych w 23 linii ? przeciez ten warunek praktycznie zawsze da logiczne false. Poza tym ma związek z klasą bo w wierszu 4 definiujesz klasę o nazwie Session ...
Poczytaj jeszcze o funkcji session_start(), która nie wystartuje nowej sesji jeśli sesja już istnieje (wymazałeś tylko jej wartości z tablicy $_SESSION).
No i szczerze wątpię czy w drugim listingu $kopia['abc'] zawiera coś sensownego (wiersz 11).
To jest skrypt tylko dla użytkowników o stałym IP ? A co z sieciami za NAT'em, które widoczne są pod jednym IP ?
MWL
Dzięki, czyli rozumiem że raczej to nie ma sensu.
Co do IP, sądziłem że ip nie zmienia się samo z siebie co minutę, ale jeśli mówisz że tak może być to rzeczywiście, to jest do dupy tongue.gif

Co do ciastka, źle sie wyraziłem w komentarzu smile.gif
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.