Najlepiej żadnymi. A jeśli już, to specjalnie do tego przeznaczonymi.
Jeśli będziesz używał rozszerzenia
PDO, to możesz w ogóle zapomnieć o filtrowaniu i spokojnie spać. Za pomocą tzw.
prepared statements możesz wysłać dane bezpośrednio z formularza do bazy nie martwiąc się, czy dane - intencjonalnie lub nieintencjonalnie - zawierają potencjalnie niebezpieczne znaki lub kod:
$dbh = new PDO('mysql:host=localhost;dbname=test', $user, $pass);
$zapytanie = $dbh->prepare("INSERT INTO `moja_tabela`(`pole1`, `pole2`) VALUES (:zmienna1, :zmienna2)");
$zapytanie->bindParam(':zmienna1', $_POST['zmienna_1']);
$zapytanie->bindParam(':zmienna2', $_POST['zmienna_2']);
$zapytanie->execute();
W ten sposób dane podane przez użytkownika znajdą się w tabeli w takiej formie, w jakiej zostały podane przez użytkownika, nie wpływając w żaden sposób na konstrukcję samego zapytania. Inaczej mówiąc, PDO uniemożliwia przeprowadzanie ataków
SQL Injection.
Rozszerzenie PDO jest rekomendowane do obsługi połączeń z bazą danych w przypadku PHP 5.*. Jeśli używasz starszych wersji PHP, to filtrowanie danych z formularzy możesz prosto załatwić jedną funkcją rozszerzenia
mysqli -
mysqli_real_escape_string:
$dbh = mysqli_connect("localhost", $user, $password, "test");
$zmienna1 = mysqli_real_escape_string($dbh, $_POST['zmienna_1']);
$zmienna2 = mysqli_real_escape_string($dbh, $_POST['zmienna_2']);
mysqli_query($dbh, "INSERT INTO `moja_tabela`(`pole1`, `pole2`) VALUES ('$zmienna1', '$zmienna2')")
Funkcja
mysqli_real_escape_string jest specjalnie przeznaczona do filtrowania łańcuchów używanych w zapytaniach SQL.
Zapis, który podałeś jest zły bo:
- Używa funkcji nieprzeznaczonych do filtrowania łańcuchów w zapytaniach SQL,
- Zmienia wartość danych przesyłanych przez użytkownika.
Co do 1 - już wiesz, o co chodzi. Co do 2 - nie chcemy zmieniać danych użytkownika. Chcemy, żeby te dane nie były niebezpieczne. Najlepiej zapisywać dane tak, jak są podane i formatować je na wyjściu. Formatowanie wejścia oznacza dodatkowe problemy przy formatowaniu wyjścia.