Att undkomma en sträng innebär att minska tvetydigheten i citattecken (och andra tecken) som används i den strängen. Till exempel, när du definierar en sträng, omger du den vanligtvis med antingen dubbla citattecken eller enkla citattecken:
"Hello World."
Men vad händer om min sträng hade dubbla citattecken inom sig?
"Hello "World.""
Nu har jag oklarhet - tolken vet inte var min sträng slutar. Om jag vill behålla mina dubbla citattecken har jag ett par alternativ. Jag skulle kunna använda enstaka citattecken runt min sträng:
'Hello "World."'
Eller så kan jag undkomma mina citat:
"Hello \"World.\""
Alla citat som föregås av ett snedstreck escapes , och förstås vara en del av strängens värde.
När det kommer till frågor har MySQL vissa nyckelord som den tittar på som vi inte kan använda i våra frågor utan att orsaka viss förvirring. Anta att vi hade en värdetabell där en kolumn hette "Select", och vi ville välja det:
SELECT select FROM myTable
Vi har nu infört en viss tvetydighet i vår fråga. I vår fråga kan vi minska den oklarheten genom att använda back-ticks:
SELECT `select` FROM myTable
Detta tar bort den förvirring som vi har skapat genom att använda dåligt omdöme när vi väljer fältnamn.
Mycket av detta kan hanteras för dig genom att helt enkelt skicka dina värden genom mysql_real_escape_string()
. I exemplet nedan kan du se att vi skickar användarinskickad data via den här funktionen för att säkerställa att den inte orsakar några problem för vår fråga:
// Query
$query = sprintf("SELECT * FROM users WHERE user='%s' AND password='%s'",
mysql_real_escape_string($user),
mysql_real_escape_string($password));
Det finns andra metoder för att escape-strängar, såsom add_slashes
, addcslashes
, quotemeta
, och mer, även om du kommer att upptäcka att när målet är att köra en säker fråga, föredrar i stort sett utvecklare mysql_real_escape_string
eller pg_escape_string
(i sammanhanget PostgreSQL.