Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> Przechowywanie obiektu w sesji
yacoos
post 19.05.2007, 14:44:29
Post #1





Grupa: Zarejestrowani
Postów: 27
Pomógł: 0
Dołączył: 19.02.2005

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


Witam.
Na początku wypada się przyznać, że pierwszy raz próbuję przechować obiekt w sesji - jest to konkretnie obiekt QuickForm.
Na początku dostawałem worning o session_start. Więc teraz mam już najpierw :

  1. <?php
  2. include "HTML/QuickForm.php";
  3. include 'HTML/QuickForm/Renderer/ArraySmarty.php';
  4. include '../smarty/Smarty.class.php';
  5. ?>


a dopiero później:
  1. <?php
  2. session_name("xxx");
  3. ?>

Próbowałem już rozmaitych kombinacji i aktualnie sprawa wygląda tak - mam formularz tworzony quickformem i smarty. Nie wiem czy to potrzebne, ale obiekt tworzony jest od razu w sesji:
  1. <?php
  2. $_SESSION['formularz'] = new HTML_QuickForm('form_add_0', 'POST', 'test2.php?action=dodaj&krok=1');
  3. ?>


Pod tym formularzem wyświetlam sesję i jej zawartość jest poprawna. Dla uproszczenia plik test 2 zawiera już tylko:
  1. <?php
  2. include "HTML/QuickForm.php";
  3. include 'HTML/QuickForm/Renderer/ArraySmarty.php';
  4. include '../smarty/Smarty.class.php';
  5. session_name("skylan2");
  6. echo "<pre>";
  7. print_r($_SESSION);
  8. print_r(unserialize($_SESSION['serial']));
  9. echo "</pre>";
  10. ?>

I tutaj niestety zarówno bezpośrednio jak po zdeserializowaniu widzę zawsze: [__PHP_Incomplete_Class_Name] => html_quickform_text
[0] => __PHP_Incomplete_Class Object
itd..
Bardzo proszę o jeszcze jakieś sugestie bo już zupełnie zabrakło mi pomysłów.

Pozdrawiam,
yacoos
Go to the top of the page
+Quote Post
Sedziwoj
post 19.05.2007, 17:25:18
Post #2





Grupa: Zarejestrowani
Postów: 793
Pomógł: 32
Dołączył: 23.11.2006
Skąd: Warszawa

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


Najpierw cytacik z manuala:
Cytat
Thus, you need to call session_name() for every request (and before session_start() or session_register() are called).


A co do problemu to obiekt zapisywany do sesji jest automatycznie serializowany, przez wywołanie metod __sleep() tegoż obiektu, jeśli nie ma zdefiniowanej to wywoływana jest domyślna metoda.
Jeśli autorzy klasy HTML_QuickForm nie przewidzieli możliwości serializacji (a też nie zablokowali, co się często zapomnieć zdarza) to rezultat może być różny.

A do tego nie:
  1. <?php
  2. print_r(unserialize($_SESSION['serial']));
  3. ?>

a
  1. <?php
  2. print_r($_SESSION['serial'])
  3. ?>


--------------------
Algorytmy w PHP, czy ktoś o tym słyszał?
Dlaczego tak mało kobiet programuje? ponieważ nie zajmują się głupotami.
Go to the top of the page
+Quote Post
yacoos
post 19.05.2007, 18:39:13
Post #3





Grupa: Zarejestrowani
Postów: 27
Pomógł: 0
Dołączył: 19.02.2005

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


