Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Błąd funkcji unserialize, Error at offset po imporcie danych do bazy
Forum PHP.pl > Forum > PHP
adbacz
Mam zapisaną tablicę elementów i zserializowaną a następnie zapisaną do bazy danych w kolumnie o typie 'text'. Eksport danych działa bez zarzutu i import do innej tak samo, ale gdy chcę odczytać dane z tej kolumny, to dostaję błąd funkcji unserialize:

Kod
unserialize() [function.unserialize]: Error at offset 82 of 408 bytes


A tak wygląda zserializowana treść:

Kod
a:2:{s:11:"firstColumn";a:4:{i:0;s:43:"Application\Back\Components\Trigocms\Module";i:1;s:47:"Application\Back\Components\Publications\Module";i:2;s:43:"Application\Back\Components\Products\Module";i:3;s:0:"";}s:12:"secondColumn";a:4:{i:0;s:50:"Application\Back\Components\TrigocmsUpdates\Module";i:1;s:53:"Application\Back\Components\AdminNotifications\Module";i:2;s:45:"Application\Back\Components\Statistics\Module";i:3;s:0:"";}}


Operacje importy i eksportu sa dokonywane na systemie Windows XP poprzez phpMyAdmin, na tym samym komputerze i serwerze WAMP.

Co może być powodem takiego błędu?
Pyton_000
pokaż kod
adbacz
Którą część kodu? Zapis do bazy, pobieranie z bazy, wywolanie funkcji unserialize()?
Pyton_000
pobieranie i deserializacja,
poza tym zobacz co jest pobrane z DB (np var_dump) i treść tego wklej
adbacz
Pobieranie za pomocą PDO z DB zapytaniem

  1. SELECT * FROM #__user WHERE id = '1' LIMIT 1


A później deserializacja

  1. $result = @unserialize($user['admin_dashboard_modules_positions']);
  2. return is_array($result) ? $result : array();


Rezultat var_dump

Kod
string 'a:2:{s:11:"firstColumn";a:4:{i:0;s:43:"Application\Back\Components\Trigocms\Module";i:1;s:47:"Application\Back\Components\Publications\Module";i:2;s:43:"Application\Back\Components\Products\Module";i:3;s:0:"";}s:12:"secondColumn";a:4:{i:0;s:50:"Application\Back\Components\TrigocmsUpdates\Module";i:1;s:53:"Application\Back\Components\AdminNotifications\Module";i:2;s:45:"Application\Back\Components\Statistics\Module";i:3;s:0:"";}}' (length=432)
nospor
A mi unserialize na tekscie co podales dziala prawidlowo.

Pokaz z czego robisz var_dump()
adbacz
Z czego robię, to znaczy?

var_dump() wyglądał tak:

  1. var_dump($user['admin_dashboard_modules_positions']);
  2. $result = @unserialize($user['admin_dashboard_modules_positions']);
  3. return is_array($result) ? $result : array();


A mógłbyś spróbować z tymi danymi, które podałem w pierwszym poście i zrobić dokładnie w ten sam sposób jak zrobiłem ja?
nospor
bez zmian, wszystko dziala
adbacz
To dziwne. Ta operacja u mnie zawsze wygląda w ten sam sposób, że po eksporcie z jednej bazy i imporcie do innej (nawet na innym serwerze) zawsze się psuje. Już próbowałem importować na hosting w nazwa.pl i home.pl, i tam jest tak samo - po imporcie mam błąd funkcji unserilize().

W jaki sposób robisz import i eksport jeśli można wiedzieć?
nospor
Nie robie importow/eksportow bo nie potrzebuje smile.gif
viking
Jeżeli operujesz na obiektach, a nie wiem co z tym dalej robisz, to żeby wypełnić jakiś obiekt musi być on wcześniej utworzony. Może być też nieaktywne połączenie z bazą. Może być tam też jakiś problem z null przy unserialize.
nospor
@viking naprawde myslisz za ja lokalnie mam obiekty ktore on tworzy? wink.gif
podpowiedz: nie, nie mam, a dziala

poza tym widac tu wyraznie, ze nie ma mowy o zadnych obiektach a jedynie o tekstach
viking
Raczej pisałem do autora żeby zwrócił na to uwagę smile.gif
Jeszcze mi przychodzi do głowy magic_quotes i problem ze slashami.
adbacz
@nospor - skoro nie robisz importu-eksportu to będzie działać, już tak sprawdzałem. Błąd pojawia się tylko podczas eksportu z bazy danych i importu do drugiej i dopiero po imporcie pobieranie i odserializowanie. Bez tego błąd nie wyskakuje.

@viking - Mógłbyś napisać czym sie sugerowałeś pisząc o obiektach? Nigdzie tutaj wyżej nie ma nic o obiektach, nawet w kodzie, który przekleiłem.
IProSoft
Pokaż jak wygląda treść zserializowana:

Kod
a:2:{s:11:"firstColumn";a:4:{i:0;s:43:"Application\Back\Components\Trigocms\Module";i:1;s:47:"Application\Back\Components\Publications\Module";i:2;s:43:"Application\Back\Components\Products\Module";i:3;s:0:"";}s:12:"secondColumn";a:4:{i:0;s:50:"Application\Back\Components\TrigocmsUpdates\Module";i:1;s:53:"Application\Back\Components\AdminNotifications\Module";i:2;s:45:"Application\Back\Components\Statistics\Module";i:3;s:0:"";}}


ale już po imporcie do nowej tabeli, jakich znaków brakuje / zostały dodane podczas importu do nowej tabeli.
adbacz
Tablica, którą serializuje:
  1. $result = array
  2. (
  3. 'firstColumn' => Array
  4. (
  5. 'Application\Back\Components\CMS\Module',
  6. 'Application\Back\Components\Publications\Module'
  7. ),
  8.  
  9. 'secondColumn' => Array
  10. (
  11. 'Application\Back\Components\AdminNotifications\Module',
  12. 'Application\Back\Components\Updates\Module',
  13. 'Application\Back\Components\Statistics\Module',
  14. 'Application\Back\Components\Backup\Module'
  15. )
  16.  
  17. )


1. Serializacja i zapis do DB
2. Eksport bazy do pliku
3. Import bazy z pliku do innej bazy
4. Pobranie danych z DB
5. Odserializowanie danych
nospor
Wydaje mi sie ze mogą psuc \ - to są znaki specjalne i powinno raczej byc tak:
'Application\\Back\\Components\\CMS\\Module',
Analogicznie reszta
adbacz
Możliwe, że tak. Nie wziąłem tego pod uwagę.

Rozwiązałem to w ten sposób, że serializowaną tablicę wrzucam jeszcze w BASE64 i dopiero do DB. W tedy błędu nie ma.

Dziękuje za pomoc Panowie.
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.