ceci dit, mysql_real_escape_string a exactement le même problème que la vérif à la main : le vrai bug, c'est le gars qui passe dans le code, bidouille pour tester un truc, et oublie de remettre la fonction, ou se plante en l'écrivant.
les deux solutions prepared statement et orm sont bien meilleures, puisqu'une fois qu'on prends l'habitude de les écrire de la sorte, on ne trouve plus jamais la moindre variable PHP dans les requêtes SQL.
et ça a d'autres avantages, tels que s'assurer qu'on envoie des données valides avant qu'elles ne partent vers le serveur, sans oublier que les performances sont cosnidérablement améliorée avec les prepared, puisque la requête ne sera compilée qu'une fois, quelles que soit les varibales passées en paramètres, alors que sans, elle doit être recompilée à chaque caractères qui change dans la chaîne SQL