Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> [PHP] Sesja, a obiekt, czy można obiekt zapisać w sesji ?
arszawin
post 9.08.2010, 23:03:44
Post #1





Grupa: Zarejestrowani
Postów: 17
Pomógł: 0
Dołączył: 1.07.2008

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


  1. $_SESSION[temp] = new Obiekt();
  2. $_SESSION[temp]->metoda();


Czy taki zapis jest poprawny? Nie wiem dlaczego pojawia się błąd:
Cytat
Fatal error: main() [<a href='function.main'>function.main</a>]: The script tried to execute a method or access a property of an incomplete object. Please ensure that the class definition &quot;Kupon&quot; of the object you are trying to operate on was loaded _before_ unserialize() gets called or provide a __autoload() function to load the class definition in


Ten post edytował arszawin 9.08.2010, 23:08:17
Go to the top of the page
+Quote Post
Pawel_W
post 9.08.2010, 23:26:17
Post #2





Grupa: Zarejestrowani
Postów: 1 675
Pomógł: 286
Dołączył: 15.06.2009
Skąd: Wieliczka

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


a słyszałeś o serializacji? guitar.gif

serialize

http://pl.php.net/manual/pl/language.oop5.serialization.php
Go to the top of the page
+Quote Post
arszawin
post 10.08.2010, 14:23:58
Post #3





Grupa: Zarejestrowani
Postów: 17
Pomógł: 0
Dołączył: 1.07.2008

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


Przyznam, że zrozumienie serializacji sprawia mi trochę problemu.
  1. <?php
  2. require_once("obiekt.php");
  3.  
  4. if ( !isset ( $_SESSION[ob] ) ) {
  5. $_SESSION[ob] = new Obiekt();
  6. }
  7.  
  8. $_SESSION[ob] -> dodajObiekt(1);
  9. echo $_SESSION[ob] -> liczbaObiektow();
  10. ?>

W przypadku, gdy sesja nie istnieje, zostanie ona utworzona i kod wykona się poprawnie. W drugim przypadku - pojawi się błąd, o którym wcześniej wspomniałem. Klasa Obiekt, która jest importowana i której instancja jest przechowywana w sesji bazuje na liście ArrayList, którą sam implementowałem.

Co powinienem serializować, a następnie odserializować, by odczyt obiektu z sesji był poprawny?

Wydawało mi się, że będzie to na wzór tego:
  1. if ( !isset ( $_SESSION[ob] ) ) {
  2. $_SESSION[ob] = serialize ( new Obiekt() );
  3. }
  4.  
  5. $_SESSION[ob] = serialize ( unserialize ( $_SESSION[ob] ) -> dodajObiekt (1) );
  6. echo unserialize ( $_SESSION[ob] ) -> liczbaObiektow();

ale teraz mamy błąd:
Cytat
Fatal error: Call to a member function dodajObiekt() on a non-object in ...


Ten post edytował arszawin 10.08.2010, 14:23:49
Go to the top of the page
+Quote Post
wookieb
post 10.08.2010, 14:27:42
Post #4





Grupa: Moderatorzy
Postów: 8 989
Pomógł: 1550
Dołączył: 8.08.2008
Skąd: Słupsk/Gdańsk




To co miałeś na początku było dobre. Problem polega na tym, że próba odserializowania ciągu w innym skrypcie nie powiodła się ponieważ plik z potrzebną klasą nie został dołączony do skryptu.
Przykład
  1. class test
  2. {
  3. public function foo(){ return 'foo'; }
  4. }
  5.  
  6. $test = new test();
  7. $_SESSION['test'] = $test;



Drugi skrypt
  1. require_once 'test.php'; // sama definicja klasy test
  2. $_SESSION['test']->foo();

Zadziała już ok. Można z tego problemu wybrnąć poprzez stosowanie autoloaderów.


--------------------
Go to the top of the page
+Quote Post
arszawin
post 10.08.2010, 15:07:58
Post #5





Grupa: Zarejestrowani
Postów: 17
Pomógł: 0
Dołączył: 1.07.2008

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


Cytat
To co miałeś na początku było dobre

Masz na myśli ten kod?
  1. <?php
  2. require_once("obiekt.php");
  3.  
  4. if ( !isset ( $_SESSION[ob] ) ) {
  5. $_SESSION[ob] = new Obiekt();
  6. }
  7.  
  8. $_SESSION[ob] -> dodajObiekt(1);
  9. echo $_SESSION[ob] -> liczbaObiektow();
  10. ?>

Napisałeś, że przyczyną problemów jest to, że plik z potrzebną klasą nie został dołączony do skryptu. Chyba jednak nie rozumiem - w trzeciej linijce mamy przecież require_once("obiekt.php");. Problem jest, gdy do sesji przypisany jest już jakiś obiekt klasy Obiekt - wtedy faktycznie jest jakiś problem z odczytem tego obiektu. Pawel_W w pierwszym poście zasugerował użycie serialize(), Ty wspomniałeś o autoloaderze(?) - teraz już nie wiem, co muszę zrobić, by wyeliminować błąd i liczbaObiektów przy każdym odświeżeniu była poprawnie inkrementowana;)
Go to the top of the page
+Quote Post
wookieb
post 10.08.2010, 15:15:56
Post #6





Grupa: Moderatorzy
Postów: 8 989
Pomógł: 1550
Dołączył: 8.08.2008
Skąd: Słupsk/Gdańsk




1)
  1. $_SESSION['ob'];

2) Jaki masz błąd?
3)
  1. require_once("obiekt.php");



Ten post edytował wookieb 10.08.2010, 15:16:23


--------------------
Go to the top of the page
+Quote Post

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

 



RSS Wersja Lo-Fi Aktualny czas: 13.06.2025 - 10:13