webForumDet fria alternativet

spara serialized sträng i db

PHP

3 svar · 418 visningar · startad av Kent.J

Medlem sedan aug. 2001153 inlägg
Frågan#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?

Medlem 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
Medlem 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.

Medlem sedan aug. 2001153 inlägg
#4

Tack för svaret

Ibland går man lite vilse :birp

260 ms totalt · 4 externa anrop · v20260731065814-full.1dc6f849
125 ms — deklarationer (db)
0 ms — hämta statistik (cache)
131 ms — hämta tråd, inlägg och bilagor (db)
121 ms — ändringar (db)