L'idée des instructions préparées est que vous ne concaténez pas les variables, mais plutôt que vous liez les paramètres. La différence est que la variable n'est jamais insérée dans le SQL, mais le moteur MySQL gère la variable séparément, ce qui ne laisse aucune possibilité d'injection SQL. Cela a également l'avantage supplémentaire qu'aucun échappement ou prétraitement de la variable n'est requis.
$query = $db->prepare("SELECT password FROM login WHERE username = :username");
$query->execute(array(':username' => $username));