První bod:Pokud se vám zobrazuje chyba z mysql_real_escape_string()
, je to proto, že funkci voláte předtím, než se připojíte k databázi.
Vypadá to, že se připojíte k databázi těsně před spuštěním dotazu. Takže cokoli uděláte, než zavoláte mm_mysqlquery()
funkce nebude mít připojení.
mysql_real_escape_string()
Funkce potřebuje živé připojení k databázi, takže může provést správný druh escapování s ohledem na znakovou sadu připojení. Musíte se tedy připojit před uděláte útěk.
Stejně je lepší to udělat, protože pokud uděláte několik dotazů v průběhu jednoho požadavku PHP, je méně režijní na připojení jednou a použijte stejné připojení pro všechny vaše dotazy.
Za druhé, neberte prosím návrhy na použití addslashes()
-- nedělá to samé jako mysql_real_escape_string()
. Tyto dva nejsou zaměnitelné. Měli byste si zvyknout používat mysql_real_escape_string()
.
Za třetí, vaše sani()
funkce ukazuje běžnou mylnou představu.
function sani($string){
$string = strip_tags($string);
$string = htmlspecialchars($string);
$string = trim(rtrim(ltrim($string)));
$string = mysql_real_escape_string($string);
return $string;
}
Obecná mylná představa je, že potřebujete všechny tyto funkce, aby byl řetězec bezpečný v příkazu SQL. Ty ne. Pouze mysql_real_escape_string()
je nutné. Všechny ostatní funkce v tomto příkladu nedělají nic pro ochranu před SQL injection.
Tyto funkce jsou užitečné, pokud výstup řetězce v prezentaci HTML a chcete snížit riziko útoků XSS, ale pak mysql_real_escape_string()
je irelevantní.
Používejte každý typ dezinfekční metody v příslušném kontextu.