Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> Problemy z kopią sesji...
MWL
post
Post #1





Grupa: Zarejestrowani
Postów: 493
Pomógł: 32
Dołączył: 14.04.2008
Skąd: Lenkowski.net

Ostrzeżenie: (0%)
-----


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 (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
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi (1 - 8)
Darti
post
Post #2





Grupa: Zarejestrowani
Postów: 1 076
Pomógł: 62
Dołączył: 6.03.2005
Skąd: Wroc

Ostrzeżenie: (0%)
-----


bo to jest referencja, może użyj clone

Ten post edytował Darti 23.11.2008, 21:49:29
Go to the top of the page
+Quote Post
MWL
post
Post #3





Grupa: Zarejestrowani
Postów: 493
Pomógł: 32
Dołączył: 14.04.2008
Skąd: Lenkowski.net

Ostrzeżenie: (0%)
-----


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?

Ten post edytował MWL 24.11.2008, 15:47:24
Go to the top of the page
+Quote Post
erix
post
Post #4





Grupa: Moderatorzy
Postów: 15 467
Pomógł: 1451
Dołączył: 25.04.2005
Skąd: Szczebrzeszyn/Rzeszów




A jak używasz clone" title="Zobacz w manualu PHP" target="_manual? Masz użyć na klasie, a nie na tablicy sesyjnej. (IMG:http://forum.php.pl/style_emoticons/default/tongue.gif)
Go to the top of the page
+Quote Post
MWL
post
Post #5





Grupa: Zarejestrowani
Postów: 493
Pomógł: 32
Dołączył: 14.04.2008
Skąd: Lenkowski.net

Ostrzeżenie: (0%)
-----


Hej, ale gdzie ty tu widzisz jakikolwiek związek z Klasą? Nie rozumiem twojego pomysłu...
Go to the top of the page
+Quote Post
Mize
post
Post #6





Grupa: Zarejestrowani
Postów: 84
Pomógł: 6
Dołączył: 26.03.2008
Skąd: Łódź

Ostrzeżenie: (0%)
-----


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.
Go to the top of the page
+Quote Post
MWL
post
Post #7





Grupa: Zarejestrowani
Postów: 493
Pomógł: 32
Dołączył: 14.04.2008
Skąd: Lenkowski.net

Ostrzeżenie: (0%)
-----


Jakieś pomysły rozwiązania mojego problemu?
Albo inaczej, to jest rozwiązywalne?

Ten post edytował MWL 24.11.2008, 19:31:55
Go to the top of the page
+Quote Post
Darti
post
Post #8





Grupa: Zarejestrowani
Postów: 1 076
Pomógł: 62
Dołączył: 6.03.2005
Skąd: Wroc

Ostrzeżenie: (0%)
-----


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 ?

Ten post edytował Darti 24.11.2008, 19:35:30
Go to the top of the page
+Quote Post
MWL
post
Post #9





Grupa: Zarejestrowani
Postów: 493
Pomógł: 32
Dołączył: 14.04.2008
Skąd: Lenkowski.net

Ostrzeżenie: (0%)
-----


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 (IMG:http://forum.php.pl/style_emoticons/default/tongue.gif)

Co do ciastka, źle sie wyraziłem w komentarzu (IMG:http://forum.php.pl/style_emoticons/default/smile.gif)

Ten post edytował MWL 24.11.2008, 19:42:29
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
2 Użytkowników czyta ten temat (2 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Aktualny czas: 3.10.2025 - 14:42