SQL Injection polega na wstrzykiwaniu w zpaytanie SQL niechcianego dodatkowego zapytania, coś w stylu gdy $id obierze postać:
1' OR '2'
Jak masz w tej bazie użytkowników to może to skutkować wyciągnięciem haseł i tym podobnych wrażliwych danych.
jezeli juz sie upierasz przy mysqli_query to podałem Ci połowiczne rozwiązanie w postaci filtrowania tego co przyjmujesz za ID
bo to pewnie metoda $_POST, albo gorzej $_GET.
$id = htmlspecialchars($id)
Tylko tak jak napisałem to nie załatwi w 100% problemu bo to też można obejść. Już pokazuje jak wygląda MySQL PDO - przyjemniejsze:
Weźmy sobie na przykład to zapytanie:
SELECT id FROM forum_a WHERE topic='$id' ORDER BY date DESC;
W PDO wyglądałoby to tak:
//nowe połączenie pod zmienną pdo
$pdo = new PDO(
'mysql:host=localhost;dbname=[TUTAJ DATABASE NAME]',
'username',
'password');
//pod zmienną $stmt przygotowujemy baze pod zapytanie
$stmt = $pdo->prepare('SELECT id FROM forum_a WHERE topic= :topic ORDER BY date DESC;');
//bindParam do zapytania wyżej, za :topic, wchodzi $id
$stmt->bindParam(':topic', $id);
//Wykonanie zapytania
$stmt->execute();
//FETCH - wiadomo co robi, jest także fetchAll()
$fetch = $stmt->fetch();
//zamykamy $stmt, połączenie z bazą dalej jest, można zrobic nowe $pdo->prepare (kolejne zapytanie)
$stmt->closeCursor();
//zamykamy całkowicie połączenie z bazą
$pdo = null;
var_dump($fetch);
Prawda że przyjemne? Zasada działania jest prosta, przygotowujesz sobie baze pod zapytanie, potem uzywasz bindParam(':param', $zmienna), ewentualnie bindValue(':param', 'value') a na koniec execute -> fetch -> closeCursor :) proste, przejrzyste i skuteczne :)
P.S. pisane z pamięci więc może wyskoczyć jakiś błąd