webForumDet fria alternativet

spara serialized sträng i db

3 svar · 418 visningar · startad av Kent.J

Kent.JMedlem sedan aug. 2001153 inlägg
#1

Hejsan,

Nu har nog snurrat tillräckligt, dags o fråga nån som vet!

Magic quotes är på, och dödar den serializerade strängen :(

Exempel på när vi skickar in: ab
(Kommentarer efter för att ha koll på värdet)

$foo = $_POST["postvalue"]; // ab
$foo = serialize($foo); // s:2:"ab";
// och sedan så sparar vi värdet i mysql och hämtar det igen
$bar = $myrow["value"]; // s:2:"ab";
$bar = unserialize($bar); // ab

Funka fint... men

Exempel på när vi skickar in: a"b

$foo = $_POST["postvalue"]; // a\"b
$foo = serialize($foo); // s:4:"a\"b";
// och sedan så sparar vi värdet i mysql och hämtar det igen
$bar = $myrow["value"]; // s:4:"a"b";
$bar = unserialize($bar); // <blank>

Nu blev det inget värde alls efts längen på strängen stämmer inte längre. Står att den skall vara 4'a men är faktiskt bara 3.

Men det är nog inget lite stripslashes och htmlentities kan fixa
Exempel på när vi skickar in: a"b igen

$foo = $_POST["postvalue"]; // a\"b
$foo = htmlentities(stripslashes($foo),ENT_QUOTES); // a&quot;b
$foo = serialize($foo); // s:8:"a&quot;b";
// och sedan så sparar vi värdet i mysql och hämtar det igen
$bar = $myrow["value"]; // s:8:"a&quot;b"
$bar = unserialize($bar); // a"b

Allt frid och fröjd igen... men (ja, det är många men)

Exempel på när vi skickar in: ab\c

$foo = $_POST["postvalue"]; // ab\\c
$foo = htmlentities(stripslashes($foo),ENT_QUOTES); // ab\c
$foo = serialize($foo); // s:5:"ab\\c";
// och sedan så sparar vi värdet i mysql och hämtar det igen
$bar = $myrow["value"]; // s:5:"ab\c";
$bar = unserialize($bar); // <blank>

Och så var det blankt igen x(

Någon som har någon lösning?

Kent.JMedlem sedan aug. 2001153 inlägg
#2

Problemet tycks mera relaterat till mysql förvisso efts singel escapetecknet försvinner

Ser ut som man får lägga till dubbel \\ själv, att det måste vara sådana fulhack :l :q

exempel med: ab"\c

$foo = $_POST["postvalue"]; // ab\"\\c
$foo = htmlentities(stripslashes($foo),ENT_QUOTES); // ab&quot;\c
$foo = serialize($foo); // s:10:"ab&quot;\c";
$foo = str_replace('\\','\\\\',$foo); // s:10:"ab&quot;\\c";
// och sedan så sparar vi värdet i mysql och hämtar det igen
$bar = $myrow["value"]; // s:10:"ab&quot;\c";
$bar = unserialize($bar); // ab"\c
emissionMedlem sedan dec. 19996 721 inlägg
#3

Exemplet var lite konstigt, eftersom det inte finns någon anledning att serialisera en sträng, men jag antar att det bara var ett exempel. HTML-entities vill vi heller inte ha.

Nåväl, eftersom mq är på så kommer ett skickat ab\c att initieras som ab\\c. Escapetecken är dock inget som serialize ska eller kan bry sig om så det måste tas bort före serialize, lämpligen med stripslashes. Efter serialiseringen vill vi åter escapa tecken som inte MySQL gillar, och det gör vi med addslashes, eller ännu hellre med mysql_real_escape_string.

$foo = $_POST["postvalue"]; 
$foo = serialize(stripslashes($foo));
$foo = mysql_real_escape_string($foo)
// och sedan så sparar vi värdet i mysql och hämtar det igen
$bar = $myrow["value"]; 
$bar = unserialize($bar);

...helst stänger man av mq (om man får/kan) och kodar med det i åtanke.

Kent.JMedlem sedan aug. 2001153 inlägg
#4

Tack för svaret

Ibland går man lite vilse :birp

242 ms totalt · 3 externa anrop · v20260731065814-full.30151723
0 ms — hämta forumlista (cache)
118 ms — hämta statistik (db)
122 ms — hämta tråd, inlägg och bilagor (db)