Apenas declarações preparadas fornecem escape automático, supondo que você não tenha alguma feiúra como aspas mágicas ativadas. E apenas os dados nos parâmetros são escapados, não qualquer coisa que já esteja na string SQL quando você prepara a instrução.
Se você quiser os benefícios do escape automático, precisará preparar uma declaração e alimentá-la com os dados separadamente.
$sth = $dbh->prepare("SELECT * FROM users WHERE username=? AND password=?");
$sth->execute(array($username, $password));
Caso contrário, você obtém pouca ou nenhuma proteção sobre
mysqli_query
e amigos. (Eu me recuso a mencionar mysql_query
, porque nenhum programador PHP que se preze usa mais. Oh, espere .. droga. Bem, essa é a única menção que chega aqui.)