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"b
$foo = serialize($foo); // s:8:"a"b";
// och sedan så sparar vi värdet i mysql och hämtar det igen
$bar = $myrow["value"]; // s:8:"a"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>
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"\c
$foo = serialize($foo); // s:10:"ab"\c";
$foo = str_replace('\\','\\\\',$foo); // s:10:"ab"\\c";
// och sedan så sparar vi värdet i mysql och hämtar det igen
$bar = $myrow["value"]; // s:10:"ab"\c";
$bar = unserialize($bar); // ab"\c
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.