Escapování řetězce znamená snížení nejednoznačnosti v uvozovkách (a dalších znacích) použitých v tomto řetězci. Když například definujete řetězec, obvykle jej umístíte do dvojitých nebo jednoduchých uvozovek:
"Hello World."
Ale co když můj řetězec obsahuje dvojité uvozovky?
"Hello "World.""
Teď mám nejasnost - tlumočník neví, kde můj řetězec končí. Pokud si chci ponechat své dvojité uvozovky, mám několik možností. Kolem svého řetězce bych mohl použít jednoduché uvozovky:
'Hello "World."'
Nebo mohu uniknout svým uvozovkám:
"Hello \"World.\""
Jakákoli uvozovka, které předchází lomítko, je escaped a rozumí se, že je součástí hodnoty řetězce.
Pokud jde o dotazy, MySQL má určitá klíčová slova, která sleduje, která nemůžeme použít v našich dotazech, aniž bychom způsobili nějaký zmatek. Předpokládejme, že jsme měli tabulku hodnot, kde byl sloupec pojmenován „Vybrat“, a chtěli jsme to vybrat:
SELECT select FROM myTable
Nyní jsme do našeho dotazu vnesli určitou nejednoznačnost. V rámci našeho dotazu můžeme tuto nejednoznačnost omezit pomocí zpětných znamének:
SELECT `select` FROM myTable
To odstraňuje zmatek, který jsme zavedli špatným úsudkem při výběru názvů polí.
Mnohé z toho lze za vás vyřídit pouhým předáním svých hodnot přes mysql_real_escape_string()
. V níže uvedeném příkladu můžete vidět, že touto funkcí předáváme data odeslaná uživateli, abychom zajistili, že to nezpůsobí žádné problémy pro náš dotaz:
// Query
$query = sprintf("SELECT * FROM users WHERE user='%s' AND password='%s'",
mysql_real_escape_string($user),
mysql_real_escape_string($password));
Existují další metody pro escapování řetězců, jako je add_slashes
, addcslashes
, quotemeta
a další, i když zjistíte, že když je cílem spustit bezpečný dotaz, velcí vývojáři preferují mysql_real_escape_string
nebo pg_escape_string
(v kontextu PostgreSQL.