Kör jag unserialize på första stringen fungerar det, andra failar Som vanligt hittade jag felet precis efter att ha postat här. Testa att köra escape eller någonting på det först, samt en unescape efter. (Eller vad det nu kan heta i php), nyrad borde bli %någonting <b>Av någon anledning räknar den strängen innan den skriver om den</b> Jag rörde inte strängen alls tidigare, serialize skriver om strängen på så sätt att den tar bort radbrytningar. Det är inte så att något händer när du sparar och återläser strängen i databasen?Unserialize, märkligt problem
<code>
a:9:{s:4:"name";s:4:"test";s:7:"type_id";s:1:"1";s:7:"area_id";s:3:"101";s:7:"address";s:0:"";s:5:"phone";s:0:"";s:4:"mail";s:0:"";s:3:"url";s:0:"";s:5:"image";s:0:"";s:7:"content";a:3:{s:3:"swe";s:11:"<P>test</P>";s:3:"fin";s:0:"";s:3:"eng";s:0:"";}}
a:9:{s:4:"name";s:4:"test";s:7:"type_id";s:1:"1";s:7:"area_id";s:3:"101";s:7:"address";s:0:"";s:5:"phone";s:0:"";s:4:"mail";s:0:"";s:3:"url";s:0:"";s:5:"image";s:0:"";s:7:"content";a:3:{s:3:"swe";s:24:"<P>test</P> <P>test</P>";s:3:"fin";s:0:"";s:3:"eng";s:0:"";}}
</code>
Enda skillnaden är "<P>test</P>" i den ena och "<P>test</P> <P>test</P>" i den andra.
Felmeddelandet jag får:
unserialize() [function.unserialize]: Error at offset 226 of 263 bytesSv: Unserialize, märkligt problem
Siffran precis före <P> anger antal tecken i strängen. I det här fallet i den korrekta strängen:
11:"<P>test</P>"
och i den felaktiga:
24:"<P>test</P> <P>test</P>"
Om man räknar antalet tecken i första strängen blir det 11 som det ska, men i den andra borde det vara 23 och inte 24.
Så felet låg inte i unserialize utan i serialize. Strängen jag försökte mata in var:
<code>
<P>test</P>
<P>test</P>
</code>
Av någon anledning räknar den strängen innan den skriver om den och radbrytningen räknas som 2 tecken "\n" eller kanske "\r\n".
Sedan skrivs strängen om till "<P>test</P> <P>test</P>" (new line ersatt med mellanslag(?)) och är då ett tecken kortare.
Lösning: ersätt alla new lines innan man serializar (fungerar bra i mitt fall, men jag kan se andra lägen där det inte fungerar)
<code>
$obj["content"] = str_replace("\n"," ",$obj["content"]);
$data = serialize($obj);
</code>Sv:Unserialize, märkligt problem
Sv:Unserialize, märkligt problem
Vad menar du med "skriver om den"?
Hur hanterar <b>du</b> strängen mellan serialize() och unserialize()? Jag antar att du inte bara kör unserialize(serialize($sträng)). Troligen är det där som något händer med radbrytningen.Sv: Unserialize, märkligt problem
Det exakta förloppet var:
Läs in inmatad sträng från formulär: $vars['content'] = $_POST['content']
Spara till databas: serialize($vars)
Läs från databas
unserialize($row['vars']) <-- failade
När jag ändrade till detta fungerade det:
Läs in inmatad sträng från formulär: $vars['content'] = $_POST['content']
$vars['content'] = str_replace('\n','',$vars['content']); <--- Lade till denna rad
Spara till databas: serialize($vars)
Läs från databas
unserialize($row['vars']) <-- fungerar nu!Sv:Unserialize, märkligt problem