Assurez-vous de définir le double_encode
à false
, sinon les chaînes déjà encodées seront à nouveau encodées, en tournant &
en &
. Ensuite, lorsque vous allez l'afficher après avoir utilisé html_entity_decode
, il apparaîtra comme s'il était encore encodé.
Résultat indésirable :http://ideone.com/uQxuAM
Utilisation de htmlentities($string, ENT_QUOTES, 'UTF-8', false);
veillera à ce que cela ne se produise pas.
Ensuite, utilisez html_entity_decode($string, ENT_QUOTES, 'UTF-8');
pour afficher la valeur.
Démo :http://ideone.com/8Jo7YA
Cependant, MySQL est parfaitement capable de stocker les valeurs décodées dans la base de données.
Vous ne voulez jamais que des chaînes encodées en htmlentities soient stockées dans votre base de données. Que se passe-t-il lorsque vous souhaitez générer un CSV ou un PDF, envoyer un e-mail ou tout ce qui n'est pas HTML ?
Outre le fait que vous devez doubler la programmation de l'encodage des données, augmenter la quantité de données dans la base de données, puis avoir encore besoin de décoder la sortie, il existe des tonnes d'articles en ligne expliquant pourquoi vous ne devriez pas.
Ainsi, vous ne devriez avoir besoin que d'encoder les valeurs pour afficher la sortie de données résultante en html.
Au lieu de cela, vous devez échapper l'entrée en utilisant mysqli_real_escape_string
$string = '<a href="/path/to/file?a=b&foo=bar#baz">My Link</a>';
$sql = "INSERT INTO links (link)"
. "VALUES(" . mysqli_real_escape_string($string) . "')";
ou mieux encore, utilisez des instructions préparées
$stmt = $mysqli->prepare("INSERT INTO links (link) VALUES(?)");
$stmt->bind_param("s", $string);
$stmt->execute();
Ensuite, formatez la sortie en tant que message de réussite pour afficher ce qui a été réellement ajouté à la base de données.
$html = "<div>Added Link: " . htmlentities($string, ENT_QUOTES, 'UTF-8', false) . "</div>";
Désormais, il n'est plus nécessaire d'utiliser html_entity_decode
pour que le HTML soit rendu dans le navigateur.