Portál AbcLinuxu, 12. května 2024 20:45


Dotaz: PHP unserialize

5.2.2010 14:53 Lister169126 | skóre: 2
PHP unserialize
Přečteno: 424×
Odpovědět | Admin

Zdravim,
mam tu zapeklity problem, kdysi davno jsem delal eshop a data z kosiku jsem serializoval a rval do db (pekna prasarna, nicmene to fungovalo). Vsechno jede doted a ok, az na 1 pripad, data jsem serializoval a pri vytahnuti z db nejdou unserialozovat. var_dump pise, false, zkousel jsem to na vice hostinzich a nejde to, leda postupne policko po policku (struktura je asi takova:

array('0' => array(<prvky polozky v kosiku (mnozstvi, cena atp)>),
      '1' => array(<dalsi polozka>));

nerikam, ze je to neresitelny pripad, jen me zajima, jak se neco takoveho muze stat, jak tomu predejit a nejlepe jak to jednoduse vyresit :-).

serializovane data:

http://www.maad.sk/data.html
Nástroje: Začni sledovat (0) ?Zašle upozornění na váš email při vložení nového komentáře.

Odpovědi

5.2.2010 15:54 12345 | skóre: 41 | blog:
Rozbalit Rozbalit vše Re: PHP unserialize
Odpovědět | | Sbalit | Link | Blokovat | Admin
Pro začátek je dobré zapnout error_reporting = E_ALL:
Notice: unserialize() [function.unserialize]: Error at offset 293 of 6564 bytes in /home/zephyr/Web/tests/unserialize.php on line 9
bool(false) 
Zkoušel jsem se vrtat jen v prvním "subpoli" – chyba je u položky s klíčem text1. V serializovaném tvaru je u ní uvedena délka 74 bytů:
s:5:"text1";s:74:"Fašiangový halový turnaj 1. miesto 4. ročník - Lendak 14.02.2010"
V UTF-8 však ten text má 69 bytů. Tohle už například deserializovat jde (74 opraveno na 69):
a:15:{s:3:"kod";s:4:"8027";s:3:"typ";s:1:"D";s:8:"mnozstvi";i:1;s:4:"cena";d:21.5;s:7:"rozmery";s:5:"37x14";s:4:"kryt";s:0:"";s:9:"podstavec";s:0:"";s:5:"barva";s:0:"";s:6:"stitek";s:3:"zst";s:5:"text1";s:69:"Fašiangový halový turnaj 1. miesto 4. ročník - Lendak 14.02.2010";s:5:"text2";s:0:"";s:7:"emblem1";s:0:"";s:7:"emblem2";s:0:"";s:7:"figurka";s:0:"";s:5:"stuha";s:0:"";}
Podobné chyby jsou i u dalších "subpolí", oprava není těžká.

Jako příčinu problému bych si tipnul nějaké čachry s kódováním – znaky s diakritikou snadno mohly změnit délku stringu měřenou v bytech.
6.2.2010 18:40 Lister169126 | skóre: 2
Rozbalit Rozbalit vše Re: PHP unserialize
dekuji, error reporting mi vazne nedocvakl :D, bylo to presne ono... vyresil jsem to, ale logicky mi to nedava smysl:

kodovani stranky: utf-8(content type), kodovani souboru ktery serializuje: utf-8, kodovani souboru, ktery unserializuje: utf-8, kodovani db: utf8_general_ci, vse zkontrolovano a vsude to sedelo (pouzivam pspad na drobne upravy). A ted ten problem:

iconv_strlen s utf 8 mi hazel jinou delku nez php s error_reporting(E_ALL), delka se dela pri pouziti iconv_strlen cp1250, muzete mi vysvetlit proc? kde se tam vzalo? a delky (byte size) jsem musel opravit podle cp1250 a nikoliv podle utf-8... jak je to mozne? nikde neni pouzite, prijde mi to, ze proste parser to chce v cp1250, ale neni k tomu racionalni duvod, musi si s tim umet preci poradit
8.2.2010 09:17 Šangala | skóre: 56 | blog: Dutá Vrba - Wally
Rozbalit Rozbalit vše Re: PHP unserialize
Zkuste si vypsat var_dump(iconv_get_encoding('all')); třeba se nějaké 1250 objeví :)
To, že trpíš stihomamem, ještě neznamená, že po tobě nejdou. ⰞⰏⰉⰓⰀⰜⰉ ⰗⰞⰅⰜⰘ ⰈⰅⰏⰉ ⰒⰑⰎⰉⰁⰕⰅ ⰏⰉ ⰒⰓⰄⰅⰎ ·:⁖⁘⁙†

Založit nové vláknoNahoru

Tiskni Sdílej: Linkuj Jaggni to Vybrali.sme.sk Google Del.icio.us Facebook

ISSN 1214-1267, (c) 1999-2007 Stickfish s.r.o.