Po pierwsze:nie używaj mysql_escape_string
, jest przestarzałe (z jakiegoś powodu)!
Jeśli musisz obsługiwać starszą aplikację, która łączy się z bazą danych przez mysql
rozszerzenie (które zostało przestarzałe
), użyj mysql_real_escape_string
zamiast. W przeciwnym razie przełącz się natychmiast
do mysqli
, gdzie przygotowane instrukcje i powiązane parametry zapewniają bardziej niezawodny mechanizm unikania danych wprowadzanych przez użytkownika.
To powiedziawszy, odpowiedź można znaleźć, czytając opis mysql_real_escape_string
i addslashes
:
Różnica nr 1
addslashes
nie wie nic o kodowaniu połączeń MySql. Jeśli przekażesz mu ciąg zawierający bajty reprezentujące kodowanie inne niż kodowanie używane przez połączenie MySql, szczęśliwie uniknie wszystkich bajtów mających wartości znaków '
, "
, \
i \x00
. To może nie być to samo, co wszystkie znaki '
, "
, \
i \x00
jeśli używasz kodowania innego niż kodowanie 8-bitowe i UTF-8. W rezultacie ciąg otrzymany przez MySql będzie uszkodzony.
Aby wywołać ten błąd, spróbuj użyć iconv
aby przekonwertować twoją zmienną na UTF-16, a następnie zmienić ją za pomocą addslashes
. Zobacz, co otrzymuje Twoja baza danych.
To jeden z powodów, dla których addslashes
nie powinien być używany do ucieczki.
Różnica nr 2
W przeciwieństwie do addslashes
, mysql_real_escape_string
zmienia również znaczenie znaków \r
, \n
i \x1a
. Wygląda na to, że te znaki również muszą zostać zmienione podczas rozmowy z MySql, w przeciwnym razie wynikiem może być źle sformułowane zapytanie
To kolejny powód, dla którego addslashes
nie powinien być używany do ucieczki.