A mio avviso il modo giusto di procedere è il seguente:
utilizzare la funzione mysqli_real_escape_string() che è la funzione apposita per eseguire l'escape delle stringhe per l'inserimento nel db. Le altre funzioni (es htmlentities() o addslashes()) non servono, almeno in questo caso.
htmlspecialchars() è utile per chi utilizza la codifica utf8 e quindi deve poter stampare stringhe provenienti da un db senza problemi, infatti tale funzione sostituisce i caratteri speciali e cioè ',", &, <, > nelle corrispondenti entità in modo che il browser non faccia confusione con gli stessi caratteri utilizzati per scrivere i tag html che formano la struttura di un documento web.
htmlentities() è utile invece per chi non utilizza la codifica utf8 ed ha quindi l'esigenza di dover convertire anche i caratteri accentati.
Ovviamente le funzioni htmlspecialchars() e htmlentities() necessitano del parametro ENT_COMPAT che indica il comportamento relativo agli apici. Comunque per ulteriori dettagli vedere la guida:
http://php.net/manual/en/function.htmlspecialchars.php
http://php.net/manual/it/function.htmlentities.php