Först och främst:använd inte mysql_escape_string
, den är utfasad (av en anledning)!
Om du måste stödja en äldre applikation som ansluter till databasen via mysql
tillägg (som har fasats ut
), använd mysql_real_escape_string
istället. Annars byt omedelbart
till mysqli
, där förberedda satser och bundna parametrar ger en mer robust mekanism för att undvika användarinmatning.
Som sagt, svaret kan hittas genom att läsa beskrivningen av mysql_real_escape_string
och addslashes
:
Skillnad #1
addslashes
vet inget om MySql-anslutningskodningar. Om du skickar den en sträng som innehåller bytes som representerar en annan kodning än den som används av MySql-anslutningen, kommer den glatt att undkomma alla bytes som har värdena för tecknen '
, "
, \
och \x00
. Detta kanske inte är detsamma som alla tecken '
, "
, \
och \x00
om du använder en annan kodning än 8-bitars kodning och UTF-8. Resultatet blir att strängen som tas emot av MySql kommer att skadas.
För att utlösa detta fel, försök använda iconv
för att konvertera din variabel till UTF-16 och sedan undkomma den med addslashes
. Se vad din databas tar emot.
Detta är en anledning till varför addslashes
ska inte användas för att fly.
Skillnad #2
Till skillnad från addslashes
, mysql_real_escape_string
escapes även tecknen \r
, \n
och \x1a
. Det verkar som att dessa tecken också måste escapes när man pratar med MySql, annars kan en felaktig fråga bli resultatet
Detta är den andra anledningen till addslashes
ska inte användas för att fly.