Зачем нужен strip_tags и real_escape_string если есть htmlspecialchars?
Потому что это совершенно разные функции, которые не имеют никакого отношения друг к другу.
Но еще со времен палеолита по похапешным скриптам кочуют плоды не приходящего в сознание индусского гения - функции "очистки" входящих параметров, куда набито всё, что по мнению автора имеет хоть какое-то отношение к безопасности. 
И при всем при этом, для входящих параметров ни одна из этих функций не нужна. 
- strip_tags это какой-то рудимент. Сейчас практически не используется. 
- real_escape_string это вообще совсем из другой оперы. к HTML никакого отношения не имеет. Причем в своей области тоже рудимент и применяться не должна. 
-  htmlspecialchars единственная осмысленная функция из всех перечилсенных. но должна применяться не для "очистки" при вводе, а при выводе пользовательских данных в HTML
strip_tags удаляет теги, htmlspecialchars  преобразует теги в HTML сущности