La idea de las declaraciones preparadas es que no concatene variables, sino que enlace los parámetros. La diferencia es que la variable nunca se inserta en el SQL, sino que el motor MySQL maneja la variable por separado, lo que no deja posibilidad de inyección de SQL. Esto también tiene la ventaja adicional de que no se requiere escape ni preprocesamiento de la variable.
$query = $db->prepare("SELECT password FROM login WHERE username = :username");
$query->execute(array(':username' => $username));