Witam i dziękuję za odpowiedź.
Co do cytaciku z manuala - zaminiłem..
Ale niestety dalej mam:
  1. <?php
  2. html_quickform Object
  3. (
  4. [_elements] => Array
  5. (
  6. [0] => __PHP_Incomplete_Class Object
  7. (
  8. [__PHP_Incomplete_Class_Name] => html_quickform_text
  9. [_attributes] => Array
  10. (
  11. [class] => formularz
  12. [onclick] => showKal(this)
  13. [name] => data
  14. [type] => text
  15. [value] => 19-05-2007
  16. )
  17.  
  18. [_tabOffset] => 0
  19. [_tab] =>  
  20. [_lineEnd] => 
  21.  
  22. [_comment] => 
  23. [_label] => 
  24. [_type] => text
  25. [_flagFrozen] => 
  26. [_persistantFreeze] => 1
  27. )
  28.  
  29. [1] => __PHP_Incomplete_Class Object
  30. ......
  31. ?>

Zatem co jeżeli QuickForm nie przewidzial sleep i wakeup ?
Są jeszcze jakieś inne opcje?

Pozdrawiam.
Go to the top of the page
+Quote Post
Sokal
post 19.05.2007, 22:20:56
Post #4





Grupa: Zarejestrowani
Postów: 237
Pomógł: 1
Dołączył: 8.02.2007

Ostrzeżenie: (10%)
X----


Nie za bardzo rozumiem co Ty chcesz zrobić.

W tytule jest jak przechowywać obiekt w sesji. No to na mój rozum to serializujesz i przypisujesz do zmiennej O.o

Czyli, np. tak:
Kod
$_SESSION['obiekt'] = serialize($obiekt);


Może Ci się nie serializuje przy przypisaniu do sesji, też miałem kiedyś z tym problem... Spróbuj serializować winksmiley.jpg


--------------------
Jabber/E-Mail: dominiksokal[at]gmail.com | GG: #3795571
Go to the top of the page
+Quote Post
yacoos
post 19.05.2007, 22:32:38
Post #5





Grupa: Zarejestrowani
Postów: 27
Pomógł: 0
Dołączył: 19.02.2005

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


Witam,
Czy srializuje, czy nie serializuje.. przy odczycie mam już __PHP_Incomplete_Class Object zamiast poprawnego obiektu.
Chcę zapisać obiekt klasy QuickForm w jednym miejscu i odczytać go w innym..

Pozdrawiam,
Go to the top of the page
+Quote Post
mike
post 19.05.2007, 22:38:03
Post #6





Grupa: Przyjaciele php.pl
Postów: 7 494
Pomógł: 302
Dołączył: 31.03.2004

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


Przed unserialize() PHP musi wiedzieć o tym obiekcie wszystko, to znaczy, że musi mieć definicję jego klasy.

Zanim odserializujesz tego stringa zaincluduj plik z klasą tego obiektu.
Go to the top of the page
+Quote Post
Sedziwoj
post 20.05.2007, 02:24:05
Post #7





Grupa: Zarejestrowani
Postów: 793
Pomógł: 32
Dołączył: 23.11.2006
Skąd: Warszawa

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


@mike jeśli dobrze patrzę to include'uje odpowiednie pliki.
Kłopot może być taki jak wspomniałem, nie uwzględnienie serializacji.
np. właściwości prywatne nie ulegają serializacji automatycznej, zasoby pewnie parę innych rzeczy, więc jeśli coś się znajdzie w tych nie zapisanych w sesji danych to mamy niepełny obiekt. Ale właśnie czytam dokumentacje i chyba jednak może też być problem z brakiem dostępności definicji klasy.
Polecam do lekturki:
unserialize" title="Zobacz w manualu PHP" target="_manual


--------------------
Algorytmy w PHP, czy ktoś o tym słyszał?
Dlaczego tak mało kobiet programuje? ponieważ nie zajmują się głupotami.
Go to the top of the page
+Quote Post
yacoos
post 20.05.2007, 13:47:38
Post #8





Grupa: Zarejestrowani
Postów: 27
Pomógł: 0
Dołączył: 19.02.2005

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


Witam ponownie..
Sam problem rozwiązałem już inaczej.. Niemniej jednak dalej męczą mnie te obiekty w sesji..
Doszedłem wczoraj do tego że jeżeli tylko stworzyłem obiekt QuickForm - to po zapisaniu do sesji i odtworzeniu wszystko było OK.
Jeżeli jednak skorzystałem z jakiejś metody np. addElement - wtedy odtwarzany obiekt był niekompletny.
Może to na coś Was naprowadzi smile.gif

Pozdrawiam.
Go to the top of the page
+Quote Post
Ace
post 20.05.2007, 14:02:49
Post #9





Grupa: Zarejestrowani
Postów: 216
Pomógł: 0
Dołączył: 9.08.2003
Skąd: Warszawa

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


Hm, to może w obiekcie QuickForm istnieją inne obiekty np: Jakieś obiekty określające typy pól (Nie wiem, nie znam quickform, strzelam) I może one też muszą być wcześniej zaincludowane?
Go to the top of the page
+Quote Post
Sedziwoj
post 20.05.2007, 19:11:25
Post #10





Grupa: Zarejestrowani
Postów: 793
Pomógł: 32
Dołączył: 23.11.2006
Skąd: Warszawa

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


Ace raczej zakładam że include'ują tak samo więc jak normalnie starcza do utworzenia obiekru to przy odserializowaniu też.
Kłopot jest raczej ten co mówię, i co potwierdza wypowiedź yacoos'na. Mianowicie autorzy klasy ( a ma zapewne dane prywatne/chronione) nie zapewnili obsługi serializacji, a standardowa sobie nie radzi (a jak to chyba często bywa nie jest blokowana serializacja, a powinna jak się jej nie przewiduje).


--------------------
Algorytmy w PHP, czy ktoś o tym słyszał?
Dlaczego tak mało kobiet programuje? ponieważ nie zajmują się głupotami.
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: 23.06.2025 - 19:33