Hi,
du bereitest das Statement mit z.B. mit
Code:
$stmt = $mysqli->prepare("SELECT title, content FROM blog WHERE author=?");
Damit steht der Code, den die Datenbank ausführen soll, bereits fest. Ich kenne die genaue Implementierung von PHP nicht, aber normalerweise wird dieser String schon an die Datenbank gegeben, die den String parst, interne Optimierungen ausführt und einen Ablaufplan generiert. Später fügst du mit
Code:
$stmt->bind_param('s', $_GET["author"]);
den eigentlichen Wert ein. bind_param filtert dabei und kümmert sich um den Datentyp. Im prepared statement habe ich um die Stelle, an der der Get-Parameter eingefügt werden soll, keine Anführungszeichen geschrieben. Darum kümmert sich die bind_param-Funktion.
Damit verhinderst du schon auf zwei Weisen SQL-Injections. 1. übergibst du den Wert aus dem Get-Parameter an die bind_param-Funktion, die das Ganze filtert. 2. steht für das Datenbanksystem der Ablauf nach dem prepare() schon fest und kann durch die Parameter ohnehin nicht mehr geändert werden.