Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Błąd serializacji
Forum PHP.pl > Forum > PHP
Walian
Witam.
Zauważyłem coś bardzo dziwnego, na serwerze znajomego (jeden z tych na linuxpl.com) nie działa serializacja...

Plik na którym sprawdzam działanie serializacji:
  1. $form_data['cos'] = 'costam1';
  2. $form_data['cos2'] = 'costam2';
  3. $form_data['cos3'] = 'costam3';
  4. $form_data['cos4'] = 'costam4';
  5. $form_data['cos5'] = 'costam5';
  6. $form_data['cos6'] = 'costam6';
  7. $form_data['cos7'] = 'costam7';
  8. $form_data['cos8'] = 'costam8';
  9.  
  10. $sr = serialize($form_data);
  11. echo 'serialized: "'.$sr.'"'."<br>\n";
  12. $usr = unserialize($sr);
  13.  
  14. print_r($usr);

Bez znaczenia, czy zapiszę go w ANSI czy w UTF-8.

Wersja PHP na serwerze znajomego: 5.2.9.
Wersja PHP u mnie na localhost: 5.3.0.

Wynik uruchomienia pliku na serwerze znajomego:
Kod
serialized: "s:32:"c9dufa4urcvha1d4i845redp94kqrf7p";"
c9dufa4urcvha1d4i845redp94kqrf7p


Wynik uruchomienia pliku u mnie na localhost:
Kod
serialized: "a:8:{s:3:"cos";s:7:"costam1";s:4:"cos2";s:7:"costam2";s:4:"cos3";s:7:"costam3";s:4:"cos4";s:7:"costam4";s:4:"cos5";s:7:"costam5";s:4:"cos6";s:7:"costam6";s:4:"cos7";s:7:"costam7";s:4:"cos8";s:7:"costam8";}"
Array ( [cos] => costam1 [cos2] => costam2 [cos3] => costam3 [cos4] => costam4 [cos5] => costam5 [cos6] => costam6 [cos7] => costam7 [cos8] => costam8 )


Dziwne prawda? Wie ktoś czemu tak się dzieje?
erix
Zainicjuj tablicę przed serializacją i sprawdź, czy dzieje się to samo.
Walian
No teraz działa. Tylko dlaczego bez inicjalizacji na jednym serwerze działa a na drugim już nie?
darko
Może na tym serwerze, na którym nie działa jest coś ustawione w konfiguracji php.ini dla unserialize_callback_func ?
Walian
Sprawdziłem wcześniej wszystkie ustawienia z "serializ" w nazwie - wartości są takie same jak u mnie na localhost, czyli domyślne.
erix
O ile pamiętam, to w PHP 5.3 odwołania do znaków stringów przez klamry są oznaczone jako zaniechane i należy stosować nawiasy kwadratowe. W 5.3 dochodzi pewnie do niejawnego rzutowania nieistniejącej zmiennej na string (w przypadku odwoływania przez nawiasy), co powoduje sytuację przez Ciebie opisaną. Jeśli zainicjujesz zmienną jako tablicę, nie dojdzie do rzutowania i zserializowanie nastąpi prawidłowo.

Podejrzewam, że potwierdzeniem mojej tezy będzie wywołanie var_dump na tej zmiennej.
Walian
var_dump zwracało coś w stylu "string(32):" (nie chce mi się teraz sprawdzać) więc trafiłeś ze swoją teorią, tyle, że opisujesz przypadek wystąpienia tego na PHP 5.3, natomiast ja miałem problem na PHP 5.2.9 smile.gif
Chyba, że to ja Cie źle zrozumiałem.
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.