Aqui está a regra geral.
Você quer que suas variáveis sejam representações limpas dos dados. Ou seja, se você está tentando armazenar o sobrenome de alguém chamado "O'Brien", então você definitivamente não quero estes:
O'Brien
O\'Brien
.. porque, bem, esse não é o nome dele:não há e comercial ou barras nele. Quando você pega essa variável e a exibe em um contexto específico (por exemplo:inserir em uma consulta SQL ou imprimir em uma página HTML), isso é quando você o modifica.
$name = "O'Brien";
$sql = "SELECT * FROM people "
. "WHERE lastname = '" . mysql_real_escape_string($name) . "'";
$html = "<div>Last Name: " . htmlentities($name, ENT_QUOTES) . "</div>";
Você nunca quer ter
htmlentities
-strings codificadas armazenadas em seu banco de dados. O que acontece quando você deseja gerar um CSV ou PDF, ou qualquer coisa que não seja HTML? Mantenha os dados limpos e escape apenas para o contexto específico do momento.