En fait rien de tout ça n'est réellement suffisant, je vous conseille d'utiliser PDO, cela permet de lier les paramètres d'une requête directement dans la requête compilée, ce qui fait que ce n'est plus une concaténation mais une liaison de variable en mémoire et donc quelque soit les caractères les injections SQL ne sont plus possible.
Mais pour les injections SQL laissez tomber mysql_real_escape_string, ça marche mais c'est qu'un Patch, tandis PDO a été développé avec cette contrainte à l'esprit.
Après html_* sont utiles pour éviter la présence de javascript et d'attaques xss via iframe ou autre AJAX.
Exemple pour PDO:
$pdo = new PDO(driver_string, user, password);
$query = "SELECT * FROM TABLE WHERE Username = :username";
$statement = $pdo ->prepare($query);
$params = Array(":username" => $_POST['username']);
$result = $statement->execute($params);
Et après pour lire les résultats: $statement->fetchAll() , fetch tout court si pas mysql.
Aussi les requêtes faites successivements pour lesquelles ont ne fait que réexecuter avec des paramètres différents vont plus vite, car elles sont d'ores et déjà: analysée, compilée et prête sur le serveur MySQL, il n'y aura plus qu'une rééxecution avec d'autres paramètres.
Tandis qu'avec les anciens: mysql_query on a à chaque coût: analyse SQL, compilation SQL, exécution SQL.