mysql_real_escape_string should be used for strings, as the name implies. For numbers, cast them to the appropriate type, or use sprintf. You could use quotes and treat them as if they were strings, and it would work with mysql_real_escape_string, but semantically that is wrong.
htmlspecialchars, which you are already using, should be sufficient as a non-destructive alternative to strip_tags. You should not use "some fancy preg_replace to remove stuff you consider bad". Rather, if you do want to remove stuff, then you should remove everything that you don't consider good.